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

标签 java nlp tf-idf

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

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

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

我无法理解这一点,任何概念性帮助或实现这一目标的 Java 库链接都将受到高度赞赏。

最佳答案

我建议首先运行术语提取及其频率。请注意,词干提取也可以应用于提取的术语,以避免后续 cosine similarity 期间出现噪音。计算。请参阅Java library for keywords extraction from input text SO 线程以获得更多帮助和想法。

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

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

关于Java:如何使用TF-IDF计算两个文档的相似度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40766816/

相关文章:

nlp - 余弦相似度涉及嵌入,我们是否必须嵌入整个句子/文本?

scikit-learn - SKLearn TF-IDF 丢弃数字?

python - tfidfvectorizer 根据所有单词打印结果

nlp - 使用SVM时需要TF-IDF吗?

java - 带有 List<String> 的原始类型给出编译错误

java - 错误 java.sql.SQLException : Column 'id' not found

java - Jar(使用gradle任务生成)中的Java文件无法在工作空间中访问

python - 将 csv 行放入嵌套列表中

javascript - 如果该子字符串前面没有特定字符串并忽略整个字符串,则正则表达式匹配该子字符串?

java - Spring实体中的@Embedded列