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编程中实现迭代器的一些技巧小结
Jun 21 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
python实现windows倒计时锁屏功能
Jul 30 Python
python随机数分布random均匀分布实例
Nov 27 Python
python3 求约数的实例
Dec 05 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
python中判断数字是否为质数的实例讲解
Dec 06 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
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
python数据结构之链表详解
2017/09/12 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
详解python3中zipfile模块用法
2018/06/18 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
四风问题自查报告剖析材料
2014/02/08 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
个人安全承诺书
2014/05/22 职场文书
关于环保的活动方案
2014/08/25 职场文书
调解书格式范本
2015/05/20 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
高三数学教学反思
2016/02/18 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
OpenCV实现普通阈值
2021/11/17 Java/Android
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers