比较两个文档

Compare two documents

有一个很大的词典,就是组成这些文档的词汇表,每篇文档中只有一个词。我想将这些文件相互比较,计算一个值,在该值下我将声明两个文件非常不同,在该值之上,非常相似。

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

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

我应该使用哪种方法?特遣部队-以色列国防军?其他?

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 实现的更多详细信息,请查看这个很棒的 blog article