C# 文本差分算法

C# 文本差分算法,c#,python,diff,C#,Python,Diff,我需要一种算法,可以比较两个文本文件并突出它们的差异,并且(甚至更好!)能够以有意义的方式计算它们的差异(就像两个相似的文件应该比两个不同的文件具有更高的相似性分,在正常术语中定义“相似”一词)。这听起来很容易实现,但事实并非如此 实现可以是c#或python 谢谢。看看。(Python) 这将以各种格式计算差异。然后可以使用上下文差异的大小来衡量两个文档的不同程度?如果需要比行更细的粒度,可以使用Levenshtein距离。Levenshtein距离是一种直接测量两个文本相似程度的方法。 您还

我需要一种算法,可以比较两个文本文件并突出它们的差异,并且(甚至更好!)能够以有意义的方式计算它们的差异(就像两个相似的文件应该比两个不同的文件具有更高的相似性分,在正常术语中定义“相似”一词)。这听起来很容易实现,但事实并非如此

实现可以是c#或python

谢谢。

看看。(Python)


这将以各种格式计算差异。然后可以使用上下文差异的大小来衡量两个文档的不同程度?

如果需要比行更细的粒度,可以使用Levenshtein距离。Levenshtein距离是一种直接测量两个文本相似程度的方法。
您还可以使用它来提取编辑日志,并可以创建一个非常细粒度的diff,类似于SO的编辑历史页面上的diff。 不过,请注意,Levenshtein距离的计算可能会占用大量CPU和内存,因此,正如道格拉斯·莱德(Douglas Leder)所建议的,使用difflib很可能会更快


参见。

如上所述,使用difflib。一旦你有了不同的输出,你可能会发现不同字符串的不同程度,从而给出一个不同程度的“值”。

包含一个替代的差异算法,称为(该页面上的注释中有更多信息),它声称比传统的差异算法更好。bazaar发行版中的文件“patiencediff.py”是一个简单的命令行前端。

我建议大家看看Neil Fraser的代码和文章:

目前在Java中可用, JavaScript、C++和Python。不管 在语言方面,每个库都具有 相同的API和相同的功能。 所有版本都有全面的 测试线束


-对于理论和实施说明

有许多距离度量,如paradoja所述,有Levenshtein距离,但也有和。在Python实现方面,我使用过和以前使用过。两者都很好,因为你得到了一个单独的数字作为分数。首先查看ADVAS,它实现了一系列算法。

在Python中,正如其他人所建议的那样

difflib
提供该类,该类可用于提供相似性比率。示例函数:

def text_compare(text1, text2, isjunk=None):
    return difflib.SequenceMatcher(isjunk, text1, text2).ratio()

我目前的理解是,最短编辑脚本(SES)问题的最佳解决方案是Myers“中间蛇”方法和Hirschberg线性空间精化

迈尔斯算法描述如下:

E.迈尔斯,“O(ND)差异 算法及其变体,“
算法1,2(1986),251-266

gnudiff实用程序使用Myers算法

你所说的“相似性分数”在文献中称为“编辑距离”,它是将一个序列转换为另一个序列所需的插入或删除次数

请注意,许多人引用了Levenshtein距离算法,但这虽然容易实现,但不是最佳解决方案,因为它效率低下(需要使用可能巨大的n*m矩阵),并且不提供“编辑脚本”这是可用于将一个序列转换为另一个序列的编辑序列,反之亦然

要获得良好的Myers/Hirschberg实施,请查看:

它所包含的特定库不再维护,但据我所知,diff.c模块本身仍然是正确的


迈克

你可以用这个。另请参阅关于优化此解决方案的可能方法的讨论。

我为不同功能使用的一种方法,用于计算修改后的文件中有多少新数据,可能也适用于您

我有一个diff/patch实现C#,它允许我获取两个文件,可能是同一文件的旧版本和新版本,并计算“差异”,但不是通常意义上的差异。基本上,我计算了一组可以在旧版本上执行的操作,以更新它,使其具有与新版本相同的内容

为了将其用于最初描述的功能,为了查看有多少数据是新的,我简单地运行了这些操作,对于从旧文件逐字复制的每个操作,其系数为0,对于插入新文本的每个操作(作为补丁的一部分分发,因为它没有出现在旧文件中),其系数为1。所有字符都被赋予了这个工厂,它基本上给了我一个0和1的长列表

然后我所要做的就是把0和1加起来。在您的情况下,在我的实现中,与0相比,1的数量少意味着文件非常相似

此实现还将处理修改后的文件无序插入旧文件副本的情况,甚至是重复的情况(即,从文件开头复制一个部分并将其粘贴到底部附近),因为它们都是旧文件中相同原始部分的副本

为了给复制/粘贴操作带来一些“新因素”,我尝试了称重副本,因此第一个副本被计算为0,而相同字符的后续副本的因子逐渐增加,但由于项目被废弃,我一直没有完成

如果您感兴趣,可以从Subversion存储库中获取我的差异/补丁代码。

查看该模块。它有基于soundex、NYSIIS和双变音的快速(用C编写)算法


一个很好的介绍可以在以下网址找到:

我想你需要在最后添加一个链接到该Cf.:-)只是想澄清一下,你是在要求文本相似性还是语义相似性?文本相似性。我认为语义相似性还有很长的路要走:)没那么难。一个简单的文字袋模型有很长的路要走。