信息检索笔记(9)-再论文档评分
考虑从文档集的所有文档中找出K 个离查询最近的文档的过程:对每个文档评分(如计算余弦相似度),按照评分高低排序,选出前K个结果。显然对大文档集,评分、排序都是非常耗时的操作,那么如何加速评分及排序呢?
思路1:能否加快每个余弦相似度的计算?
思路2:能否不对所有文档的评分结果排序而直接选出Top K篇文档?
思路3:能否不需要计算所有N篇文档的得分?
快速计算余弦相似度
一般而言,在高维空间下,计算余弦相似度没有很高效的方法。但是如果查询很短,是有一定办法加速计算的。
特例– 不考虑查询词项的权重,即不考虑查询向量的tf-idf权重计算,即查询向量为单位向量,不需要对查询向量进行归一化处理。于是余弦相似度计算算法进行了轻微的简化。
不对所有文档的评分结果排序而直接选出Top K篇文档
计算出文档的得分以后,最后一步就是选出得分最高的K 篇文档呈现给用户。尽管可以先对上述所有得分进行排序然后再挑选出前K 个结果,但是一个更好的方法是通过某种堆结构只返回头K 篇文档。假定余弦相似度得分非零的文档数目是J,那么建立这样的堆结构需要2J 次比较,对于排名前K 的每篇文档从上述堆结构中返回时都需要进行logJ 次比较。
最大堆(Max Heap)数据结构Wiki地址:http://en.wikipedia.org/wiki/Binary_heap
提前终止计算
到目前为止的倒排记录表都按照docID排序。接下来将采用与查询无关的另外一种反映结果好坏程度的指标(静态质量)。例如: 页面d的PageRank g(d), 就是度量有多少好页面指向d的一种指标 ,于是可以将文档按照PageRank排序,将PageRank和余弦相似度线性组合得到文档的最后得分:net-score(q, d) = g(d) + cos(q, d)。
假设: (i) g → [0, 1]; (ii) 检索算法按照d1,d2,…,依次计算(为文档为单位的计算,document-at-a-time),当前处理的文档的 g(d) < 0.1;(iii) 而目前找到的top K 的得分中最小的都 > 1.2。由于后续文档的得分不可能超过1.1 ( cos(q,d) <1 )。所以,我们已经得到了top K结果,不需要再进行后续计算。
迄今为止,我们主要关注给定查询后精确返回前K 篇得分最高的文档的方法。精确top K检索的问题:
大量文档都参与了余弦相似度计算,这同样也会增加从堆中选择最后K 篇文档所需要的计算开销。
一个自然而言的问题就是能否尽量减少参与计算文档数目,即使不能完全保证正确性也在所不惜。即采用这种方法得到的top K虽然接近但是并非真正的top K----非精确top K检索。这样做的目的在于,显著降低输出前K 篇文档所需要的计算复杂度,同时并不让用户感觉到前K 个结果的相关度有所降低。由于采用这种机制能够返回和真实的前K 篇文档得分非常接近的K 篇文档,因此在大多数应用中,这样做能够充分满足应用的需要。另一方面,从用户角度看,这种非精确的前K 篇文档检索并不一定是坏事。给定查询情况下,余弦相似度计算得分最高的K 篇文档在很多情况下不一定就是最好的K 篇文档,余弦相似度只不过是用户所感觉到的相似度的一个替代品。非精确top K的结果如果和精确top K的结果相似度相差不大,应该也能让用户满意。
非精确top K检索的一般思路:
(1) 找到一个文档集合A,它包含了参与最后竞争的候选文档,其中K < |A| << N。A 不必包含前K 篇得分最高的文档,但是它应该包含很多和前K 篇文档得分相近的文档。
(2) 返回A 中得分最高的K 篇文档。
索引去除(Index elimination)
对于一个包含多个词项的查询来说,很显然我们可以仅仅考虑那些至少包含一个查询词项的文档。可以进一步拓展这种思路:
1.只考虑那些包含高idf查询词项的文档。那些低idf 值词项的倒排记录表往往比较长,如果将它们剔除,那么需要计算余弦相似度的文档数目将大大减少。从另一个角度看,idf 值低的词项也可以看成停用词,它们对评分结果没有什么贡献。
2.对于多词项查询而言,只需要计算包含其中大部分词项的文档(比如达到一定比例,3个词项至少出现2个,4个中至少出现3个等等)。
胜者表(Champion list)
胜者表(champion list),有时也称为优胜表(fancy list)或高分文档(top doc)。它的基本思路是,对于词典中的每个词项t,预先计算出r 个最高权重的文档,其中r 的值需要事先给定。对于tf-idf 权重计算机制而言,词项t 所对应的tf 值最高的r 篇文档构成t 的胜者表。给定查询 q,对查询q 中所有词项的胜者表求并集,并可以生成集合A。从这个集合中选出top K作为最终的top K。
注意:r 比如在索引建立时就已经设定。因此,有可能 r < K
静态得分和排序
我们希望排名靠前的文档不仅相关度高(relevant) ,而且权威度也大(authoritative)。
相关度常常采用余弦相似度得分来衡量,而权威度往往是一个与查询无关的量,是文档本身的属性。权威度衡量如:文档被引入次数、PageRank值等。
这种排序下,高分文档更可能在倒排记录表遍历的前期出现,上述方式可以提前结束倒排记录表的遍历(精确top K中提前终止相似度计算的方法)。
将g(d)排序和胜者表相结合:对每个词项维护一张胜者表,该表中放置了r篇g(d) + tf-idf值最高的文档,检索时只对胜者表进行处理。
高端表(High list)和低端表(Low list)
对每个词项,维护两个倒排记录表,分别成为高端表和低端表。比如可以将高端表看成胜者表,遍历倒排记录表时,仅仅先遍历高端表。如果返回结果数目超过K,那么直接选择前K篇文档返回,否则,继续遍历低端表,从中补足剩下的文档数目。
影响度(Impact)排序
在之前介绍的所有倒排记录表中,文档通常采用同一种排序方式排序,典型的方法包括按文档ID 或静态得分来排序。这种统一排序方法能够支持多个查询词项倒排记录表的并发扫描,在遇到每一篇文档时能够计算它的得分。这种计算文档得分的方式有时也称为以文档为单位(document-at-a-time)的评分方法。
考虑倒排记录表按tf-idf值排序,这种情况下,显然不同倒排记录表中的文档排序方式也不尽一致(排序指标和查询相关)。这时我们就不能对多个倒排记录表进行并发扫描。此时,就必须以查询词项为单位进行处理,然后对所有的文档计算累加得分。因此,我们得到以词项为单位(term-at-a-time)的得分计算方法。
基于具体的评分计算方法,倒排记录表可以采用不同的排序方式(如按静态得分及tf-idf的相加值排序),这种更一般的设置情况下的排序方法被称为影响度排序(impact ordering)。
影响度排序的非精确top K检索方法:
1. 提前结束法
遍历倒排记录表时,可以在如下情况之一发生时停止:遍历了固定的文档数目A;tf-idf值低于某个预定的阈值。将每个词项的结果集合合并,仅计算合并集合中文档的得分。
2. 将词项按照idf排序
对于多词项组成的查询,按照idf从大到小扫描词项。在此过程中,会不断更新文档的得分(即本词项的贡献),如果文档得分基本不变的话,停止。
簇剪枝(Cluster pruning)
基本思想:将文档分成如干个区域,计算余弦相似度时,只计算少数区域中的文档。
(1) 从N 篇文档组成的文档集中随机选出√N 篇文档(先导者能够反映数据的分布情况,即能将文档分成如干个区域。对文档向量密集分布的区域很可能会产生多个先导者,因此需要细分成多个子区域。),它们称为先导者(leader)集合;
(2) 对于每篇不属于先导者集合的文档,计算离之最近的先导者。不属于先导者集合的文档称为追随者(follower)。直观地看,对于√N 篇随机选出的先导者文档,其期望分配到的追随者个数大约为N /√ N =√ N 。
于是,查询处理过程如下:
(1) 给定查询q,通过与√N 个先导者计算余弦相似度,找出和它最近的先导者L;
(2) 候选集合A 包括L 及其追随者,然后对A 中的所有的文档计算余弦相似度。
在上述簇剪枝方法的一些变形当中,会另外引入两个参数b1 和b2,它们都是正整数。预处理时,我们将每个追随者分配给离它最近的b1 个先导者,而不是像上面一样只分配给一个最近的先导者。查询处理时,我们将考虑和查询q 最近的b2 个先导者。很显然,前面讲到的方法只是该方法在b1 = b2 = 1 情况下的一个特例。进一步说,增加b1 和b2 会增加找到真实的前K 篇文档的可能性,当然此时也会消耗更大的代价。
posted on 2012-08-28 11:33 God bless you 阅读(3429) 评论(1) 编辑 收藏 举报