目标:从文档集的所有文档中找出K个离查询最近的文档
(一般)步骤:对每个文档评分(余弦相似度),按照评分高低排序,选出前K个文档
但是对于搜索引擎来说,文档集很大,所以计算量会很大,效率就很低
如何加速:
思路一:加速每个余弦相似度的计算
思路二:不对所有的文档的评分结果排序而直接选出Top-K
思路三:能否不需要计算所有N篇文档的得分
余弦相似度计算公式
其算法过程如下:
检索排序就是找查询的K近邻,一般而言,在高维空间下计算余弦相似度没有很高效的办法。但是如果查询很短的情况下,是有一定办法加速计算的,而且普通的索引能够支持这种快速计算
不考虑查询词项的权重
查询词项无权重,相当于假设每个查询词权重为1,即出现1次
于是,不需要对查询向量进行归一化,所以可以对上述余弦算法进行简化
快速余弦相似度计算:无权重查询:
对于查询时只需要返回评分最大的K个结果,所以可以不需要对结果排序,直接使用最大堆就OK
http://en.wikipedia.org/wiki/Min-max_heap
目前为止的到倒排列表都是按照docID排序的,接下来先介绍与查询无关的另外一种反应结果好坏的程度的指标{静态质量}
页面d的PageRank p(d),就是度量有多少好页面指向d的一种指标,于是可以将文档按照PageRank排序,然后将PageRank和余弦相似度线性组合得到文档最后等分。
假设:
1) P --> [0, 1]
2) 检索算法按照的d1,d2, ..... ,以及计算(以文档为单位的计算, doc-at-a-time),当前处理的文档p(d) < 0.1
3)而目前找到的Top-K的得分中最小的都>1.1
由于后续文档的得分不可能超过1.1(cos(q, d) < 1),所以,我们已经得到了top-k文档了,后续不需要再计算了。
对于精确top-k检索问题,仍然无法避免大量文档参与计算。一个自然而言的问题就是能够尽量减少参与计算的文档数目,即使不能完全保证正确性也在所不惜(即得到的top-k虽然接近top-k但并非真正的top-k)