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 相关文章推荐
python实现数通设备端口监控示例
Apr 02 Python
python写的ARP攻击代码实例
Jun 04 Python
Python实现从URL地址提取文件名的方法
May 15 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
python和bash统计CPU利用率的方法
Jul 10 Python
python中文编码与json中文输出问题详解
Aug 24 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
python 3.8.3 安装配置图文教程
May 21 Python
python 匿名函数与三元运算学习笔记
Oct 23 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
php 带逗号千位符数字的处理方法
2012/01/10 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
php实现头像上传预览功能
2017/04/27 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
工厂厂长岗位职责
2013/11/08 职场文书
酒店个人求职信范文
2014/01/25 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
家长学校教学计划
2015/01/19 职场文书
土建施工员岗位职责
2015/04/11 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
HAM-2000摩机图
2021/04/22 无线电
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js