严格文档相似性的文本相似度函数

时间:2010-02-25 13:51:52

标签: java algorithm information-retrieval string-matching similarity

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

这两个文件很可能是相同的,或者彼此略有不同,因为它们有许多共同的特征,如日期,位置,创建者等,但是它们的文本决定了它们是否确实存在。< / p>

我希望两个文档的文本非常相似或者根本不相似,所以我可以对设置相似性的阈值进行相当严格的规定。例如,我可以说这两个文件只有在他们有90%的共同词时才相似,但我希望有一些更强大的东西,这对短文和长篇文章都适用。

总结一下,我有:

  • 两个文件,非常相似或完全不相似,但是:
  • 这两个文件更有可能与
  • 相似
  • 文件既可以是长篇(有些段落),也可以是短篇(几篇句子)

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

我可能的候选人是:

  • Levenshtein:它的输出对短文来说更重要
  • 重叠系数:也许,但是它能否很好地区分不同长度的文件?

同样考虑两个文本只有在完全相同的情况下相似才会有效,因为我希望只有几个单词的文档才能通过相似性测试。

4 个答案:

答案 0 :(得分:3)

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

我会从这里开始:http://c2.com/cgi/wiki?DiffAlgorithm。它们提供了许多可以查看的差异式算法的链接。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

Levenshtein距离是一个标准尺度的原因:它易于计算并且易于掌握其含义。如果您对长文档中的字符数保持警惕,则可以在单词或句子甚至段落而不是字符上计算它。由于您希望类似的对非常相似,所以它仍然可以正常工作。

答案 3 :(得分:1)

Levenshtein似乎是最好的解决方案。如果你试图获得一个加权的相似性排名 - 我想是因为你提到Levenshten的输出对于较短的文本更重要 - 然后只需用levenshtein算法的结果除以文档。