• 单词-文档矩阵

单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图1展示了其含义。图1的每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。

从纵向即文档这个维度来看,每列代表文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其它单词。从横向即单词这个维度来看,每行代表了哪些文档包含了某个单词。比如对于词汇1来说,文档1和文档4中出现过单词1,而其它文档不包含词汇1。矩阵中其它的行列也可作此种解读。
搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结构。可以有不同的方式来实现上述概念模型,比如“倒排索引”、“签名文件”、“后缀树”等方式。但是各项实验数据表明,“倒排索引”是实现单词到文档映射关系的最佳实现方式,所以本章主要介绍“倒排索引”的技术细节。

  • 倒排索引的基本概念

文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况下会使用文档来表征文本信息。
文档集合(Document Collection):由若干文档构成的集合称之为文档集合。比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。
文档编号(Document ID):在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会用DocID来便捷地代表文档编号。
单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。
倒排索引(Inverted Index):倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
关于这些概念之间的关系,通过图2可以比较清晰的看出来

  • 倒排索引简单实例

假设文档集合包含五个文档,每个文档内容如图3所示,在图中最左端一栏是每个文档对应的文档编号。我们的任务就是对这个文档集合建立倒排索引。

中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引(参考图4)。在图4中,“单词ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表。比如单词“谷歌”,其单词编号为1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词。

之所以说图4所示倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词,而事实上,索引系统还可以记录除此之外的更多信息。图5是一个相对复杂些的倒排索引,与图4的基本索引系统比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。在图5的例子里,单词“创始人”的单词编号为7,对应的倒排列表内容为:(3:1),其中的3代表文档编号为3的文档包含这个单词,数字1代表词频信息,即这个单词在3号文档中只出现过1次,其它单词对应的倒排列表所代表含义与此相同。
实用的倒排索引还可以记载更多的信息,图5所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”(对应图5的第三栏)以及在倒排列表中记录单词在某个文档出现的位置信息.

“文档频率信息”代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是非常重要的一个因子。而单词在某个文档中出现的位置信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此,因为这个信息对于搜索系统来说并非必需的,位置信息只有在支持“短语查询”的时候才能够派上用场。
以单词“拉斯”为例,其单词编号为8,文档频率为2,代表整个文档集合中有两个文档包含这个单词,对应的倒排列表为:{(3;1;<4>),(5;1;<4>)},其含义为在文档3和文档5出现过这个单词,单词频率都为1,单词“拉斯”在两个文档中的出现位置都是4,即文档中第四个单词是“拉斯”。
有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程,具体实现方案本书第五章会做详细描述。

  • 单词词典

单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表,并以此作为后续排序的基础。
对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能否快速定位某个单词,这直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找,常用的数据结构包括哈希加链表结构和树形词典结构

10 mins 搞懂“倒排索引”相关推荐

  1. 10分钟搞懂蚁群算法

    蚂蚁几乎没有视力,但他们却能够在黑暗的世界中找到食物,而且能够找到一条从洞穴到食物的最短路径.它们是如何做到的呢? 蚂蚁寻找食物的过程 单只蚂蚁的行为及其简单,行为数量在10种以内,但成千上万只蚂蚁组 ...

  2. 【时间之外】10分钟搞懂Python+Tushare+Excel股票分析

    Python+Tushare+Excel 场景和工具 不想996就多赚钱(1分钟) 需求简介(1分钟) Tushare简介(1分钟) 思路分析 三行代码取数据(2分钟) 最麻烦的一步:保存成excel ...

  3. 10道题搞懂色彩搭配的6大准则,让你的图表开口说话!

    导读:如果你有时间只专注于改进图表中的一件事,那就选择改进颜色.大多数软件无法直观地挑选与你的背景匹配的颜色. 作者:斯科特·贝里纳托(Scott Berinato) 来源:大数据DT(ID:hzda ...

  4. 程序员必备:10分钟搞懂各种编码丨另附实战案例

    背景 HTTP 协议基于文本传输,字符编码将文本变为二进制,二进制编码将二进制变为文本.TCP 协议基于二进制传输,数据读取时需要处理字节序.本文将介绍常见的字符编码.二进制编码及字节序,并一探 Go ...

  5. 10分钟搞懂:亿级用户的分布式数据存储解决方案

    分布式数据库和分布式存储是分布式系统中难度最大.挑战最大,也是最容易出问题的地方.互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入. 接下来,你将花费十分钟掌握以下三方面内容: 1 ...

  6. 10分钟搞懂:亿级用户的分布式数据存储解决方案!

    内容提供:李智慧,前阿里巴巴技术专家,<大型网站技术架构>作者6月6日晚,林志玲与Akira公布婚讯.徐蔡坤祝福高考同学超常发挥,粉丝们百万的转发和点赞造成微博短暂宕机.分布式数据库和分布 ...

  7. 10分钟搞懂区块链扩容,4个解决方案拿走不谢

    区块链的应用也正从利益驱动阶段向技术驱动阶段迈进,未来有可能变成需求驱动,实现大规模商业应用落地和社会效益,这既是全行业的期待,也是当前区块链行业发展的瓶颈. 近日,以"跨链&联盟链 ...

  8. 10分钟带你彻底搞懂微内核架构

    文章目录 十分钟搞懂系列 什么是微内核架构? 如何实现微内核架构? 总结 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.net/belon ...

  9. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

最新文章

  1. 独家 | 这15个最热门的GitHub库你不可错过!
  2. 21 week4 submit buidAndRun() node-rest-client
  3. Python入门第三章--第一节:条件判断语句
  4. HotSpot源码(一):Docker与虚拟机的区别,class字节码解析,linux内核源码下载地址,Yacc与Lex快速入门
  5. js(Dom+Bom)第七天(1)
  6. linux command1
  7. java耗时操作阻塞_spring boot高并发下耗时操作的实现方法
  8. LeetCode之翻转二叉树以匹配先序遍历
  9. SpringBoot 中使用 QuzartZ
  10. WIFI状态下SecoClient链接故障
  11. DVWA教程详细的DVWA-CSRF全等级通关教程
  12. 通达信大资金进出指标公式
  13. python怎么表达我喜欢你的句子_关于我喜欢你的优美句子
  14. 一图读懂IP数据包头结构
  15. 智能安全辅助驾驶系统 STM32——MQ3酒精传感器的应用(HAL库)
  16. ztree树与列表名字获取
  17. JSR303和拦截器
  18. java double丢失精度问题,加减乘除计算出错出现99999
  19. 小米 微信:无法连接服务器,微信出现大规模故障 多地无法登录
  20. 《CCNA学习指南:Cisco网络设备互连(ICND2)(第4版)》——1.1节理解VLAN 和VLAN Trunk 及排除相关故障...

热门文章

  1. django 视图模式
  2. 设计模式(二十三)—— 模板方法
  3. TCP/IP详解 学习三
  4. request.getAttribute()和request.getParameter()区别
  5. Synology DS213J 群晖NAS git server架设方法!
  6. PHP中Foreach在引用时的陷阱
  7. (转)gcc 的简单使用说明
  8. LCA SP913 QTREE2 - Query on a tree II
  9. Spring Boot官网概述
  10. Problem C: 爬楼梯