Java 用于严格文档相似性的文本相似性函数

Java 用于严格文档相似性的文本相似性函数,java,algorithm,information-retrieval,string-matching,similarity,Java,Algorithm,Information Retrieval,String Matching,Similarity,我正在编写一个java软件,它必须对UTF-8编码的两个文档的相似性做出最终判断 这两个文档很可能是相同的,或者彼此略有不同,因为它们有许多共同的特性,如日期、位置、创建者等,但它们的文本决定了它们是否真的存在 我希望这两个文档的文本要么非常相似,要么根本不相似,因此我可以对相似性的阈值进行严格设置。例如,我可以说这两个文档只有在它们有90%的单词相同的情况下才是相似的,但我希望有一个更健壮的文档,它适用于短文本和长文本 总而言之,我有: 两份文件,非常相似或根本不相似,但: 这两份文件更可能

我正在编写一个java软件,它必须对UTF-8编码的两个文档的相似性做出最终判断

这两个文档很可能是相同的,或者彼此略有不同,因为它们有许多共同的特性,如日期、位置、创建者等,但它们的文本决定了它们是否真的存在

我希望这两个文档的文本要么非常相似,要么根本不相似,因此我可以对相似性的阈值进行严格设置。例如,我可以说这两个文档只有在它们有90%的单词相同的情况下才是相似的,但我希望有一个更健壮的文档,它适用于短文本和长文本

总而言之,我有:

  • 两份文件,非常相似或根本不相似,但:
  • 这两份文件更可能相似
  • 文档可以是长的(某些段落)也可以是短的(几句话)
我曾经尝试过,它有大量的字符串匹配函数,但我最感兴趣的是关于可能使用的算法的建议

我可能的候选人有:

  • Levenshtein:它的输出对于短文本更重要
  • 重叠系数:可能吧,但它能很好地区分不同长度的文档吗

同时,如果只考虑两个文本完全相同的情况下才考虑它们的相似性,则效果不理想,因为我希望仅在几个单词之间存在差异的文档能够通过相似性测试。

Levenshtein距离是一个标准度量,原因是:它易于计算,易于理解文本的含义。如果您担心长文档中的字符数,您可以只计算单词、句子甚至段落,而不是字符。由于您希望相似的对非常相似,因此这应该仍然有效。

Levenshtein似乎是这里的最佳解决方案。如果您试图获得加权相似性排名(我猜是这样的,因为您提到Levenshten的输出对于较短的文本更重要),那么只需将levenshtein算法的结果除以文档中的字符数即可加权。

levenshtein适合编辑距离在两个词之间;如果您正在比较文档,像diff这样的东西可能更符合您的需要


我将从这里开始:。它们提供了许多不同风格算法的链接,您可以查看这些算法。

Levenshtein距离用于比较两个单词。对于文档,常用的方法是余弦相似性或潜在语义分析。

您几乎总是要比较两个文档,还是有N个文档,您想在它们之间进行成对相似性比较?我有N个文档,其中N个非常低(1-4),我想将它们与一个文档进行比较(我们称之为“原始文件”)我一个接一个地同意这一点。在整个文档上使用Levenshtein是很可怕的。如果你有N个文档,并且你想进行成对的相似性度量,那就更像是最近邻类型的搜索了。也许可以区分查找更改的区域,然后在这些区域之间使用Levenshtein?作为奖励,那么,y你只是在文档的一小部分上运行精细的算法。@Chamelaeon:听起来很有趣,我喜欢你的建议是的,可能是因为文档之间存在一些差异,这是可行的。此外,当存在许多差异时,当Levenshtein距离变得太大时,我可能会提前返回false。