【问题标题】:Java: How to use TF-IDF to compute similarity of two documents?Java:如何使用 TF-IDF 计算两个文档的相似度?
【发布时间】:2017-04-07 14:26:09
【问题描述】:

我的目标是找到两个文档(单词集合)之间的相似度值。我已经找到了几个答案,例如 this SO postthis SO post,它们提供了实现此目的的 Python 库,但我无法理解该方法并使其适用于我的用例。

如果我理解正确,文档的 TF-IDF 是根据给定术语计算的,对吗?这就是我从Wikipedia article 中解释它的方式:“tf-idf...是一个数值统计数据,旨在反映一个词对文档的重要性”。

就我而言,我没有要与文档进行比较的特定搜索词,但我有两个不同的文档。我假设我需要首先计算文档的向量,然后取这些向量之间的余弦值。但是我找到的关于构建这些向量的所有答案总是假设一个搜索词,而我没有这个词。

对此我无法理解,任何概念性帮助或实现此目的的 Java 库链接将不胜感激。

【问题讨论】:

  • 之前运行一个术语提取,一旦你有了两个语料库的术语列表及其频率,计算cosine similarity
  • @Wiktor Stribiżew:感谢您的建议。所以我将两个文档的条款提取到一个列表中。然后对于这些术语中的每一个,我计算两个文档中每一个的 tf-idf 值,这给了我两个向量,我可以从中计算余弦相似度。我理解正确吗?
  • 是的,基本上就是这样。根据词频,得到向量,TF-IDF,计算余弦相似度。此外,请确保您使用词干来规范您提取的单词形式以减少噪音。
  • 非常感谢您的提示。我会试试这个。

标签: java nlp tf-idf


【解决方案1】:

我建议先运行术语提取,连同它们的频率。请注意,词干提取也可以应用于提取的术语,以避免在随后的cosine similarity 计算过程中出现噪音。有关更多帮助和想法,请参阅Java library for keywords extraction from input text SO 线程。

然后,正如您自己提到的,对于这些术语中的每一个,您都必须计算 TF-IDF 值、获取向量并计算余弦相似度。

在计算 TF-IDF 时,请注意 1 + log(N/n)N 表示语料库总数,n 表示包含该术语的语料库数)公式更好,因为它避免了 TF 不为 0 且 IDF 等于 0 时的问题。

【讨论】:

  • 澄清一下,在 log(N/n) 中,N 是文档的总数,n 是文档的总数。包括对吗?因此,如果我们在问题中的两个文档之间执行此操作,那么值不总是 log(2/2) 或 log(1/2) 吗?
  • @Ravindu 是的,是的。仅供参考,我们的 corpus 可能不仅指包含段落和句子的整个文档,还可以比较单个句子或字符串数​​组中的项目。另一个仅供参考,请参阅this How does TfidfVectorizer work in layman's terms article
  • 谢谢。所以我的问题是我们如何使用 tf-idf 来比较两个文档网,因为它总是 log(2/2) 或 log(1/2)? log(2/2) 为 0。这意味着如果两个文档中都有一个术语,则 tf-idf 将只是 tf * (1+0)
  • @Ravindu 这里的重点是计算两个文档的 TF-IDF 向量的点积,然后除以它们的范数乘积。这是一篇关于calculating cosine similarity step by step in Pythonhere is a Java version 的好文章。
  • 但在每个示例中,他们都针对超过 2 个文档搜索文本。我要说的是,如果我想找到 2 个文档之间的相似性,而不是仅使用余弦相似性,我们如何使用 IF-IDF?在余弦相似度中,我们可以通过查找两个文件中出现的每个单词来创建一个向量,并为此使用余弦算法。但是我们如何使用 TF-IDF 来解决这个问题呢?附言对不起,如果我让这太复杂了
猜你喜欢
  • 2012-04-27
  • 2017-02-03
  • 2019-09-04
  • 2012-05-03
  • 2010-12-31
  • 2017-02-02
  • 2016-06-29
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多