Java:如何使用TF-IDF计算两个文档的相似性?

Java:如何使用TF-IDF计算两个文档的相似性?,java,nlp,tf-idf,Java,Nlp,Tf Idf,我的目标是找到两个文档(单词集合)之间的相似值。我已经找到了几个类似或的答案,它们提供了实现这一点的Python库,但是我很难理解这种方法,也很难使它适用于我的用例 如果我理解正确的话,文档的TF-IDF是根据给定的术语计算的,对吗?这就是我对它的解释:“tf idf…是一个数字统计,旨在反映一个单词对文档的重要性” 在我的例子中,我没有要与文档进行比较的特定搜索词,但我有两个不同的文档。我假设我需要首先计算文档的向量,然后取这些向量之间的余弦。但是我找到的关于构造这些向量的所有答案都假设了一个

我的目标是找到两个文档(单词集合)之间的相似值。我已经找到了几个类似或的答案,它们提供了实现这一点的Python库,但是我很难理解这种方法,也很难使它适用于我的用例

如果我理解正确的话,文档的TF-IDF是根据给定的术语计算的,对吗?这就是我对它的解释:“tf idf…是一个数字统计,旨在反映一个单词对文档的重要性”

在我的例子中,我没有要与文档进行比较的特定搜索词,但我有两个不同的文档。我假设我需要首先计算文档的向量,然后取这些向量之间的余弦。但是我找到的关于构造这些向量的所有答案都假设了一个搜索项,在我的例子中没有

对此我不能掉以轻心,任何概念上的帮助或指向Java库的链接都将不胜感激。

我建议先运行术语提取,并附上它们的频率。请注意,词干分析也可以应用于提取的术语,以避免在后续计算过程中出现噪声。有关更多帮助和想法,请参阅SO线程

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


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

在,一旦你有了这两个语料库的术语列表及其频率,就可以计算出它们的频率。@Wiktor Stribiżew:谢谢你的建议。因此,我将这两个文档的术语提取到一个列表中。然后对于每一项,我计算两个文档的tf-idf值,这给了我两个向量,我可以从中计算余弦相似性。我理解正确吗?是的,基本上就是这样做的。根据术语频率,获得向量TF-IDF,并计算余弦相似度。另外,请确保使用词干处理来规范化提取的单词形式,以减少噪音。非常感谢您提供的提示。我会试试这个。只是想澄清一下,在日志(N/N)中,N是文档的总数,N是文档的总数。包括“对”这个词吗?因此,如果我们在两个文档之间执行此操作,如问题中所述,那么该值是否总是为log(2/2)或log(1/2)?@Ravindu是的,是的。请注意,通过语料库,我们不仅可以指充满段落和句子的完整文档,还可以比较单个句子或字符串数组中的项目。再告诉你一次,谢谢。所以我的问题是,既然总是log(2/2)或log(1/2),我们如何使用tf-idf来兼容两个文档网?日志(2/2)为0。whcih的意思是,如果两个文件中都有一个术语,那么tf-idf就是tf*(1+0)@Ravindu,这里的点是计算两个文件的tf-idf向量的点积,然后除以它们的范数的乘积。这是一篇关于和的好文章,但在每个例子中,他们都会根据两个以上的文档搜索文本。我想说的是,如果我想找到两个文档之间的相似性,而不是仅仅使用余弦相似性,我们如何使用if-IDF?在余弦相似中,我们可以通过查找两个文件中出现的每个单词来创建一个向量,并使用余弦算法。但我们如何使用TF-IDF来解决这个问题?如果我把这件事弄得太复杂了,对不起