精确top K检索及其加速办法
目标
从文档集的所有文档中找出K 个离查询最近的文档
步骤
对每个文档评分(余弦相似度),按照评分高低排序,选出前K个结果
如何加速
- 快速计算余弦
检索排序就是找查询的K近邻,一般而言,在高维空间下,计算余弦相似度没有很高效的方法,但是如果查询很短,是有一定办法加速计算的,而且普通的索引能够支持这种快速计算。 - 堆法N中选K
检索时,通常只需要返回前K条结果:可以对所有的文档评分后排序,选出前K个结果,但是这个排序过程可以避免。 - 提前终止计算
接下来将采用与查询无关的另外一种反映结果好坏程度的指标 (静态质量), 该得分的取值为 [0,1].
net-score(q, d) = g(d) + cos(q, d)
非精确top K检索的问题
提出的想法
- 仍然无法避免大量文档参与计算
- 一个自然而言的问题就是能否尽量减少参与计算文档数目,即使不能完全保证正确性也在所不惜。
- 即采用这种方法得到的top K虽然接近但是并非真正的top K----非精确top K检索
一般思路
找一个文档集合A,K<|A|<<N,利用A中的top K结果代替整个文档集的top K结果
方法
- 索引去除(Index elimination)技术
- 只考虑那些词项的idf值超过一定的阈值的文档
- 只考虑那些包含多个查询词项的文档(比如达到一定比例,3个词项至少出现2个,4个中至少出现3个等等)
- 优胜表(Champion list)
- 对每个词项t,预先计算出其倒排记录表中权重最高的r篇文档,如果采用tf-idf机制,即tf最高的r篇。这r篇文档称为词项t的优胜表,也称为胜者表或高分文档(top docs)。
- 注意:1)r 比如在索引建立时就已经设定,因此,有可能 r < K
2)每个词项t的r值可以设置不同,例如:罕见词项t的r值可以设置大一些 - 检索时,仅计算某些词项的优胜表中包含的文档集合的并集,从这个集合中选出top K作为最终的top K
- 静态质量得分排序方式
静态质量得分排序方式
- 为每篇文档赋予一个与查询无关的(query-independent ) [0,1]之间的值,记为g(d)
- 同前面一样,最终文档排名基于g(d)和相关度的线性组合。
简单的如:net-score(q,d) = g(d) + cosine(q,d)。或者采用等权重,也可以采用不同权重。另外可以采用任何形式的函数,而不只是线性函数。 - 接下来我们的目标是找net-score最高的top K文档
- 影响度(Impact)排序
如果只想对 tft,d 足够高的文档进行计算,那么就可以将文档按照 tft,d排序,需要注意的是:这种做法下,倒排记录表的排序并不是一致的(排序指标和查询相关) - 簇减枝法
在簇剪枝方法(cluster pruning)中,我们先对文档向量聚类来进行预处理操作,然后,在
查询处理时,我们只考虑利用少数几个簇中的文档进行余弦相似度计算。具体的预处理步骤如下:
(1) 从 N 篇文档组成的文档集中随机选出 N \sqrt{N} N 篇文档,它们称为先导者(leader)集合;
(2) 对于每篇不属于先导者集合的文档,计算离之最近的先导者。
不属于先导者集合的文档称为追随者(follower)。直观地看,对于 N \sqrt{N} N 篇随机选出的先导
者文档,其期望分配到的追随者个数大约为 N/ N \sqrt{N} N = N \sqrt{N} N 。于是,查询处理过程如下:
(1) 给定查询 q,通过与 N \sqrt{N} N个先导者计算余弦相似度,找出和它最近的先导者 L;
(2) 候选集合 A 包括 L 及其追随者,然后对 A 中的所有的文档计算余弦相似度。