3

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

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

我期望这两个文件的文本要么非常相似,要么根本不相关,所以我可以对设置相似性的阈值相当严格。例如,我可以说,只有当他们有90%的词汇是共同的时候,这两个文档才是相似的,但我希望有更强大的东西,这对短期和长期的文本都有效。

概括起来,我有:

  • 两个文件,要么非常相似或不相似的,而是:
  • 它更可能为两个文件比不
  • 相似文件既可以是长(某些段落)和短期(几个句子)

我已经与simmetrics,其中有一个大阵的字符串匹配功能的尝试,但我最INTERES提出了可能使用的算法的建议。

可能的候选人我是:

  • 莱文斯坦:它的输出更加显著为短文本
  • 重叠系数:也许吧,但它会为不同lenght的文件歧视呢?

同样考虑到两个文本只有当它们完全相同时才会工作得很好,因为我希望只有几个词不同的文档才能通过相似性测试。

+0

你几乎总是会比较两个文件,还是你有N个文件,你想在它们之间做两两相似性比较? – polygenelubricants 2010-02-25 14:22:53

+0

我有N个文档,N非常低(1-4),我想将它们与一个文档(我们称之为“原始文档”)逐一比较 – 2010-02-25 14:39:12

回答

1

Levenshtein距离是一个标准的衡量标准:计算简单,易于理解。如果您对长文档中的字符数量持谨慎态度,则可以使用单词或句子或甚至段落而不是字符进行计算。既然你期望类似的配对是非常类似,那应该仍然运作良好。

+0

是的,也许是由于文件,这个咳嗽的工作。而且,当有很多不同之处时,当Levenshtein距离变得太大时,我可以提早发现错误。 – 2010-02-25 16:37:44

1

Levenshtein似乎是这里最好的解决方案。如果你正在尝试获得一个加权类似度排序 - 我认为是这种情况,因为你提到Levenshten的输出对于较短的文本更重要 - 那么只需用levenshtein算法的结果除以文件。

3

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

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

+2

我同意这一点。 Levenshtein在整个文档中使用都很糟糕。如果你有N个文件,并且你想要进行两两相似度测量,那就特别糟糕。这将表明更像近邻类型搜索的东西。 – polygenelubricants 2010-02-25 14:38:11

+1

也许比较可以找到变化的区域,然后在这些区域之间选择Levenshtein?作为奖励,那么,你只对文件的小部分区域运行快速算法。 – 2010-02-25 15:20:24

+0

@Chamelaeon:听起来很有趣,我喜欢你的建议 – 2010-02-25 16:23:45

2

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