文章目录

  • 一.信息检索方式
    • (1)线性扫描
    • (2)词项—文档关联矩阵
    • (3)倒排索引
  • 二.倒排索引实现及常用语料处理方式
    • (1) 实现目标
    • (2) 完整代码
    • (3) 运行结果

一.信息检索方式

(1)线性扫描

计算机对于文档内容检索有多种可能的方式,如直接从头遍历至尾端,根据我们输入的关键词提取内容。

这类检索方式与我们人类阅读的习惯相同,因此实现简单且很容易被接受。

若问你《三国演义》中是否存在’舌战群儒’这一词语,我们常常会选择浏览全文从中找出匹配的词语。

而从《三国演义》中提取出关键词 , 通过现代计算机不会花费太长时间;

但假如目标是世界文学合集呢?企业一年的财务报告呢?又或者是现代信息世界产生的规模更大的文档集。

尽管计算机算力强大,线性扫描的信息检索方式也仅仅只能够用于处理小文本。

(2)词项—文档关联矩阵

于是产生了词项—文档关联矩阵,我们利用空闲的算力,在计算机内部提前构建矩阵。

三国演义 红楼梦 水浒传 西游记 悟空传
孙悟空 0 0 0 1 1
贾宝玉 0 1 0 0 0

当我们输入关键词孙悟空时,将《西游记》《悟空传》两个文档作为结果返回。

这样的方式大大提高了检索速度

词项是索引的单位 而文档则是返回的结果。

从行来看,能够得到对应词项的文档向量;从列来看,则获取文档的词项向量。

当然这类方式也存在较大的不足 如上述我所举例的表格 能够看见矩阵中0值占比极高

在造成负担的同时 也极大地减缓了检索速度。

(3)倒排索引

对数据结构有一定涉猎的同学应该很快就能想到优化方式——稀疏数组。

我们建立词项词典与倒排记录表 从而完成对文档的高效检索。

词项词典 倒排记录表
孙悟空 4—>5
贾宝玉 2

倒排索引的两个部分。词典部分往往放在内存中,而指针指向的每个倒排记录表则往往存放在磁盘上。

二.倒排索引实现及常用语料处理方式

(1) 实现目标

读取文本文件 对不同的单行文档 进行词条化及归一化,

关注标点符号的去重 停用词的筛选以及大小写的转化。

建立倒排索引/词项字典。

(2) 完整代码

 import reimport stringfrom stop_words import get_stop_wordsfrom nltk.stem.porter import PorterStemmer# 列表去重def unique(word_list):return list(dict.fromkeys(word_list))# 移除停用词def stop_word(token):en_stop = get_stop_words('en')stopped_tokens = [i for i in token if i not in en_stop]return stopped_tokens# 词干提取def stem_extracting(stopped_tokens):p_stemmer = PorterStemmer()texts = [p_stemmer.stem(i) for i in stopped_tokens]return texts# Porter stemmer 并不是要把单词变为规范的那种原来的样子,# 它只是把很多基于这个单词的变种变为某一种形式!换句话说,# 它不能保证还原到单词的原本,也就是"created"不一定能还原到"create",# 但却可以使"create" 和 "created" ,都得到"creat" !def incidence_matrix(text, docID):# 目的:# 传入一段文本及其文档号# 获取其词项列表# 1.清除英文标点符号punctuation_string = string.punctuationlines = re.sub('[{}]'.format(punctuation_string), " ", text)# 2.将英文文本内容切片lsplit = lines.split()# 3.大小写转换for num in range(len(lsplit)):lsplit[num] = lsplit[num].lower()# 4.移除停用词 词干提取# lsplit = stem_extracting(stop_word(lsplit))# 5.去重并转字典lsplit_dic = dict.fromkeys(lsplit)# 6.记录文档号for word in lsplit_dic.keys():lsplit_dic[word] = [docID]return lsplit_dicdef read_file(filename):result = {}count = 0with open(filename, 'r') as file_to_read:# 以只读形式打开该文件while True:# 以行为单位进行读取lines = file_to_read.readline()# 当某行内容为空时 停止读取if len(lines) == 0:breakcount = count + 1lsplot = incidence_matrix(lines, count)result = dic_zip(result, lsplot)# 关闭文件读取file_to_read.close()return resultdef dic_sort(a_dic):b_dic = dict.fromkeys(sorted(a_dic))for word in b_dic.keys():b_dic[word] = a_dic[word]return b_dic# 不同文档字典 同一词项合并def dic_zip(a_dic, b_dic):# 将b_dic并入a_dic中for word in b_dic.keys():if a_dic.get(word, None):a_dic[word].extend(b_dic[word])else:a_dic[word] = b_dic[word]return a_dicdef show_dic(a_dic):# 文档频率可用于做查询优化tplt = "{0:^10}\t{1:{3}^10}\t{2:^40}"print(tplt.format("词项", "文档频率", "倒排记录", chr(12288)))for word in a_dic.keys():print(tplt.format(word, len(a_dic[word]), str(a_dic[word]), chr(12288)))def main():# 读取filename下的英文文本文件 将每一行作为单独的文本# 建立倒排索引。filename = './Reverse_Index_Word2.txt'matrix = dic_sort(read_file(filename=filename))show_dic(matrix)if __name__ == '__main__':main()

(3) 运行结果

可以读取更大规模的文档,此处选取小文本是为了便于展示。

归一化的处理被我注释掉了 需要时可以删除#符号。

 #读入的文档new home sales top forecastshome sales rise in julyincrease in home sales in julyjuly new home sales rise# 运行结果"D:\Program Files\Python\python.exe" 词项        文档频率                     倒排记录                  forecasts       1                         [1]                   home         4                     [1, 2, 3, 4]              in          2                        [2, 3]                 increase       1                         [3]                   july         3                      [2, 3, 4]                new          2                        [1, 4]                 rise         2                        [2, 4]                 sales         4                     [1, 2, 3, 4]              top          1                         [1]                   Process finished with exit code 0

搜索引擎:常用信息检索方式介绍与倒排索引实现(Python)相关推荐

  1. 开发自己的搜索引擎读书笔记——搜索引擎与信息检索、Lucene入门

    这部分是在读<开发自己的搜索引擎>第二版,邱哲.符滔滔.王学松编著,人民邮电出版社,的随手笔记与猜想.若有不足之处还请不吝赐教,以不断完善之. 搜索引擎与信息检索 信息检索的过程: 构建文 ...

  2. Maven实战——常用Maven插件介绍

    http://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任 ...

  3. 常用Maven插件介绍(下)(转)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  4. Linux网络常用工具分类介绍

    Linux网络命令较多,单纯的介绍网络命令的用法也没什么意思.本文将常见的网络命令进行分类,并做出思维导图,对每个分类的命令选择性的介绍其作用.常见选项和用法举例.BTW,不建议记住所有命令,了解一下 ...

  5. 树莓派wiringPi常用的函数介绍

    树莓派wiringPi常用的函数介绍 硬件初始化函数: int wiringPiSetup (void) 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表,引脚的编号为 0~ ...

  6. python-django-ORM,常用查询方式

    介绍django model 的一些常用查询方式 首先是一些文档性的帮助 __exact 精确等于 like 'aaa' __iexact 精确等于 忽略大小写 ilike 'aaa' __conta ...

  7. oracle循环的方式,Oracle 的几种循环方式介绍

    1 Oracle 中的Goto 用法: declare x number; begin x:=10; --定义的初始值 <> --循环点 x:= x-2; -- 循环的处理条件 dbms_ ...

  8. HDFS命令行客户端使用,命令行客户端支持的命令参数,常用命令参数介绍

    3.HDFS的shell(命令行客户端)操作 3.1 HDFS命令行客户端使用 HDFS提供shell命令行客户端,使用方法如下: [toto@hadoop hadoop-2.8.0]$ hdfs d ...

  9. Java常用日志框架介绍

    Java常用日志框架介绍 文章目录 Java常用日志框架介绍 日志接口和日志框架的区别 各个框架出现的时间线 桥接包 Log4j2 常用搭配 单独的log4j 使用JCL(commons-loggin ...

  10. [转载]常用CASE工具介绍

    [转载]常用CASE工具介绍 转载自:http://www.cnblogs.com/powerlc/archive/2006/01/12/315959.html   一,概述 今天, 代码变得日益简单 ...

最新文章

  1. Ubuntu局域网下利用client联网
  2. base64编码的学习和理解
  3. 基于Boost::beast模块的协程HTTP服务器
  4. char数组转string_String类和其它数据类型的相互转换
  5. oracle归档日志的概念,浅谈Oracle归档日志
  6. python弹窗输入_Python中使用tkinter弹窗获取输入文本
  7. 【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法...
  8. 网页视频html转换ppt,ppt转web ppt可以转换为视频文件?
  9. html转换txt文件,HTML网页转TXT文件、文本转换器_TxtEasy! V1.5.5 免费版
  10. 远程桌面工具TeamViewer模块之顶部菜单
  11. 人工智能优缺点_人工智能的优缺点
  12. 蓝桥杯算法竞赛培训(二) 汉诺塔与STL
  13. 阿里云CTO章文嵩:阿里云强大的数据和计算能力助力企业实现“弯道超车”
  14. 【将门创投】这12张图生动地告诉你,深度学习中的卷积网络是怎么一回事?...
  15. trove mysql 镜像_openstack trove 数据库镜像构建列表
  16. 发布了每日一文应用,每日一文,每天阅读,简单生活。每天精选一篇不同的文章,也可以随机阅读往日精选文章...
  17. 查看全文的css,如何通过纯CSS实现“点击展开全文”功能
  18. 三极管工作原理分析!精辟、透彻
  19. 解决ps默认打开显卡的设置
  20. Win7(Win2003)下安装Node.js(版本号:v0.11.0)提供下载

热门文章

  1. MSF之persistence权限维持
  2. 小柯在学JAVA之第二弹
  3. python 自动打包pyd
  4. Python绘制漫天的雪花,漫步天涯
  5. 王垠:怎样尊重一个程序员
  6. 降维打击(序列化)的流行手段
  7. nagios的原理及server端跟client端安装配置全部过程
  8. Ambisonics解释:声音工程师指南
  9. 如何在PPT中设置选择题
  10. effective c++读书随记