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

时间:2017-08-20 09:31:34

标签: text nlp information-retrieval tf-idf cosine-similarity

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

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是文档的数量在其中存在术语的情况下,我们得到

的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大不相同。

因此,我想知道是否和/或为什么我们将tf-idf权重与余弦相似性度量结合使用来比较高度相似的文档。我读过的任何教程或StackOverflow问题都没有能够回答这个问题。

This post使用余弦相似性讨论了使用tf-idf权重的类似失败,但没有提供有关如何处理它们的指导。

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

1 + log(N / ni + 1)

作为逆文档频率转换而不是。这将使每个文档中的术语权重保持接近其原始权重,同时使更多文档中不存在的术语权重膨胀更大。有趣的是,这个公式在关于tf-idf的帖子中并没有突出显示。

2 个答案:

答案 0 :(得分:2)

  

由于两个文档中都出现“a”,因此它的逆文档频率值为0

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

您可能希望所有文档对中的常用术语(如“the”,“a”等)重叠。这应该对您的相似性得分有任何贡献吗? - 不。

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

现在考虑你有计算机科学期刊的集合。您是否认为文档对中的“计算机”和“科学”等术语的重叠被认为是重要的? - 没有。 这确实会发生,因为这个术语的idf在这个集合中会相当低。

如果您将收藏扩展到任何学科的科学文章,您认为会发生什么?在该集合中,“计算机”一词的idf值将不再低。这是有道理的,因为在这个通用集合中,如果它们属于同一主题 - 计算机科学,你会认为两个文档足够相似。

答案 1 :(得分:0)

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

1 + log(N / ni + 1)

作为逆文档频率转换而不是。这将使每个文档中的术语权重保持接近其原始权重,同时使更多文档中不存在的术语权重膨胀更大。有趣的是,这个公式在关于tf-idf的帖子中并没有突出显示。