python 全文检索引擎详解


Posted in Python onApril 25, 2017

python 全文检索引擎详解

最近一直在探索着如何用Python实现像百度那样的关键词检索功能。说起关键词检索,我们会不由自主地联想到正则表达式。正则表达式是所有检索的基础,python中有个re类,是专门用于正则匹配。然而,光光是正则表达式是不能很好实现检索功能的。

python有一个whoosh包,是专门用于全文搜索引擎。

whoosh在国内使用的比较少,而它的性能还没有sphinx/coreseek成熟,不过不同于前者,这是一个纯python库,对python的爱好者更为方便使用。具体的代码如下

安装

输入命令行 pip install whoosh

需要导入的包有:

fromwhoosh.index import create_in

fromwhoosh.fields import *

fromwhoosh.analysis import RegexAnalyzer

fromwhoosh.analysis import Tokenizer,Token

中文分词解析器

class ChineseTokenizer(Tokenizer):
  """
  中文分词解析器
  """
  def __call__(self, value, positions=False, chars=False,
         keeporiginal=True, removestops=True, start_pos=0, start_char=0,
         mode='', **kwargs):
    assert isinstance(value, text_type), "%r is not unicode "% value
    t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs)
    list_seg = jieba.cut_for_search(value)
    for w in list_seg:
      t.original = t.text = w
      t.boost = 0.5
      if positions:
        t.pos = start_pos + value.find(w)
      if chars:
        t.startchar = start_char + value.find(w)
        t.endchar = start_char + value.find(w) + len(w)
      yield t


def chinese_analyzer():
  return ChineseTokenizer()

构建索引的函数

@staticmethod
  def create_index(document_dir):
    analyzer = chinese_analyzer()
    schema = Schema(titel=TEXT(stored=True, analyzer=analyzer), path=ID(stored=True),
            content=TEXT(stored=True, analyzer=analyzer))
    ix = create_in("./", schema)
    writer = ix.writer()
    for parents, dirnames, filenames in os.walk(document_dir):
      for filename in filenames:
        title = filename.replace(".txt", "").decode('utf8')
        print title
        content = open(document_dir + '/' + filename, 'r').read().decode('utf-8')
        path = u"/b"
        writer.add_document(titel=title, path=path, content=content)
    writer.commit()

检索函数

@staticmethod
  def search(search_str):
    title_list = []
    print 'here'
    ix = open_dir("./")
    searcher = ix.searcher()
    print search_str,type(search_str)
    results = searcher.find("content", search_str)
    for hit in results:
      print hit['titel']
      print hit.score
      print hit.highlights("content", top=10)
      title_list.append(hit['titel'])
    print 'tt',title_list
    return title_list

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
使用cx_freeze把python打包exe示例
Jan 24 Python
Python+django实现文件上传
Jan 17 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
python的变量与赋值详细分析
Nov 08 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
python制作朋友圈九宫格图片
Nov 03 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
flask项目集成swagger的方法
Dec 09 Python
Flask处理Web表单的实现方法
Jan 31 Python
window下eclipse安装python插件教程
Apr 24 #Python
Python处理PDF及生成多层PDF实例代码
Apr 24 #Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 #Python
python爬虫实战之爬取京东商城实例教程
Apr 24 #Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 #Python
Python面向对象特殊成员
Apr 24 #Python
Python解惑之整数比较详解
Apr 24 #Python
You might like
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
python使用arp欺骗伪造网关的方法
2015/04/24 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
python opencv实现运动检测
2018/07/10 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
python 有效的括号的实现代码示例
2019/11/11 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
Python类的动态绑定实现原理
2020/03/21 Python
python爬虫容易学吗
2020/06/02 Python
百度软件工程师职位
2013/02/14 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
绿色城市实施方案
2014/03/19 职场文书
家长对老师的评语
2014/04/18 职场文书
广播节目策划方案
2014/05/23 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
学生检讨书如何写
2014/10/30 职场文书
优秀护士事迹材料
2014/12/25 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
道士塔读书笔记
2015/06/30 职场文书
Mysql排序的特性详情
2021/11/01 MySQL
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android