2016-11-23 140 views
2

我的目标是找到两个文档(单词集合)之间的相似度值。我已经找到了几个答案,如this SO postthis SO post,它们提供了Python库来实现这个功能,但是我很难理解这种方法并使其适用于我的用例。Java:如何使用TF-IDF来计算两个文档的相似度?

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

在我的情况下,我没有一个特定的搜索词,我想与文档进行比较,但我有两个不同的文档。我假设我需要首先计算文档的向量,然后在这些向量之间取余弦。但是我在构建这些向量时发现的所有答案总是假定一个搜索词,我没有这个搜索词。

无法包装我的头,任何概念上的帮助或链接到达到此目的的Java库将不胜感激。

+1

运行一个术语提取之前,并且一旦你有两个语料库的词频清单,计算[余弦相似度](https://en.wikipedia.org/wiki/Cosine_similarity)。 –

+0

@WiktorStribiżew:谢谢你的建议。所以我将这两个文档的条款解析成一个列表。然后,对于每个术语,我计算两个文档中每个文档的tf-idf值,这给了我两个向量,从中我可以计算余弦相似度。我是否正确理解这一点? – gmazlami

+1

是的,基本上就是这样做。根据术语频率,得到向量TF-IDF,并计算余弦相似度。此外,请确保使用词干来标准化您提取的单词形式以减少噪音。 –

回答

2

我建议首先运行术语提取以及它们的频率。请注意,词干化也可以应用于提取的词语,以避免在随后的计算过程中出现噪音。请参阅Java library for keywords extraction from input text SO线索以获取更多帮助和建议。然后,就像你自己提到的那样,对于这些术语中的每一个,你将不得不计算TF-IDF值,得到向量并计算余弦相似度。

当计算TF-IDF,记住,1 + log(N/n)Ñ静置语料库的总数和n静置包括该术语语料库的数目)式是更好,因为它避免了问题,当TF不为0 IDF结果等于0.

相关问题