第7天: NLP——倒排表

引言

  我们在上次介绍搭建一个智能客服系统的时候,曾经提到过得有一个语料库,这个语料库包括问题和相应的答案。当我们提出一个问题的时候,我们应该根据用户提出的问题,然后在知识库里找相关的问题以及返回概率最高的答案给用户。这里有一个关键性的问题:假设我们知识库里有n个的问题,我们需要计算n次的相似度。如果我们查询每一个问题,则需要的时间复杂度为:O(N)*O(每次计算相似度所用的复杂度)。这对于我们计算机来说,是一个非常庞大复杂度。那么我们如何降低复杂度呢?其核心的思路为“层次过滤思想”。
  具体来说:层次过滤思想的基本思路就是将所要分析的问题2113层次化;根据问题的性质和所要达成的总目标,将问题5261分解为不同的组成因素,并按照这些因素间的关4102联影响及其隶属关系,将因素按不同层次凝聚组合,形成1653一个多层次分析结构模型;最后,对问题进行优劣比较并排列。也就是说,我们可以通过层层过滤掉那些不相关的问题与答案,最后留下少部分的相关问题与答案,尽可能的降低其相似度的计算次数。但是需要注意的是:要用该思想,**复杂度必须要满足从简单到复杂的顺序。**具体我们应该如何去实现这个过滤器呢?这就引进一种特别经典的算法——倒排列表。接下来我们详细介绍倒排列表的思想。

倒排列表

  在搜索引擎中有每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID)。例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数和出现位置。得到正向索引的结构如下:
1、“文档1”的ID > 单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表;…………。
2、 “文档2”的ID > 此文档出现的关键词列表。
正排列表
  这里需要注意的是:**一般是通过key,去找value。**但是假设用户在主页上搜索关键词“华为手机”时,假设只存在正向索引(forward index),那么就需要扫描索引库中的所有文档,找出所有包含关键词“华为手机”的文档,再根据打分模型进行打分,排出名次后呈现给用户。因为互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。所以,搜索引擎会将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词。 得到倒排索引的结构如下:
1、 “关键词1”:“文档1”的ID,“文档2”的ID,…………。
2、“关键词2”:带有此关键词的文档ID列表。
倒序索引
  这里与正向索引刚好相反,从词的关键字,去找文档。

一、倒排索引基本概念

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

二、倒排索引简单应用

  假设文档集合包含五个文档,每个文档内容如图3所示,在图中最左端一栏是每个文档对应的文档编号。我们的任务就是对这个文档集合建立倒排索引。
文档表
  中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引(参考图3-4)。在图4中,“单词ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表。比如单词“谷歌”,其单词编号为1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词。
英文
  之所以说图4所示倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词,而事实上,索引系统还可以记录除此之外的更多信息。图5是一个相对复杂些的倒排索引,与图4的基本索引系统比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。在图5的例子里,单词“创始人”的单词编号为7,对应的倒排列表内容为:(3:1),其中的3代表文档编号为3的文档包含这个单词,数字1代表词频信息,即这个单词在3号文档中只出现过1次,其它单词对应的倒排列表所代表含义与此相同。
排序
  实用的倒排索引还可以记载更多的信息,图6所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”(对应图6的第三栏)以及在倒排列表中记录单词在某个文档出现的位置信息。
英文排序
  “文档频率信息”代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是非常重要的一个因子。而单词在某个文档中出现的位置信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此,因为这个信息对于搜索系统来说并非必需的,位置信息只有在支持“短语查询”的时候才能够派上用场。
  以单词“拉斯”为例,其单词编号为8,文档频率为2,代表整个文档集合中有两个文档包含这个单词,对应的倒排列表为:{(3;1;<4>),(5;1;<4>)},其含义为在文档3和文档5出现过这个单词,单词频率都为1,单词“拉斯”在两个文档中的出现位置都是4,即文档中第四个单词是“拉斯”。图上图所示倒排索引已经是一个非常完备的索引系统,实际搜索系统的索引结构基本如此,区别无非是采取哪些具体的数据结构来实现上述逻辑结构。
  有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程,具体实现方案本书第五章会做详细描述。

总结

  通过降低时间复杂度这一核心问题的引入,我们给大家介绍了一个核心的思想:层次过滤思想。通过对层次过滤思想的相关操作的介绍,这里需要注意的是该思想需要我们用的时候遵循一个前天条件——从上到下必须遵循由简到烦的复杂度。接着,我们又引入了实现过滤的方式——倒排列表,在这介绍时,我们还介绍了正排列表以及其存在的不足,后面有介绍了到排列表的相关概念以及各个概念之间的关系。最后还通过一个案例将其实现过程进行了说明。总之,我们有时间就要学习,不断提高自己的综合能力。

参考文献

什么是倒排索引?

猜你喜欢

转载自blog.csdn.net/Oliverfly1/article/details/106554738
今日推荐