java - 使用 Okapi Scheme 计算文档相似度

标签 java lucene similarity

我发现 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 到 nidfOfQueryDoc= (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) 是您的 idfOfQueryTermfreq(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/

相关文章:

string - 将 400 万行数据相互匹配并按相似性对结果进行排序的最佳方法?

java - 将 ByteBuffer 与 FloatBuffer 结合起来

java - 字符显示/搜索 Unicode 字符

elasticsearch - ElasticSearch仅返回文档的特定部分

.net-core - 无法创建 Lucene.Net StandardAnalyzer 的实例

opencv - 计算图片与其草图的相似度

java - 在 Java 中查找资源

java - butterknife 库问题

elasticsearch - 在 ElasticSearch 5.6.3 中获取嵌套文档的聚合导致 Lucene 异常

python - Doc2Vec Gensim 文档和主题之间的相似性