信息检索导论第四章-索引构建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010772289/article/details/78937994

第四章 索引构建

我们将建立倒排索引的过程称为索引构建。

4.1 硬件基础

构建信息检索系统时,很多决策都和系统硬件环境有关。

  • 访问内存数据比访问硬盘数据快得多,因此,我们要尽可能将数据放在内存中,尤其是访问频繁的数据。
    这种将频繁访问的磁盘数据放到内存的技术成为高速缓存。
  • 进行磁盘读写时,寻道时间(即将磁头移到数据所在磁道的时间)是很耗时的。寻道期间不进行数据传输。为使数据传输率最大,连续读取的数据块在磁盘上应连续存放
  • 操作系统往往以数据块为单位来进行读写。因此,从磁盘读取一个字节和读取一个数据块所耗费的时间可能一样多。
    数据块大小通常为8KB,16KB,32KB或64KB。我们将内存中保存读写块的那块区域称为缓冲区(buffer)。
  • 数据从磁盘传输到内存是由系统总线而不是处理器实现的,这意味着在磁盘I/O时处理器仍然可以处理数据。我们可以利用这一点加速数据传输过程,比如讲数据进行压缩再存储到磁盘上。假定采用一种高效的解压缩算法的话,那么读磁盘压缩数据再解压所花的时间往往会比直接读取未压缩数据的时间要少。

4.2 基于块的排序索引方法

第一章讲的建立不包含位置信息的索引的基本步骤:

  1. 扫描文档集合得到所有的词项-文档ID对。
  2. 以词项为主键,文档ID为次键进行排序
  3. 将每个词项的文档ID组织成倒排记录表。

对于小规模的文档集,上述过程均可以在内存中完成。然而,对大规模文档集来说,上述方法却无能为力。
现在将词项用其ID来代替,每个词项的ID都是唯一的。
对大规模文档集而言,将所有词项ID-文档ID放在内存中进行排序是非常困难的。对于很多大型语料库,即使经过压缩后的倒排记录表也不可能全部加载到内存中。由于内存不足,我们必须使用基于磁盘的外部排序算法。对该算法的核心要求就是:在排序时尽量减少磁盘随机寻道的次数。

BSBI(blocked sort-based indexing algorithm,基于块的排序索引算法)是一种解决办法:

  1. 将文档集分割成几个大小相等的部分。
  2. 对每个部分的词项ID-文档ID对排序。
  3. 将第2步产生的临时排序结果存放到磁盘中。
  4. 将所有的临时排序文件合并成最终的索引。

在该算法中,我们选择合适的块大小,将文档解析成词项ID-文档ID对并加载到内存,在内存中快速排序。将排序后的结果转换成倒排索引格式后写入磁盘。然后将每个块索引同时合并成一个索引文件。
以该算法应用到Reuters-RCV1语料库为例,它要构建的倒排记录数目大概有1亿条,假定内存每次能加载1,000万个词项ID-文档ID,那么算法最后产生10个块,然后将10个块索引同时合并成一个索引文件。
合并时,同时打开所有块对应的文件,内存中维护了为10个块准备的读缓冲区和一个为最终合并索引准备的写缓冲区。每次迭代中,利用优先级序列(即堆结构)选择最小的未处理词项ID进行处理。读入词项的倒排记录表并合并,合并结果写会磁盘。

基于块的索引排序算法如下,该算法将每个块的倒排索引存入文件f1,f2,…fn,最后合并

BSBIndexConstruction()
    n<-0
    while (all documents have not been processed)
    do n <-- n+1
        block <-- ParseNextBlock()
        BSBI-Invert(block)
        WriteBlockToDisk(block,fn)
    MergeBlock(f1,f2,...,fn)

4.3 内存式单遍扫描索引构建方法

基于块的排序索引算法有很好的可扩展性,但缺点是:
需要将词项映射成其ID,因此在内存中保存词项与其ID的映射关系,对于大规模的数据集,内存可能存储不下。
SPIMI(single-pass in memory indexing,内存式单遍扫描索引算法)更具可扩展性,它使用的是词项而不是其ID,它是将每个块的词典写入磁盘,对下一个块则重新采用新的词典。

  1. 算法逐一处理每个词项-文档ID,若词项是第一次出现,则将其加入词典(最好通过哈希表实现),同时建立一个新的倒排记录表;若该词项不是第一次出现,则直接返回其倒排记录表。
    注意:这里倒排记录表都是在内存中的。
  2. 向上面得到的倒排记录表增加新的文档ID。
    注意:不同于BSBI,这里并没有对词项ID-文档ID排序。
  3. 内存耗尽时,对词项进行排序,并将包含词典和倒排记录表的块索引写入磁盘。这里,排序的目的是方便以后对块进行合并。
  4. 重新采用新的词典,重复以上过程。

个人理解,其实SPIMI和BSBI并没有太多的区别。他们都是基于块来做索引构建,然后将块合并得到整体的倒排索引表。不同的是BSBI需要在内存维护词项和其ID的映射关系,另外BSBI的倒排记录表是排序过的,而SPIMI没有排序。

4.4 分布式索引构建方法

实际中,文档集通常都很大。尤其是Web搜索引擎,Web搜索引擎通常使用分布式索引构建算法来构建索引,往往按照词项或文档进行分割后分布在多台计算机上。大部分搜索引擎更倾向于采用基于文档分割的索引。

本节介绍的分布式索引构建方法是基于MapReduce。MapReduce中的Map阶段和Reduce阶段是将计算任务划分成子任务块,以便每个工作节点在短时间内快速处理。图4-5给出了MapReduce的具体步骤。首先,输入数据被分割成n个数据片(split),数据片大小的选择一定要保证任务的均匀、高效的分布。
MapReduce的Map阶段将输入的数据片映射成键-值对即(词项ID,文档ID),这个map阶段对应于BSBI和SPIMI算法中的分析任务,因此也将执行map过程的机器称为分析器(parse),每个分析器将输出结果存在本地的中间文件。
在reduce阶段,我们将同一个键(词项ID)的所有值(文档ID)集中存储,以便快速读取和处理。

猜你喜欢

转载自blog.csdn.net/u010772289/article/details/78937994