3

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

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

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

总结一下,我有:

  • 两份文件,要么非常相似,要么根本不相似,但是:
  • 两份文件更可能相似
  • 文档可以很长(一些段落)也可以很短(一些句子)

我已经尝试过simmetrics,它有大量的字符串匹配函数,但我最感兴趣的是关于可能使用的算法的建议。

我有可能的候选人是:

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

此外,仅当它们完全相同时才考虑两个相似的文本不会很好,因为我希望只有几个单词不同的文档通过相似性测试。

4

4 回答 4

3

Levenshtein 适用于两个词之间的编辑距离;如果您正在比较文档,则 diff 之类的内容可能更符合您的需要。

我将从这里开始:http ://c2.com/cgi/wiki?DiffAlgorithm 。它们提供了一些您可以查看的 diff 风格算法的链接。

于 2010-02-25T14:33:01.590 回答
2

Levenshtein 距离用于比较两个单词。当它是文档时,流行的方法是余弦相似度或潜在语义分析。

于 2012-09-05T11:27:56.243 回答
1

Levenshtein 距离是标准度量的原因是:它易于计算且易于掌握其含义。如果您对长文档中的字符数持谨慎态度,您可以只根据单词或句子甚至段落而不是字符来计算它。由于您希望相似的配对非常相似,因此应该仍然可以正常工作。

于 2010-02-25T14:18:51.213 回答
1

Levenshtein 似乎是这里最好的解决方案。如果您试图获得加权相似度排名 - 我猜是这种情况,因为您提到 Levenshten 的输出对于较短的文本更重要 - 那么只需通过除以字符数来加权 levenshtein 算法的结果文档。

于 2010-02-25T14:29:06.497 回答