【问题标题】:Stackoverflow's text diff [duplicate]Stackoverflow的文本差异[重复]
【发布时间】:2014-06-05 17:34:09
【问题描述】:

当我去(例如)这里的评论部分时, 我看到了这些格式精美的文本差异:

或组合一个:

现在,这到底是怎么做到的?我很想将它包含在我的网站中,但我无法真正弄清楚算法。这是在某处记录的吗? 有没有一个开源的实现,最好是PHP

感谢您的帮助。

【问题讨论】:

  • 我在这里有一系列关于该主题的文章:devdirective.com/post/91/… - 涉及的代码是用 C# 编写的,但理论应该相对容易在任何编程语言中实现。
  • Longest common subsequence。找到text1text2的共同点,剩下的就是红/绿标的,看是原版还是新版。
  • @LasseV.Karlsen 这看起来确实很简单,谢谢。
  • 其中当然有缺陷...看看它说 work 变成 to work 的地方,而实际上应该只是一个 到添加

标签: algorithm diff


【解决方案1】:

从您发布的图像和我自己的(尽管经验很少)看来,该网站似乎使用了对最长公共子序列算法的修改。这就解释了为什么它从不显示单词的重新排列/改组。

第一个修改是,他们不再将字母视为原子单位,而是将单词视为原子单位。 (也是标点符号)

其次,该算法相对幼稚,它指出您实际上只是在其中插入 a 时划掉了“工作”。它似乎只是标记任何类型的中断(插入、删除、修改)并划掉一个单词或整个中断部分。

第三,第二个列表中不属于第一个列表的所有内容都标记为绿色。

似乎比较容易实现。查看一些关于动态编程的教程。

【讨论】:

  • 如果我区分例如“程序”到“重新编程”,使用单词作为原子单位会不会有错误的输出?它会被视为两个完全不同的字符串,对吧?
  • @cypher 正确。它将被视为不同的字符串。如果您不使用单词作为原子单位,则诸如 host 和诚实之类的单词也会将 host 显示为 LCS,这可能是不可接受的。这取决于您如何定义差异。在一个思路上,把“program”改成“reprogram”最好是把整个词删掉。这样可以减少混乱并提高可读性。
  • 我想包含的网站部分是校对员检查和改进用户的文章,所以我们主要讨论语法和文体差异,在这种情况下,我认为我不应该考虑单词原子单元(主要用于语法目的),但我肯定会尝试这两种方法。
  • @cypher 我给了你 SO 似乎正在使用的技术。我建议您阅读其他一些编辑距离 (wiki) 指标以了解其他方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2011-09-09
  • 2013-07-10
相关资源
最近更新 更多