《Introduce to IR》索引创建

本文介绍了倒排索引构建的基本算法,包括块排序索引算法(BSBI)和分布式索引算法,这两种算法广泛应用于大规模数据的信息检索系统中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该系列文章是《An Introduce to Information Retrieval》Chapter 4 的读书笔记。

 

对于大规模数据的信息检索,倒排索引的建立其实并没有想象中的那么简单。在实际应用中,倒排索引的建立算法必须考虑到硬件的约束。可以这样说:计算机硬件的参数性能是促动IR系统的设计发展的决定因素。

 

 

索引创建(Index construction)

 

要点:(1) 介绍 BSBI 算法建立大规模数据的倒排索引

         (2) 分布式索引的建立算法

 

4.1 硬件基础介绍

 

下图是2007年典型计算机的系能参数:

 

        参数符号                性能指标                       统计值

            s                   磁盘数据定位时间          5ms=5*10^(-3)s

                         (在磁盘中查找数据所在的位置)

            b                   每字节数据传输时间      0.02us=2*10^(-8)s

                         (从磁盘传入1字节数据进内存)

                                 CPU时钟周期               10^(-9)s

            p                   内存大小                      several GB

                                 磁盘大小                      1TB or more

 

(1) 内存中读取数据远比磁盘中读取数据要快的多。

      从内存中读取1byte数据只需要几个CPU时钟周期(大概5*10^(-9)s),而从磁盘中读入1byte数据需要2*10^(-8)s。因此,我们要尽可能的让更多的数据保存在内存中,特别是使用频率高的数据。

      将使用频率高的磁盘数据保存在内存中的技术叫做 缓存(caching)。

 

(2) 磁盘数据读取的代价主要花费在磁盘数据定位的时间上(5*10^(-3)s)。而磁盘每次定位到一个磁盘存储块(详见《外部存储器——磁盘 》)。定位1byte数据和定位一个磁盘存储块(可能是8,16,32或64KB)的时间是一样。因此,需要一起读取的数据块应该连续存储在磁盘上。这样,我们把一整块磁盘存储块数据读入内存中的连续空间叫做缓冲区(buffer)。

     举个例子:假设我们要读入磁盘中的10M数据,这些数据连续存储在100个磁盘存储块中。那么所花费的时间代价:

               从磁盘中读入内存中的时间:   t1=10^(7)*2*10^*(-8)=0.2s

               在磁盘中定位数据的时间:     t2=100*(5*10^(-3))=0.5s

               总代价为: t=t1+t2=0.7s

     当然,如果10M数据分散存储在1W个存储块中(而且这些存储块分散在杂乱无章的磁道和柱面上),那么可能要多付出几个数量级的t2代价。

 

(3) 现代服务器的内存大小少则几个GB,多则几十个GB。磁盘要多几个数量级。

 

 

 

4.2 基本倒排索引建立算法

 

这里先回忆一下《布尔检索模型》 中基本的倒排索引建立算法:

 

(1)  将所有文档解析成Term-DocID pair的集合。

(2)  把所有pairs存储在内存中,并根据Term关键字排序。

(3)  将Term相同, DocID不同的pair合并成一个Term - posting list 结构。其中posting就是一个DocID。并计算Term frequence(Term在单篇文档中出现次数) 和 Document frequence(一共出现Term的文档数)。

 

假如我们有1GB的文档集合(80W篇)、大概1亿词元(token)、40万词语(term),因此Token-DocID有1亿个,而词语是规范化,词干化的词元。因此term-DocID最多也有1亿个。每个Term平均7.5bytes,每个DocID需要4bytes。全部Term-DocID存储共需要1.15G大小。

 

如果内存没有1.15G,那么把这些pairs全部加入内存进行排序是不现实的。我们看看下面的BSBI和SPIMI算法。

 

 

 

4 .3 块排序索引算法 (Blocked sort-based indexing)

 

BSBI算法首先把每一个term对应一个唯一的TermID,这样每对TermID-DocID平均需要4bytes,共0.8G。这样所有的pairs就被压缩了近0.35G。

 

BSBI算法伪代码:

BSBI()
n ←0
while(all documents have not been processed)
do n←n+1
      block←PARSENEXTBLOCK()
      BSBI-INVERT(block)
      WRITEBLOCKTODISK(block,fn)
MERGEBLOCKS(f1,...,fn;f merged)
 

核心思想:假设内存所能容纳的pairs大小为一个block。(这个大小允许pairs在内存中进行快排)

    (1) 把Document集合中的文档一篇一篇的解析成TermID- DocID pairs,并保存在内存中。直到这些pairs存满了一个blocked的大小。(上述算法第5行PARSENEXTBlOCK())

    (2) 对内存block中的所有pairs进行排序,并整理成Term - posting list结构(倒排索引结构)。(上述算法第6行INVERT(block))

    (3) 把内存中建立好的block大小的索引结构存储在磁盘中间文件 fn 中(每一个block的中间文件不同)。然后清空内存,循环执行第一步继续解析剩下的文档,直到文档集合中所有文档被解析完毕为止。

    (4) 合并中间文件f1 .... fn ,形成最后的倒排索引文件f

 

其实BSBI算法的核心思想类似于外部排序算法。

 

 


4.4 分布式索引的建立 (Distributed indexing)

 

对于World Wide Web的海量数据,我们不可能用一台计算机高效的建立索引。事实上,我们需要一大群计算机(large computer clusters)来一起建立具有任何可能大小的Web索引。现代的Web搜索引擎,在建立索引的阶段都使用了分布式索引算法(distributed indexing algorithms)。 整个索引的建立被分配由若干台计算机来完成。既有根据词语(term)来划分的,也有根据文档(document)来划分的。下面我们将介绍根据term来划分的分布式索引算法。其实绝大多数Web搜索引擎都是根据document划分的,其基本原理和根据term划分类似。

 

分布式索引算法使用了一种分布式计算中很普遍的计算模型:MapReduce 。这种模型用于大规模数据集(大于1TB)的并行运算。其基本思想就是把巨大的计算工作量(computing job)分成若干块(chunks),这些块能够被普通计算机在短时间内处理。 MapReduce模型有两个基本阶段:Map(映射) Reduce(化简) 。下图是基于MapReduce模型的分布式索引建立的示例图:

 

基于MapReduce模型的根据词语划分的分布式索引算法:

 

(1) 将输入数据(web page collection) 分成n个splits。也就是将大工作量划分成若干个小工作量。

 

     每个splits的大小要尽可能确保工作能够被平均且高效的分配。这些splits并没有预先制定由哪台计算机完成,而是由主机依照一定的原则进行分配: 如果一台计算机完成了splits的处理任务,那么它将得到主机分配给它的下一个splits。如果该计算机死机或者由硬件故障变的很慢。那么主机会把在这台计算机上正在运行的split重新分配给其他计算机。

 

(2) 如上图MapReduce的映射阶段(Map):把每个要完成的splits映射成Term - DocID pairs。

 

     这一过程由parser完成。一个parser可以看做一台执行文档解析的计算机。每一个parser都会把解析好的pairs写入本地的中间文件中。而这些中间文件都是根据词语划分好的 segment files(如上图a-f,g-p,q-z 三类)。

 

(3) 如上图MapReduce的化简阶段(Reduce): 把每一类segment files中间文件丢给不同的inverter建立索引。

 

     每个inverter也可以看成是一台计算机。不同的inverter可能建立不同词语类的索引。比如上图,第一个inverter专门对所有parser计算机的本地segment files中a-z类的term建立索引。事实上,要考虑到inverter的工作量,所以每次建立索引的任务都限制在r个segment files。

 

 

 

4.5 动态索引的建立 (Dynamic indexing)

 

到目前位置,BSBI索引算法和分布式索引算法所考虑的文档集合都是静态的。也就是一开始工作量的大小都是确定的。但实际上,Web搜索引擎所面临的web page集合是随着文档的增加,删除,修改而不停的变化的。

 

如果文档集合的变化频率很小而且对新变化的查询实时性要求很低,那么完全可以采用一种很简单的方法:每隔一段时间重新建立索引。

 

但如果新文档的获取速度很快,比如Web search,怎么办呢?

 

 

我们可以考虑这种解决方法:维持两个索引。一是大规模的主索引(main index) ,另外一个就是刚刚发生新加入文档的辅助索引(auxiliary index) 。辅助索引的大小可以限制,并存放在内存中,如果一旦辅助索引的大小操作了限制,就立刻和主索引合并存储在磁盘上。搜索的时候可以同时查找两个索引并返回合并后的结果。

 

插入操作:对新文档所解析的pairs全部加入到内存中的辅助索引中。

删除操作:对已经删除的文档标记在一个类似垃圾站的位向量中,在检索结果返回之前首先过滤掉这些垃圾站中的文件。

更新操作:删除操作+插入操作。

 

 

 

### 回答1: 《线性代数导论》是一门数学分支,研究了线性方程组、向量空间、线性变换、特征值与特征向量等概念。线性代数主要通过线性方程组的求解来研究线性空间的性质和变换特征。在线性代数中,我们学习如何求解线性方程组,以及如何理解向量在空间中的性质和变换。线性代数是计算机科学、物理学、经济学、统计学等领域中的基础课程,它为这些领域的深入研究提供了重要的工具和方法。 线性代数的核心概念之一是向量空间。向量空间是由一组向量组成的集合,它具有特定的运算规则和性质。我们通过研究向量空间的性质,可以帮助我们理解向量在空间中的几何特征和变换规律。线性代数也涉及到线性变换和矩阵运算,它们可以描述向量的旋转、缩放、投影等操作。线性代数的另一个重要概念是特征值和特征向量,它们对于理解线性变换的特性和模式起到了重要的作用。 通过学习线性代数,我们可以更好地理解和解决实际问题。线性代数的方法可以应用于求解问题的最优解、拟合曲线、图像处理、数据压缩等领域。线性代数也为更高级的数学领域如线性空间、泛函分析和矩阵论等提供了基础。总之,《线性代数导论》是一门重要的数学课程,它不仅在数学领域中扮演着重要的角色,也在其他领域中具有广泛的应用。 ### 回答2: 线性代数是数学的一个分支,研究向量空间和线性映射的性质和操作方法。它是应用广泛的数学工具,在科学、工程和经济学等领域都有重要的应用。线性代数的核心是研究线性方程组的解的性质。 在线性代数中,我们研究向量,向量空间和矩阵以及它们之间的关系。线性方程组可以用向量和矩阵的形式进行描述,通过解线性方程组,我们可以得到向量空间的基本性质,例如维数、子空间等。线性映射是一种可以保持向量加法和数乘的函数,通过研究线性映射,我们可以得到矩阵的特征值和特征向量等重要概念。 线性代数的基本概念包括线性方程组、判断向量线性相关性的条件、矩阵的行列式、逆矩阵和转置矩阵等。其中,矩阵的行列式可以判断矩阵是否可逆,逆矩阵可以帮助我们解线性方程组。转置矩阵是将矩阵的行和列进行互换。此外,还有特征值和特征向量、正定矩阵、对称矩阵等概念也是线性代数的重要内容。 线性代数不仅是一门重要的数学学科,也是许多其他学科的基础。在计算机图形学、机器学习、信号处理等领域,线性代数的知识都扮演着重要的角色。因此,学好线性代数对于理解和应用这些学科都至关重要。 ### 回答3: 线性代数是数学的一个分支,研究向量空间和线性映射的性质。它主要涉及解决线性方程组、求解向量空间的基、研究线性变换等问题。线性代数的核心概念是向量和矩阵。 向量是有大小和方向的量,可以用箭头表示。它可以进行加法、乘法和线性组合等运算。向量空间就是由向量构成的集合,具有加法和数量乘法运算,并且满足一些特定的公理。 矩阵是一个矩形的数表,其中的元素通常为实数或复数。矩阵可以进行加法、乘法和求逆等运算。矩阵可以表示线性映射,通过变换矩阵可以将一个向量映射到另一个向量空间中。 线性代数的应用非常广泛。在工程、物理、计算机科学等领域,线性代数被用于解决问题、建立模型和优化算法。例如,在计算机图形学中,线性代数可以用来描述和操作三维物体的位置和方向。在机器学习中,线性代数可以用来处理高维数据和构建模型。在密码学中,线性代数的概念被用来设计和分析加密算法。 总之,线性代数是一门重要的数学学科,它提供了丰富的工具和方法来解决各种实际问题。通过学习线性代数,我们可以更好地理解和描述现实世界中的现象,并运用它们来解决实际问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值