倒排文件索引(Inverted File Index)

倒排文件是一种在各大搜索引擎中被主要使用的索引的方式,并且它也是搜索引擎中一个核心的技术。

一个典型的倒排索引主要由词汇表(也叫索引项)和事件表(也叫文件链表)两部分组成。词汇表是用来存放分词词典的,通常称存放词汇表的文件为索引文件;事件表是用来存放这个文件中对应词汇表中词汇出现的位置和次数的,通常称存放出现位置的文件为位置文件。yi

一,基本概念:

DefinitionIndex is a mechanism for locating a given term in a text.

DefinitionInverted file contains a list of pointers (e.g. the number of a page) to all occurrences of that term in the text.(

Inverted because it lists for a term, all documents that contain the term)




文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况下会使用文档来表征文本信息。

文档集合(Document Collection):由若干文档构成的集合称之为文档集合。比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。

文档编号(Document ID):在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会用DocID来便捷地代表文档编号。

单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。

倒排索引(Inverted Index)倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”

       单词词典:搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

        倒排列表(PostingList)倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。

      倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。


二,单词词典的实现方式:


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

        主体部分是哈希表,每个哈希表项保存一个指针,指针指向冲突链表,在冲突链表里,相同哈希值的单词形成链表结构。之所以会有冲突链表,是因为两个不同单词获得相同的哈希值,如果是这样,在哈希方法里被称做是一次冲突,可以将相同哈希值的单词存储在链表里,以供后续查找。
                       

                        图1-7  哈希加链表词典结构
       在建立索引的过程中,词典结构也会相应地被构建出来。比如在解析一个新文档的时候,对于某个在文档中出现的单词T,首先利用哈希函数获得其哈希值,之后根据哈希值对应的哈希表项读取其中保存的指针,就找到了对应的冲突链表。如果冲突链表里已经存在这个单词,说明单词在之前解析的文档里已经出现过。如果在冲突链表里没有发现这个单词,说明该单词是首次碰到,则将其加入冲突链表里。通过这种方式,当文档集合内所有文档解析完毕时,相应的词典结构也就建立起来了。

        在响应用户查询请求时,其过程与建立词典类似,不同点在于即使词典里没出现过某个单词,也不会添加到词典内。以图1-7为例,假设用户输入的查询请求为单词3,对这个单词进行哈希,定位到哈希表内的2号槽,从其保留的指针可以获得冲突链表,依次将单词3和冲突链表内的单词比较,发现单词3在冲突链表内,于是找到这个单词,之后可以读出这个单词对应的倒排列表来进行后续的工作,如果没有找到这个单词,说明文档集合内没有任何文档包含单词,则搜索结果为空。

2   树形结构
       B树(或者B+树)是另外一种高效查找结构,图1-8是一个 B树结构示意图。B树与哈希方式查找不同,需要字典项能够按照大小排序(数字或者字符序),而哈希方式则无须数据满足此项要求。
       B树形成了层级查找结构,中间节点用于指出一定顺序范围的词典项目存储在哪个子树中,起到根据词典项比较大小进行导航的作用,最底层的叶子节点存储单词的地址信息,根据这个地址就可以提取出单词字符串。
                  
                                           图1-8  B树查找结构 


三,索引实现过程---Index Generator


<span style="font-size:14px;">while ( <strong>read a document D</strong> ) {
    while ( <strong>read a term T in D</strong> ) {//stop filter
        if ( <strong>Find( Dictionary, T ) == false </strong>)  //vocabulary scanner
            <strong>Insert( Dictionary, T )</strong>;//vocabulary insertor
        Get T’s posting list;
        Insert a node to T’s posting list;
    }
}
<strong>Write the inverted index to disk;</strong></span>


注意while reading a term

1.Process a word so that only itsstem or root form is left.

2.Some words are so common thatalmost every document contains them, such as “a” “the” “it”.  It is useless to index them.  They are called stopwords. We can eliminate them from the original documents.


四,关于内存的Possible problems and solution:

while not having enough memory:

Sol-1:Distributed indexing (for web-scale indexing)--Each node contains index of a subset ofcollection---many computer work together


Sol-2:Dynamic indexing:Docs come in over time - postings updates for terms already in dictionary  - new terms added to dictionary



  

sol-3 improve memory untilizaiton:--compression: 将空格去除,将词汇表线性存储,记录每个单词首字母位置差序列。




五,性能--Measurement:

Relevance measurement requires 3 elements:

1. A benchmark document collection
2. A benchmark suite of queries
3. A binary assessment of either Relevant or Irrelevant for each query-doc pair

Recall and Precision:

先看下面这张图来理解了,后面再具体分析。下面用P代表Precision,R代表Recall

通俗的讲,Precision 就是检索出来的条目中(比如网页)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了。

 

下面这张图介绍True Positive,False Negative等常见的概念,P和R也往往和它们联系起来。

 

我们当然希望检索的结果P越高越好,R也越高越好,但事实上这两者在某些情况下是矛盾的。比如极端情况下,我们只搜出了一个结果,且是准确的,那么P就是100%,但是R就很低;而如果我们把所有结果都返回,那么必然R是100%,但是P很低。

因此在不同的场合中需要自己判断希望P比较高还是R比较高。如果是做实验研究,可以绘制Precision-Recall曲线来帮助分析(我应该会在以后介绍)。


F Measure

前面已经讲了,P和R指标有的时候是矛盾的,那么有没有办法综合考虑他们呢?我想方法肯定是有很多的,最常见的方法应该就是F Measure了,有些地方也叫做F Score,都是一样的。

F Measure 是Precision和Recall加权调和平均:

  

F1-Measure

  当参数β=1时,就是最常见的F1-Measure了:

  F1 = 2P*R / (P+R)




展开阅读全文

没有更多推荐了,返回首页