比较两个文档



有一个大词典,这些文档的组成词汇,每个文档中都严格一个单词。我想彼此比较这些文档,计算一个值,根据该值,我将声明这两个文档非常不同,并且在此上非常相似。

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

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

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

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实施的更多详细信息,请查看此出色的博客文章。

相关内容

  • 没有找到相关文章

最新更新