【问题标题】:Edit distance algorithm explanation编辑距离算法说明
【发布时间】:2015-12-09 15:10:14
【问题描述】:

根据维基百科,计算两个字符串 a 和 b 之间的 Levenshtein 距离的递归公式的定义如下:

我不明白为什么我们不考虑删除a[j] 或插入b[i] 的情况。另外,如果我错了,请纠正我,插入的情况与删除的情况不一样吗?我的意思是,我们可以在第二个字符串中插入相同的字符,而不是从一个字符串中删除一个字符,反之亦然。那么为什么不将插入/删除操作合并为一个成本等于min{cost_insert, cost_delete} 的操作呢?

【问题讨论】:

  • 我认为 Levenshtein 距离更容易理解,如果你从一个字符串开始,然后通过操作将它变成另一个字符串。因此,需要插入和删除。
  • 我认为在编辑距离问题中,我们可以在两个字符串中执行编辑...

标签: algorithm dynamic-programming edit-distance


【解决方案1】:

这没有完成,因为您不能同时编辑这两个字符串。编辑距离的定义(来自维基百科)是:

将 a 转换为 b 的最小权重系列编辑操作。

因此,您正在专门寻找(权重)要对字符串 a 执行的一系列操作,以将其转换为字符串 b

另外,编辑距离不一定是对称的。如果插入和删除的成本相同,则距离是对称的:d(a,b) = d(b,a)

以维基百科为例,但成本不同:

  • 插入成本:w_ins = 1
  • 删除成本:w_del = 2
  • 替换成本:w_sub = 1

kitten坐着的距离还是3,

kitten -> sitten  (substitution k->s, cost 1)
sitten -> sittin  (substitution e->i, cost 1)
sittin -> sitting (insertion of g, cost 1)
=> d(kitten, sitting) = 3

但是坐着小猫的距离不是:

sitting -> kitting  (substitution s->k, cost 1)
kitting -> kitteng  (substitution i->e, cost 1)
kitteng -> kitten (deletion of g, cost 2)
=> d(kitten, sitting) = 4

你看到d(kitten, sitting) != d(kitten, sitting)

另一方面,如果您确实使用对称成本,就像 Levenshtein 距离(它是具有单位成本的编​​辑距离)所做的那样,您可以假设 d(a,b) = d(b,a) 成立。那么你也不会通过考虑相反的情况来赢得任何东西。你丢失的是哪个字符在哪个字符串中被替换的信息,这使得之后提取操作序列变得更加困难。

您在问题中显示的Wagner-Fisher algorithm 可以通过以最小成本回溯路径从 DP 矩阵中提取它。考虑 tofoo 之间的这两个带有单位成本的编​​辑矩阵:

  t o       f o o
f 1 2     t 1 2 3
o 2 1     o 2 1 2
o 3 2

请注意,如果您转置d(to, foo) 的矩阵,则会得到d(foo, to) 的矩阵。请注意,这样,第一个矩阵中的插入变为第二个矩阵中的删除,反之亦然。所以这就是你正在寻找的这种对称性再次出现的地方。

我希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    如果插入和删除的成本不同,则在一个字符串中插入与从另一个字符串中删除是不同的。即使是替换的成本也可能与插入+删除的成本不同,明智的做法是将它们分开。

    问题通常是不对称的:你有一个有效字符串列表,并且你想匹配另一个有错误的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-13
      • 2016-11-21
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      相关资源
      最近更新 更多