我们在项目中要求我们必须比较两个文本(update1,update2)并提出一个算法来定义多少个单词和多少个句子已经改变。
我可以使用任何算法吗?
我甚至都没找代码。如果我知道算法,我可以用Java编写它。
答案 0 :(得分:17)
通常,这是通过找到Longest Common Subsequence(通常称为LCS问题)来完成的。这就是像diff
这样的工具的工作方式。当然,diff
是面向行的工具,听起来你的需求有所不同。但是,我假设你已经构建了一些比较单词和句子的方法。
答案 1 :(得分:12)
An O(NP) Sequence Comparison Algorithm由subversion的diff引擎使用。
为了您的信息,我自己在github的后续页面中有各种编程语言的实现。
答案 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 Variations。 java-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