比较两个文件

时间:2017-11-23 08:38:54

标签: algorithm compare document string-comparison

有一个很大的词典,这些文档的词汇由每个文档中的一个词组成。我想将这些文件相互比较,计算一个值,在这个值下我会声明这两个文件非常不同,而且上面的文件非常相似。

如果两个文件中都包含一个单词,但很少或根本不包含其他文档,它会强化两个文档的相似性,因为它是一个仅在这两个文档中出现的唯一单词。

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

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

1 个答案:

答案 0 :(得分:1)

TF-IDF 肯定是一个好的开始。

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

Lucene通过考虑文档的长度来扩展TF-IDF公​​式,因为这更符合人类的直觉。毕竟,如果你在一个单词的文档中找到“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 的算法(“最佳匹配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实施的更多详细信息,请查看此blog article