我发现Okapi相似性度量可用于从此处http://www2002.org/CDROM/refereed/643/node6.html和本文http://singhal.info/ieee2001.pdf
计算文档相似度我想使用与Lucene的Okapi相似性方案计算文档集合的文档之间的相似性
e.g。我的文档集中有10个文档(doc#A,#B,#C,#D等)。我将选择一个文档作为查询文档。说文档#A。 然后对于每个术语= 1..n,查询文档将计算
idfOfQueryTerm = log (totalNumIndexedDocs - docFreq + 0.5)/(docFreq + 0.5)
然后我会接受sum of (idfOfQueryTerm) from 1 to n
; idfOfQueryDoc= sum of (idfOfQueryTerm)
然后,对于每10个文档(包括查询文档),我将根据首先选择的查询文档的查询条件,通过此等式计算文档的总术语频率。
tfOfDocument={2.2 * termFrq }/ { 1.2 * ( 0.25 + 0.75 * docLength / this.avgDocLength ) + termFrq }
所以我最终得到10 - tfOfDocument
个值,每个文档一个值和一个idfOfQueryDoc
值。
然后我可以使用这两种方法计算查询文档和其他文档之间的相似性。
1)查询文档与doc#B = idfOfQueryDoc* tfOfDocument #B
2)查询文档与doc#B = idfOfQueryDoc* tfOfDocument #B* tfOfDocument#queryDoc
我想知道,我对Okapi相似性度量的理解是否正确?
上述两种方法中哪种方法最适合计算doc相似度?
答案 0 :(得分:2)
基于第一个链接,查询文档与另一个文档之间的相似性是:
sim(query, doc) = sum(t in terms(query), freq(t, query) * w(t, doc))
其中(从第二个链接,稍微修改,因为我认为链接中的公式不正确)
w(t, doc) = idf(t) * (k+1)*freq(t, doc) / (k*(1-b + b*ls(doc)) + freq(t, doc))
ls(doc) = len(doc)/avgdoclen
和idf(t)
是idfOfQueryTerm
,freq(t, doc)
是文档t
中术语doc
的频率。
选择b = 0.25和k = 1.2即可
w(t, doc) = idf(t) * 2.2*freq(t, doc) / (1.2*(0.25+0.75*ls(doc)) + freq(t, doc))
注意:这两个链接给出了略微不同的方程,尽管差异主要在于权衡,而不是基本原理