我发现 Okapi 相似度度量可用于计算文档相似度 http://www2002.org/CDROM/refereed/643/node6.html以及本文 http://singhal.info/ieee2001.pdf
我想使用 Lucene 的 Okapi 相似度方案来计算文档集合中文档之间的相似度
例如我的文档集中有 10 个文档(doc#A、#B、#C、#D 等)。我将选择一个文档作为查询文档。说#A 博士。 然后对于查询文档的每个 term=1..n ,我将计算
idfOfQueryTerm = log (totalNumIndexedDocs - docFreq + 0.5)/(docFreq + 0.5)
然后我将 (idfOfQueryTerm) 的总和从 1 到 n
; idfOfQueryDoc= (idfOfQueryTerm) 之和
然后,对于每10个文档(包括查询文档),我将根据首先选择的查询文档的查询词,通过该方程计算文档的总词频。
tfOfDocument={2.2 * termFrq }/ { 1.2 * ( 0.25 + 0.75 * docLength / this.avgDocLength ) + termFrq }
因此,我最终会得到 10 个tfOfDocument
值,每个文档一个值,一个 idfOfQueryDoc
值。
然后我可以使用这两种方法计算查询文档与其他文档之间的相似度。
1) 查询文档和文档之间的相似性 #B= idfOfQueryDoc* tfOfDocument #B
2) 查询文档和文档之间的相似性 #B= idfOfQueryDoc* tfOfDocument #B* tfOfDocument#queryDoc
我想知道,我对Okapi相似度度量的理解是否正确?
以上两种方法中哪一种最适合计算文档相似度?
最佳答案
根据第一个链接,查询文档与另一个文档之间的相似度为:
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
的频率code> 在文档 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))
注意:两个链接给出的方程略有不同,尽管差异主要在于权重,而不是基本原理
关于java - 使用 Okapi Scheme 计算文档相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11012846/