我正在尝试按短语区分两个字符串,类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式。执行此操作的算法是什么?是否有 gems 或其他标准库可以实现此目的?
编辑:我见过其他比较算法(Differ http://github.com/pvande/differ/tree/master与 Ruby),它们似乎会产生以下结果:
>> o = 'now is the time when all good men.'
>> p = 'now some time the men time when all good men.'
>> Differ.diff_by_word(o,p).format_as(:html)
=> "now <del class=\"differ\">some</del><ins class=\"differ\">is</ins>
<del class=\"differ\">time </del>the <del class=\"differ\">men </del>time
when all good men."
请注意单词如何在每个单词的基础上进行区分?我想要一些按短语进行更多差异的方法,因此上面的代码输出:
=> "now <del class=\"differ\">some time the men</del><ins class=\"differ\">is
the</ins> time when all good men."
我是不是希望太多了?
您正在寻找的算法是最长公共子序列 http://raa.ruby-lang.org/project/diff-lcs/它会为您完成大部分工作。
轮廓就是这样的。
- 按单词拆分(输入、输出)
- 计算输入/输出数组的 LCS。
- 穿过阵列并智能地连接区域。
例如,假设您有:
“你好世界,这是一个测试”
和....相比:
“先生,你好,世界”
LCS 的结果是
- “先生”+
- “你好”=
- “世界”=
- “这” -
- "is" -
- "a" -
- "test" -
现在你在建造时撒上特殊的酱汁。您将绳子连接在一起,同时注意之前的动作。朴素的算法只是连接具有相同操作的部分。
最后将其转换为 html:
<ins>mister</ins> hello world <del>this is a test</del>
当然,问题在于细节:
- 您需要考虑如何处理标签
- 你比较markdown还是html
- 是否存在 UI 不再有意义的边缘情况。
- 您需要对标点符号进行特殊处理吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)