我正在比较字符串以计算它们之间的相似性。最初,我选择了“ Levenshtein距离”算法,但现在发现,这并不是我拥有的那种输入的最佳算法。我的输入字符串可以进行 block-move 操作,这导致非常相似的字符串之间的Levenshtein距离很大。这是两个具有较大编辑距离但本质上相似的字符串的示例:
第一版
Q:选择您喜欢的品种:
- 德国谢泼德
- 梦想
- 可乐
- Rottweiler
- 大丹狗
第二版
问:您最喜欢以下哪个品种:
- 可乐
- 梦想
- 德国谢泼德
- 大丹狗
- Rottweiler
然后我检查了GIT使用的diff实用程序,该IIRC使用Myers算法,但是GIT也遇到无法检测到块移位并将其视为两个删除和插入操作的问题。
对于具有定性但可能具有较大编辑距离的字符串,我还有哪些其他算法可以使我得到较小的距离?如果可以使用C#,VB.NET,C ++或Java实现,甚至可以移植它,那就更好了。
注意:定性并不意味着任何类型的智能内容分析。仍然是客观的,但应仅将块移动视为一次操作,而不是N次操作,其中N是块中的数字字符。