比较两个文件

安德拉斯莱

有一本大词典,这些文档都是由词汇组成的,每个文档中严格地只有一个单词。我想将这些文件相互比较,计算一个值,在该值下我会声明两个文件非常不同,而在此之上,非常相似。

如果一个词出现在两个文档中,而在其他文档中很少或根本不包含,则加强了两个文档的相似性,因为它是一个唯一的词,只出现在这两个文档中。

如果一个词在两个文档中都包含,但经常在其他文档中也包含,这会削弱两个文档的相似性,因为是一个共同的词,不会使它们相似。

我应该使用哪种方法?TF-IDF?其他?

吉尔费尔南德斯

TF-IDF无疑是一个好的开始。

您也可以通过考虑文档的文本长度来改进它。这就是Lucene所做的。

Lucene 通过考虑文档的长度扩展了 TF-IDF 公式,因为这更符合人类的直觉。毕竟,如果您在一个包含一个单词的文档中找到“cat”这个词,那么与包含一千个单词的文档中的单个“cat”相比,这个词的相关性会更高。

Lucene 似乎采用了 TF-IDF 的扩展公式:

log(numDocs / (docFreq + 1)) * sqrt(tf) * (1/sqrt(length))

numDocs = total number of documents
docFreq = in how many documents the word was found
tf      = Term frequency in a specific document
length  = How many words there are in the document

如今,Lucene 似乎已经演变为使用另一种称为BM25(“Best Match 25”)的算法。总的来说,这个算法似乎比TF-IDF产生更好的结果似乎Lucene中使用的BM25的公式是:

IDF * ((k + 1) * tf) / (k * (1.0 - b + b * (|d|/avgDl)) + tf)

k = constant (typically 1.2)
tf = term frequency
b = also a constant which tunes the influence of the document length
|d| = document length
avgDl = average document length
IDF = log ( numDocs / docFreq + 1) + 1

有关 Lucene 实现的更多详细信息,请查看这篇很棒的博客文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章