【问题标题】:Cosine similarity and tf-idf余弦相似度和 tf-idf
【发布时间】:2011-06-06 17:36:21
【问题描述】:

我对以下关于 TF-IDF余弦相似度 的评论感到困惑。

我在 Cosine Similarity 下阅读了这两个,然后在 wiki 上我发现这句话“在信息检索的情况下,两个文档的余弦相似度范围为 0 到 1,因为术语频率(tf-idf 权重) 不能为负。两个词频向量之间的夹角不能大于 90。"

现在我想知道....它们不是两个不同的东西吗?

tf-idf 是否已经在余弦相似度内?如果是,那到底是什么——我只能看到内点积和欧几里得长度。

我认为 tf-idf 是您可以在 对文本运行余弦相似度之前执行的操作。我错过了什么吗?

【问题讨论】:

  • 我发现了一个很棒的blog。真的很有帮助。
  • 是的,tfidf 只是计算文本文档(非负)特征向量的众多方法之一,而余弦相似度只是比较特征向量相似度的几种方法之一。其他包括 Jaccard、Pearson、Levenshtein... 参见例如[lylelin317.wordpress.com/2014/03/11/…。使用 tfidf 并不意味着余弦相似性和 v.v.
  • 不幸的是,这篇博文没有帮助,只是让事情变得不太清楚如何找到文档之间的相似之处。

标签: information-retrieval vsm cosine-similarity tf-idf


【解决方案1】:

Tf-idf 是一种应用于文本的转换,以获得两个实值向量。然后,您可以通过取它们的点积并将其除以它们的范数的乘积来获得任何向量对的余弦相似度。这会产生向量之间夹角的余弦值。

如果 d2q 是 tf-idf 向量,那么

其中 θ 是向量之间的角度。由于 θ 的范围是 0 到 90 度,所以 cos θ 的范围是 1 到 0。 θ 可以 的范围只能是0 到 90 度,因为 tf-idf 向量是非负的。

tf-idf 和余弦相似度/向量空间模型之间没有特别深的联系; tf-idf 与文档术语矩阵配合得很好。不过,它在该领域之外有用途,原则上您可以在 VSM 中替换另一个转换。

(公式取自Wikipedia,因此是d2。)

【讨论】:

  • 谢谢,那我没看错 :D 很高兴你的问题回答得这么快,而不是等着上学^^
  • “tf-idf 和余弦相似度/向量空间模型之间没有特别深的联系;”还是这样吗?我想知道标准化 tf-idf 向量是否有任何含义,或者使用余弦相似度恰好在实践中效果很好?
  • 如果我要从头开始创建一个信息检索 Python 程序。我有一个文档和查询数据集。由于余弦相似度需要两个向量,我应该为文档和查询或仅文档计算 TFIDF?
  • 我在某处读到,可以验证对于 tf-idf 向量,点积将直接为您提供余弦相似度。你能详细说明原因吗?
【解决方案2】:

TF-IDF 只是一种衡量文本中标记重要性的方法;这只是将文档转换为数字列表的一种非常常见的方法(术语向量,它提供了您获得余弦的角度的一个边)。

要计算余弦相似度,您需要两个文档向量;向量用索引表示每个唯一术语,该索引处的值是衡量该术语对文档和文档相似性一般概念的重要性的某种度量。

您可以简单地计算每个术语在文档中出现的次数(Term Frequency),并将该整数结果用于向量中的术语得分,但结果不会很好。非常常见的术语(例如“is”、“and”和“the”)会导致许多文档看起来彼此相似。 (可以使用stopword list 处理这些特定示例,但其他不够通用而不能被视为停用词的常用术语会导致同样的问题。在 Stackoverflow 上,“问题”一词可能属于此类。如果你正在分析烹饪食谱,你可能会遇到“鸡蛋”这个词的问题。)

TF-IDF 通过考虑每个词条的一般出现频率(Document Frequency)来调整原始词条频率。 Inverse Document Frequency 通常是文档数除以该术语出现的文档数的对数(图片来自维基百科):

将“日志”视为有助于长期解决问题的细微差别——它会随着参数的增长而增长,因此如果该术语很少见,IDF 将会很高(大量文档除以非常很少文档),如果这个词很常见,IDF 会很低(很多文档除以很多文档 ~= 1)。

假设您有 100 个食谱,除了一个以外都需要鸡蛋,现在您有另外三个文档都包含“鸡蛋”一词,一个在第一个文档中,两次在第二个文档中,一次在第三个文档中。每个文档中“egg”的词频为 1 或 2,文档频率为 99(或者,如果算上新文档,可以说是 102。让我们坚持使用 99)。

'egg' 的 TF-IDF 是:

1 * log (100/99) = 0.01    # document 1
2 * log (100/99) = 0.02    # document 2
1 * log (100/99) = 0.01    # document 3

这些都是很小的数字;相比之下,让我们看看另一个仅出现在 100 个食谱语料库中的 9 个中的词:“芝麻菜”。它在第一个文档中出现两次,在第二个文档中出现三次,在第三个文档中不出现。

'arugula' 的 TF-IDF 是:

1 * log (100/9) = 2.40  # document 1
2 * log (100/9) = 4.81  # document 2
0 * log (100/9) = 0     # document 3

'arugula' 真的对于文档 2 很重要,至少与“egg”相比。谁在乎卵子出现了多少次?万物皆有蛋!这些术语向量比简单计数提供的信息要多得多,并且它们将导致文档 1 和 2 比使用简单术语计数时更接近(相对于文档 3)。在这种情况下,可能会出现相同的结果(嘿!我们这里只有两个术语),但差异会更小。

这里的要点是 TF-IDF 生成文档中术语的更有用的度量,因此您不会关注真正常见的术语(停用词,'egg'),而忽略重要的术语( '芝麻菜')。

【讨论】:

  • sklearnTfIdf使用的实际公式是TF + TF*IDF
【解决方案3】:

这些教程解释了余弦相似度的完整数学过程

假设如果要计算两个文档之间的余弦相似度,第一步将是计算两个文档的 tf-idf 向量。然后求这两个向量的点积。这些教程将对您有所帮助:)

【讨论】:

    【解决方案4】:

    tf/idf 加权在某些情况下会失败并在计算时在代码中生成 NaN 错误。阅读此内容非常重要: http://www.p-value.info/2013/02/when-tfidf-and-cosine-similarity-fail.html

    【讨论】:

      【解决方案5】:

      Tf-idf 仅用于根据 tf 从文档中查找向量 - 词频 - 用于查找该词在文档中出现的次数和逆文档频率 - 给出了多少次的度量该术语出现在整个集合中。

      然后你可以找到文档之间的余弦相似度。

      【讨论】:

        【解决方案6】:

        TFIDF 是逆文档频率矩阵,根据文档矩阵查找余弦相似度会返回相似列表

        【讨论】:

          猜你喜欢
          • 2012-11-20
          • 1970-01-01
          • 2017-02-03
          • 1970-01-01
          • 2013-02-03
          • 2013-10-16
          • 2013-04-18
          • 2017-09-05
          • 2011-01-23
          相关资源
          最近更新 更多