有一个很大的词典,这些文档的词汇由每个文档中的一个词组成。我想将这些文件相互比较,计算一个值,在这个值下我会声明这两个文件非常不同,而且上面的文件非常相似。
如果两个文件中都包含一个单词,但很少或根本不包含其他文档,它会强化两个文档的相似性,因为它是一个仅在这两个文档中出现的唯一单词。
如果两个文件中都包含一个单词,但通常也包含在其他文档中,这会削弱两个文档的相似性,因为这是一个不会使它们相似的常用单词。
我应该使用哪种方法? TF-IDF?其他
答案 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。