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双向链表实现实例代码
Nov 21 Python
python模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
python中执行shell的两种方法总结
Jan 10 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
Pytorch入门之mnist分类实例
Apr 14 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
Python实现多线程的两种方式分析
Aug 29 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
pygame实现弹球游戏
Apr 14 Python
Python内置函数property()如何使用
Sep 01 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
php 表单数据的获取代码
2009/03/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP中串行化用法示例
2016/11/16 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
浅谈MySQL中的触发器
2015/05/05 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
python tkinter窗口最大化的实现
2019/07/15 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
python如何进入交互模式
2020/07/06 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
灵泰克Java笔试题
2016/01/09 面试题
计算机专业应届生求职信
2014/04/06 职场文书
工作评语大全
2014/04/26 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
打架检讨书范文
2015/01/27 职场文书
义诊活动总结
2015/02/04 职场文书