文本比较算法

时间:2012-01-30 14:38:43

标签: text comparison diff compare

我们在项目中要求我们必须比较两个文本(update1,update2)并提出一个算法来定义多少个单词和多少个句子已经改变。

我可以使用任何算法吗?

我甚至都没找代码。如果我知道算法,我可以用Java编写它。

6 个答案:

答案 0 :(得分:17)

通常,这是通过找到Longest Common Subsequence(通常称为LCS问题)来完成的。这就是像diff这样的工具的工作方式。当然,diff是面向行的工具,听起来你的需求有所不同。但是,我假设你已经构建了一些比较单词和句子的方法。

答案 1 :(得分:12)

An O(NP) Sequence Comparison Algorithm由subversion的diff引擎使用。

为了您的信息,我自己在github的后续页面中有各种编程语言的实现。

https://github.com/cubicdaiya/onp

答案 2 :(得分:8)

某种差异变体可能会有所帮助,例如wdiff

如果您决定设计自己的算法,则必须解决插入句子的情况。例如,对于以下两个文档:

The men are bad. I hate the men

The men are bad. John likes the men. I hate the men

您的工具应该能够向前看,以便在第二部分中I hate the men未被John likes the men替换,而是保持不变,并在其之前插入新句子。即它应报告插入一个句子,而不是改变四个单词后跟一个新句子。

答案 3 :(得分:5)

diff和大多数其他比较实用程序使用的特定算法是Eugene Myer的An O(ND) Difference Algorithm and Its Variationsjava-diff-utils包中提供了Java实现。

答案 4 :(得分:5)

以下是两篇描述其他文本比较算法的论文,这些算法通常应该输出更好的' (例如,更小,更有意义)差异:

第一篇论文引用了第二篇论文并提到了它的算法:

  

Heckel [3]指出了LCS技术的类似问题并提出了一个问题   线性 - 石灰算法检测块移动。该算法充分执行   如果字符串中有重复的符号。但是,算法给出了   否则结果不好。例如,给定两个字符串 aabb bbaa ,   Heckel的算法无法发现任何常见的子串。

this answer中提到了第一篇论文,this answer中提到了第二篇论文,这两篇论文都提到了类似的问题:

答案 5 :(得分:0)

最著名的算法是 O(ND) 差分算法,也在 Notepad++ 比较插件(用 C++ 编写)和 GNU diff(1) 中使用。您可以在此处找到 C# 实现: http://www.mathertel.de/Diff/default.aspx