【问题标题】:What is the best (word or character)-based diff algorithm out there?最好的基于(单词或字符)的差异算法是什么?
【发布时间】:2013-12-28 06:42:47
【问题描述】:

所以,我希望能够在每个单词的基础上找到两个字符串之间的差异(可能比每个字符更快,但是,如果每个字符更快,那么我想这样做) .

这是我想要实现的示例: 原文:

Hello there!

修改文本:

Helay scere?

差异:

Hel[lo](ay) [th](sc)ere[!](?)
  • 括号内的文字是删除的内容,括号内的文字是添加的内容

有一种使用命令行工具(例如opendiff)的超级黑客方式来完成此操作,但它需要在每个字符之间添加一个换行符,因为 opendiff 是基于行的。

我正在使用 ruby​​,但还没有找到任何工具来执行此操作...但是语言并不是非常重要,因为算法可以很容易地移植。

谢谢。

【问题讨论】:

  • 因为您提到了现有工具,所以我应该指出 wdiff(单词 diff)和 dwdiff(分隔单词 diff)unix 实用程序。我已经将一些 unix 实用程序与 bash 结合在一起,以将 dwdiff 转换为半图形工具here。源 cmets 显示了几种使用它的方法。

标签: ruby string algorithm merge diff


【解决方案1】:

您可能需要检查:http://en.wikipedia.org/wiki/Longest_common_subsequence_problem。实施起来并不难。

【讨论】:

    【解决方案2】:

    看看https://github.com/pvande/differ。这颗宝石可以满足您的需求

    【讨论】:

      【解决方案3】:

      因此,您可以重复使用 LCS(如上链接)来查找所有常见字符串,并将它们从两个字符串中删除,用其他字符串替换它们 - 让我们说一个“*”。然后你同时遍历这两个字符串,并将共同的和不同的重新组合在一起。

      例子

      A) Hello there!
      B) Helay scere?
      
      LCS detection gives us ["Hel"," ","ere"], and after replacement we have
      A) *lo*th*!
      B) *ay*sc*?
      
      Now you split on the delimiter ("*") giving you
      A) ["lo","th","!"]
      B) ["ay","sc","?"]
      

      从这里你就可以进行简单的网格划分了。需要注意的关键是可能存在空条目,例如,如果您在“Hell”和“Hel”上执行此方法,您最终会得到 ​​p>

      Common LCS) ["Hel"]
      A) ["l"]
      B) [""]
      
      meaning your result will be Hel[l]() 
      

      希望这是可以接受的。

      【讨论】:

        【解决方案4】:

        这是一个可以区分字符串的红宝石:http://rubydoc.info/gems/diff-lcs/1.1.3/frames

        之前,我只是(在 irb 中)

        require 'rubygems'
        require 'diff/lcs'
        require 'diff/lcs/array'
        require 'diff/lcs/string'
        

        因此,由于这个 2D 差异数组的更改,编写插入、内联删除和插入标记的逻辑变得微不足道。

        虽然我不确定这是否是最好的方法。

        【讨论】:

          【解决方案5】:

          一个解决方案是找到字符串之间的编辑距离。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            • 1970-01-01
            • 2019-02-07
            • 2014-03-06
            • 2011-06-26
            • 2019-12-08
            相关资源
            最近更新 更多