众所周知,“索引”是搜索引擎中最重要的核心技术之一,是“缩小搜索范围,以提高结果定位效率”的技术担当。

按照不同划分标准,索引有多种分类方式,仅常用类型也不止4种之多,而其中最为关键的则是“倒排索引”技术。

本文就是一篇,介绍“倒排索引创建方法”的文章。

一、相关概念及术语

单词—文档矩阵

表达两者包含关系的概念模型;

文档

文本形式的存储对象,包括Word、PDF、html、XML等不同格式的文件,以及短信、微博等内容;

文档集合

若干文档的集合,如海量网页、大量电子邮件等;

文档编号

搜索引擎内部的文档集合中,每个文档所被赋予的区别于其他文档的唯一的内部编号,常用DocID表示;

单词

搜索引擎的索引单位;

单词词典

文档集合中出现过的所有单词构成的字符串集合;记载着某个单词对应的倒排列表在倒排文件中的位置信息;

单词编号

搜索引擎内部的单词词典中,每个单词所被赋予的区别于其他单词的唯一内部编号;

倒排列表

记载“出现过某个单词的所有文档列表”及“文档中单词位置信息”的倒排项的集合;

倒排文件

顺序存储所有单词的倒排列表的物理文件;

倒排索引

由单词词典和倒排文件组成的,实现单词—文档矩阵的一种具体存储形式,是单词到文档映射关系的最佳实现方式(可以根据单词快速获取包含该单词的文档列表)。

倒排索引概念图

比如,针对如下文档集合

文档集合

建立倒排索引的步骤:

1、用分词系统将文档自动切分成单词序列,每个文档就转换为由单词序列构成的数据流;

2、对每个不同单词赋予唯一的单词编号(ID),并记录每个单词对应的文档频率(文档集合中,包含某个单词的文档数量,占文档总数量的比率)、包含该单词的对应文档编号(DocID)、该单词在各对应文档中的词频(TF)(在某个文档中出现的次数)、该单词出现在某个文档中的位置(POS)等;

3、得到的倒排索引结果如下:

倒排索引

含义解读:以单词“跳槽”为例,其单词编号为4,文档频率为2,代表整个文档集合中有两个文档包含这个单词,对应的倒排列表为{(1;1;<4>),(4;1;<4>)},其含义为在文档1和文档4中出现过这个单词,单词频率都为1,单词“跳槽”出现在两个文档中的位置都是4,即文档中第四个单词是“跳槽”。

二、单词词典 & 倒排列表

单词词典

记载着某个单词对应的倒排列表在倒排文件中的位置信息,支持搜索中基于查询词的倒排列表呈现。

对于包含成千上万个单词的大文档集合来说,需要“基于高效数据结构”的词典构建和查找方式,“哈希加链表”和“树形词典”就是这类数据结构的代表。

A. 哈希加链表词典结构

哈希加链表:由“哈希表”及“冲突链表”组成,其中哈希表是主体。每个哈希表保存一个指针,指向冲突链表;每个冲突链表,由相同哈希值的单词组成;而有相同哈希值的一组单词,被称作一次冲突。

词典建立过程:首先,对解析新文档过程中出现的单词T,利用哈希函数获得哈希值;然后,根据哈希值,读取对应的哈希表中的指针,并根据指针指向找到对应的冲突链表,而对冲突链表中不存在的单词,将其作为首次出现单词做“加入冲突链表”处理。随着文档解析完毕,相应的词典便构建起来。

查询响应过程:与词典建立过程类似,区别在于,对于词典中未包含单词不做添加处理。

B. 树形词典结构

树形词典结构(又叫B树或B+树),由中间节点和最底层叶子节点构成,是一种高效的层级查询结构。

它需要字典项按照大小排序,中间节点指出一定顺序范围的词典项目存储在哪个子树中,根据词典项比较大小进行导航;最底层叶子节点存储单词地址信息,根据地址便可以提取单词字符串。

倒排列表

我们上面讲了,倒排列表是倒排索引项(“某个单词-文档”的一维矩阵)的集合,存储着所有单词,及包含每个单词的相关文档编号、词频、位置等信息。

而在实际搜索引擎中,为了便于压缩,常以文档编号差值(D-Gap)(倒排列表中相邻两个倒排索引项文档编号的差值)取代实际的文档编号,以保证倒排列表中后出现文档编号大于前者。因此,文档编号差值常是大于0的整数,比如,对应原始文档编号 187、196、199,其编号差值可能为 187、9、3。

三、倒排索引创建方法

1、两遍文档遍历法

两遍文档遍历,即为两遍文档扫描,创建过程完全依赖在内存中进行。

第一遍文档遍历

第一遍扫描旨有两个作用:首先,获取全局的统计数据(文档集合包含的文档个数N,文档集合包含的不同单词个数M、每个单词在多少个文档中出现过的信息DF、所有单词DF值相加得到的所需内存大小),据以分配存储空间;其次,建立单词对应倒排列表在内存中的位置信息(根据每个单词的DF值,将存储区划分成不同大小的片段,不同的单词通过指针对应着其所属内存片段的起始和终止位置)。

第一遍扫描之后,便为第二次扫描做好了资源准备工作。

第二遍文档遍历

第二遍文档遍历正式建立每个单词的倒排列表信息,扫描结束的同时,所分配的内存空间也正好被填满。每个单词对应的内存片段,此时已被创建成该单词的倒排列表。

两遍扫描,便可完成索引建立,并将内存的倒排列表和词典信息写入磁盘。

优缺点:完全依赖内存,要求内存空间足够大;从磁盘读取和解析文档耗时较长,速度慢。

2、排序法

一种“在索引建立过程中,始终在内存分配固定大小的空间,用来存放词典信息和索引中间结果,当分配空间被消耗殆尽,把中间结果写入磁盘,并清空内存做新一轮中间索引存储”的方法,是两遍遍历索引的改进。

中间结果内存排序

a.读入文档,赋予唯一的文档ID;

b.解析文档内容,赋予文档中出现的单词以唯一的单词ID(首次出现的单词,赋予ID后做插入处理);

c.为每个单词建立包含“单词ID”、“文档ID”、”单词频率”信息的倒排列表项,并将其追加进中间结果存储区末尾;对所有文档依次做以上处理,直到所有文档被处理完毕。

d.随着存储中间结果的内存被逐渐占满,对三元组中间结果进行排序,将各单词对应的倒排索引项变成有序形式,并将排好序的倒排列表写入磁盘。排序原则:主键是单词ID,即先按单词ID从小到大排序;次键是文档ID, 即相同单词ID下,按文档ID从小到大排序。

e.循环以上处理过程,待所有文档被处理完毕,合并磁盘中每轮产生的中间结果文件。

中间结果文件合并

将存放中间结果的各缓冲区的有序数据,按单词ID顺序合并形成倒排列表写入最终索引,同时清空各缓冲区并进行新一轮三元组读入操作,待所有中间结果文件被读入缓冲区合并完成,最终索引文件便得以生成。

优缺点:只对中间结果做写入磁盘操作,词典信息始终在内存中维护,随着内存被不断占用,后续中间结果可用内存会越来越少。

3、归并法

归并法,是排序法的改进,每次将内存数据写入磁盘时,包括词典在内的中间结果信息也被写入磁盘,以达到清空内存并为后续处理建立定额内存的目的。

子倒排索引

对目前所处理的文档子集单独在内存中建立一整套的倒排索引;

将倒排索引写入临时文件

内存被占满时,按照“词典在前,倒排列表在后”的顺序,将已建立的一整套倒排索引写入临时文件,并清空内存。

合并部分倒排列表

合并每个单词对应的部分倒排列表,形成单词的最终倒排列表;同时,在合并过程中形成最终的词典。

python用字典实现倒排索引_一文掌握“倒排索引”创建方法相关推荐

  1. python怎么复数乘方开方_【文末包邮送书】运维必须掌握的 Python 宝典:值得每天复习一遍...

    加群交流在后台回复"加群",添加小编微信,小编拉你进去后台回复"724"获取入门资料 前言 本文旨在更好地总结 Python 基础知识,力求简明扼要,以供实战演 ...

  2. python根据字典绘制条形图_使用 Bokeh 为你的 Python 绘图添加交互性 | Linux 中国

    本文字数:5051,阅读时长大约:6分钟导读:在 Bokeh 中绘图比其他一些绘图库要复杂一些,但付出额外的努力是有回报的.https://linux.cn/article-12329-1.html作 ...

  3. python 分词字典的词性_自然语言处理基础技术之分词、向量化、词性标注

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:段石石 前言 前段时间,因为项目需求, 开始接触了NLP,有感自己不是科班出身,很多东西理解不深,于是花时间再读了一些NLP的经典教程的 ...

  4. 做python项目需要知道什么_一文带你了解python是什么?能做什么?为什么要学?(文末附学习资源)...

    什么是 Python? Python 是一门流行的编程语言.它由 Guido van Rossum 创建,于 1991 年发布. 它用于:1.Web 开发(服务器端) 2.软件开发 3.数学 4.系统 ...

  5. python列表字典如何提取_怎么提取字典里面的列表里面的字典的value

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是个股票龙虎榜的字典,怎么提取出来证券营业部? {'detail': {'symbol': 'SH600139', 'name': '西部资源', 't ...

  6. python中字典的索引_按索引访问Python字典的元素

    正如我注意到您的描述一样,您只知道解析器会给您一个字典,它的值也是字典,如下所示:sampleDict = { "key1": {"key10": " ...

  7. python面向对象编程指南 豆瓣_一文看懂Python面向对象编程(Python学习与新手入门必看)-绝对原创...

    尽管网上有许多关于Python面向对像的编程介绍,小编我看完后总觉得不是很满意,也不过瘾,所以决定自己亲自动手写篇文章,帮你理解Python面向对象的编程的基本概念和核心思想.本文内含很多实例代码,以 ...

  8. python求字典的平均值_获取字典列表中值的平均值

    我必须创建一个名为read_data的函数,该函数将文件名作为其唯一参数.然后,此函数必须使用给定名称打开文件并返回字典,其中的键是文件中的位置名称,值是读数列表. 第一个函数的结果起作用并显示: { ...

  9. python把字典保存到文件_将Python字典保存到文件中,并定期更新它

    我觉得这是一个非常简单的问题,这里有很多类似的问题,但我还是不知道如何得到我想要的.我正在使用远程设备,当它们联机时可以连接到它们.我想要一个记录设备最近正常运行时间的文件,如下所示:# device ...

最新文章

  1. 路由器级联后网速慢的原因分析和问题解决
  2. linux telnet localhost 25,telnet localhost 25 没反应. 大家帮忙看下什么问题...
  3. 回顾 | Apache Flink 1.13 新版本 x 互娱实践分享 Meetup · 北京站精彩回顾 (附 PPT 下载)
  4. flutter scrollview_简单易上手的Flutter学习指南App,2020一起来玩转Flutter吧~
  5. android 高德获取省市,高德地图定位获取当前地址城市街道等详细信息(全部代码)...
  6. WPF触发器(Trigger、DataTrigger、EventTrigger)
  7. oracle下载安装教程
  8. Python win32com模块安装
  9. 计算机仿真软件在医疗应用,医学虚拟仿真应用介绍
  10. python 开发微信小游戏_Python实现微信找茬小游戏自动进行
  11. app客户端上传图片实现方式
  12. Caffe2新增RNN支持
  13. 抖音招商团长怎么做?怎么入驻?
  14. Mysql创建用户与赋权限操作
  15. 数据库系统,数据库,数据库管理系统
  16. 对端口Com1的访问被拒绝
  17. 计算机等级怎么查ip地址,ip查地址方法是什么【图文教程】
  18. 大四阶段的社会实践的主要目的是_大四寒假社会实践报告
  19. 声纳--成像声呐目标检测与跟踪技术研究 ---15年,哈工程,博士毕业论文
  20. ios按钮点击实现android反馈,iOS开发APP内部实现点击按钮切换语言

热门文章

  1. Notes of CFA Level1 READING 8:STATISTICAL CONCEPTS AND MARKET RETURNS
  2. linux信号之SIGBUS,SIGEMT,SIGFPE,SIGILL等
  3. Android中,字体大小自适应不同分辨率,以及注意事项
  4. cad中简单流程图制作,cad流程图制作教程
  5. python3.9下载_Python-3.9下载_Python下载_Python最新版_5分享
  6. 装mysql电脑网卡不见了_详细教你解决电脑本地连接不见了
  7. 股票交易接口 Python中安装并导入pandas
  8. ORA-942 SP2-0611
  9. 推荐系统学习笔记——特征工程
  10. 超级淘推出“翻牌子”活动,为会员送百万福利