Algorithm 比较两个文件

Algorithm 比较两个文件,algorithm,compare,document,string-comparison,Algorithm,Compare,Document,String Comparison,有一本大词典,这些文档都是由它的词汇组成的,每个文档中都有一个严格意义上的单词。我想将这些文件相互比较,计算一个值,在该值下,我将声明两个文件非常不同,在该值之上,非常相似 如果一个单词包含在两个文档中,但在其他文档中很少或根本不包含,则会增强两个文档的相似性,因为它是一个仅出现在这两个文档中的唯一单词 如果一个词包含在两个文档中,但通常也包含在其他文档中,这将削弱两个文档的相似性,因为这是一个普通词,不会使它们相似 我应该使用哪种方法?TF-IDF?其他?TF-IDF肯定是一个好的开始 不过,

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

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

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


我应该使用哪种方法?TF-IDF?其他?TF-IDF肯定是一个好的开始

不过,您可以通过考虑文档的文本长度来改进它。这就是图书馆的工作

Lucene通过考虑文档的长度扩展了TF-IDF公式,因为这更符合人类的直觉。毕竟,如果您在一个只有一个单词的文档中发现“cat”一词,那么与一个有1000个单词的文档中的单个“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实现的更多详细信息,请查看此链接