Text 文本比较算法

Text 文本比较算法,text,comparison,diff,compare,Text,Comparison,Diff,Compare,我们在项目中有一个要求,我们必须比较两个文本(update1,update2),并提出一个算法来定义有多少单词和多少句子发生了变化 有什么我可以使用的算法吗 我甚至不是在寻找代码。如果我知道这个算法,我可以用Java编写它。通常,这是通过查找(通常称为LCS问题)来完成的。这就是像diff这样的工具的工作原理。当然,diff是一个面向行的工具,听起来您的需求有些不同。不过,我假设您已经构建了一些比较单词和句子的方法。某种差异变体可能会有所帮助,例如 如果你决定设计你自己的算法,你必须解决插入句子

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

有什么我可以使用的算法吗


我甚至不是在寻找代码。如果我知道这个算法,我可以用Java编写它。

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

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

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

这些人很坏。我讨厌那些男人

这些人很坏。约翰喜欢这些男人。我讨厌那些男人


您的工具应该能够向前看,以识别在第二种情况下,
I hate the men
没有被
John like the men
取代,而是未被触及,并在其前面插入一个新句子。i、 e.它应该报告一个句子的插入,而不是四个单词后的新句子的变化。

diff和大多数其他比较实用程序使用的特定算法是Eugene Myer的。包中提供了它的Java实现。

由subversion的diff引擎使用

供您参考,在github的下一页中有我自己使用各种编程语言的实现


当高效且性能良好地比较大文件时,困难就来了。因此,我实现了Myers O(ND)diff算法的一个变体,该算法执行得非常好且准确(并支持基于正则表达式的过滤):

算法可以在这里进行测试:


主页上还有更多信息:

这里有两篇文章描述了其他文本比较算法,它们通常应该输出“更好”(例如更小、更有意义)的差异:

第一篇论文引用了第二篇,并提到了其算法:

Heckel[3]指出了LCS技术的类似问题,并提出了一个解决方案 检测块移动的线性石灰算法。该算法性能良好 如果字符串中几乎没有重复符号。然而,该算法给出了 否则结果会很差。例如,给定两个字符串aabb和bbaa, Heckel的算法无法发现任何公共子串

在中提到了第一篇论文,在中提到了第二篇论文,这两篇论文都涉及类似的SO问题:


最著名的算法是O(ND)差分算法,也用于记事本++比较插件(用C++编写)和GNU diff(1)。您可以在这里找到C#实现:

diff(1)的前端称为wdiff(1),它可以逐字工作。这是一个了不起的工具!但下载页面不可用(404)。你能告诉我在哪里可以下载吗?