为什么我们使用 tf-idf 权重计算余弦相似度?

Why do we calculate cosine similarities using tf-idf weightings?

假设我们正在尝试测量两个非常相似的文档之间的相似性。

Document A: "a b c d"
Document B: "a b c e"

这对应于词频矩阵

  a b c d e
A 1 1 1 1 0
B 1 1 1 0 1

其中原始向量的余弦相似度是两个向量 A 和 B 的点积除以它们的量级的乘积:

3/4 = (1*1 + 1*1 + 1*1 + 1*0 + 1*0) / (sqrt(4) * sqrt(4)).

但是当我们通过将矩阵中的每一项乘以 (log(N / df_i) 来应用 inverse document frequency 转换时,其中 N 是矩阵中文档的数量,2,并且df_i是一个term出现的文档数,我们得到一个

的tf-idf矩阵
   a b c d    e
A: 0 0 0 log2 0
B: 0 0 0 0    1og2

由于"a"出现在两个文档中,它的逆文档频率值为0。这与"b"和"c"相同。同时,"d" 在文档 A 中,但不在文档 B 中,因此它乘以 log(2/1)。 "e" 在文档 B 中,但不在文档 A 中,因此它也乘以 log(2/1)。

这两个向量的余弦相似度为0,说明这两个是完全不同的文档。显然,这是不正确的。为了使用 tf-idf 权重将这两个文档视为彼此相似,我们需要矩阵中的第三个文档 C,它与文档 A 和 B 有很大不同。

因此,我想知道 and/or 为什么我们会结合使用 tf-idf 权重和余弦相似度度量来比较高度相似的文档。 None 我阅读的教程或 Whosebug 问题已经能够回答这个问题。

This post 讨论了使用余弦相似度的 tf-idf 权重的类似失败,但未提供如何处理这些失败的指导。

编辑:事实证明,我正在寻找的指导是在该博客的评论中 post。它建议使用公式

1 + log (N / ni + 1)

改为逆文档频率变换。这将使每个文档中的术语的权重接近其原始权重,同时更大程度地增加大量文档中不存在的术语的权重。有趣的是,这个公式在关于 tf-idf 的 post 中并没有更突出。

事实证明,我正在寻找的指导是在那篇博客的评论中 post。它建议使用公式

1 + log (N / ni + 1)

改为逆文档频率变换。这将使每个文档中的术语的权重接近其原始权重,同时更大程度地增加大量文档中不存在的术语的权重。有趣的是,这个公式在关于 tf-idf 的 post 中并没有更突出。

Since "a" appears in both documents, it has an inverse-document-frequency value of 0

这是您在使用反向文档频率 (idf) 时出错的地方。 Idf 旨在通过 文档集合(不仅仅是两个文档)进行计算,目的是能够预测文档对中术语重叠的重要性。

您会期望 'the'、'a' 等常用术语在所有文档对中重叠。这应该对您的相似性得分有任何贡献吗? - 没有。

这正是矢量分量乘以 idf 因子的原因 - 只是为了抑制或增强特定项重叠(a_i*b_i 形式的分量被添加到余弦模拟和中的分子)。

现在假设您有一本计算机科学期刊合集。您认为文档对中 'computer' 和 'science' 等术语的重叠被认为很重要吗? - 不。 这确实会发生,因为这些术语的 idf 在这个集合中会相当低。

如果将合集扩展到任何学科的科学文章,您认为会发生什么?在那个集合中,单词 'computer' 的 idf 值将不再低。这是有道理的,因为在这个一般集合中,如果两篇文档的主题相同 - 计算机科学,你会认为它们足够相似。