基于动态规划的编辑距离计算公式及应用



https://www.jianshu.com/p/a617d20162cf

1. 编辑距离的定义

编辑距离(Minimum Edit Distance,MED),由俄罗斯科学家 Vladimir Levenshtein 在1965年提出,也因此而得名 Levenshtein Distance。编辑距离一般用于度量两个序列相似程度的指标,具体来说,它计算的是一个序列A最少可以经过多少次操作变成另一个序列。这里的操作包括以下三种:

  1. 插入(Insert)
  2. 删除(Deletion)
  3. 替换(Substitution)

比如字符串australiaaustrian,后者可以由前者进行三次操作得到(2次删除,分别是a和l;一次插入,n);字符串ABCDEAFGE进行3次操作得到。

2. 基于动态规划的求解算法

2.1. 递推公式

对于两个字符串 a , b a,b a,b,记 f ( i , j ) f(i,j) f(i,j) a a a中前 i i i个字符 a [ 0 : i ] a[0:i] a[0:i] b b b中前 j j j个字符 b [ 0 : j ] b[0:j] b[0:j]的编辑距离,则有:
f ( i , j ) = { m a x ( i , j ) , i f   m i n ( i , j ) = 0 m i n { f ( i − 1 , j ) + 1 f ( i , j − 1 ) + 1 f ( i − 1 , j − 1 ) + 1 ( a i ≠ b j ) i f   m i n ( i , j ) ≠ 0 f(i,j)=\left\{ \begin{aligned} &max(i,j),&if\ min(i,j)=0 \\ &min { \left\{ \begin{aligned} &f(i-1,j)+1\\ &f(i,j-1)+1\\ &f(i-1,j-1)+1_{(a_i\neq b_j)} \end{aligned} \right. } &if\ min(i,j)\neq 0 \end{aligned} \right. f(i,j)=max(i,j),minf(i1,j)+1f(i,j1)+1f(i1,j1)+1(ai=bj)if min(i,j)=0if min(i,j)=0
解释:

  • m a x ( i , j ) max(i,j) max(i,j)很好理解,当 i = 0 i=0 i=0时, a [ 0 : i ] a[0:i] a[0:i]变为 b [ 0 : j ] b[0:j] b[0:j]只需要插入 j j j个字符;当 = 0 =0 =0时, a [ 0 : i ] a[0:i] a[0:i]变为 b [ 0 : j ] b[0:j] b[0:j]只需要删除 i i i个字符.
  • f ( i − 1 , j ) + 1 f(i-1,j)+1 f(i1,j)+1表示 a [ 0 : i ] a[0:i] a[0:i]变为 b [ 0 : j ] b[0:j] b[0:j]的一种方式是,先将 a [ 0 : i − 1 ] a[0:i-1] a[0:i1]转变为 b [ 0 : j ] b[0:j] b[0:j],然后删除 a [ i − 1 ] a[i-1] a[i1].
  • f ( i , j − 1 ) + 1 f(i,j-1)+1 f(i,j1)+1表示 a [ 0 : i ] a[0:i] a[0:i]变为 b [ 0 : j ] b[0:j] b[0:j]的一种方式是,先将 a [ 0 : i ] a[0:i] a[0:i]转变为 b [ 0 : j − 1 ] b[0:j-1] b[0:j1],然后插入 b [ j − 1 ] b[j-1] b[j1].
  • f ( i − 1 , j − 1 ) + 1 ( a i ≠ b j ) f(i-1,j-1)+1_{(a_i\neq b_j)} f(i1,j1)+1(ai=bj)表示 a [ 0 : i ] a[0:i] a[0:i]变为 b [ 0 : j ] b[0:j] b[0:j]的一种方式是,先将 a [ 0 : i − 1 ] a[0:i-1] a[0:i1]转变为 b [ 0 : j − 1 ] b[0:j-1] b[0:j1],然后判断 a [ i − 1 ] a[i-1] a[i1] b [ j − 1 ] b[j-1] b[j1]是否相等,若相等,则无需操作,否则需要将 a [ i − 1 ] a[i-1] a[i1]替换为 b [ j − 1 ] b[j-1] b[j1].

上面的第一条是作为初始化,后三条是递推公式的所有情况,所以后三条应该选择操作次数最小的那条。
如果将上述地推过程的中间结果存储下来,则会得到如下图所示的矩阵
在这里插入图片描述

2.2. python代码实现

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        matrix=[[i+j for j in range(len(word2)+1)] for i in range(len(word1)+1)]

        for i in range(1,len(word1)+1):
            for j in range(1,len(word2)+1):
                if word1[i-1]==word2[j-1]:
                    matrix[i][j]=matrix[i-1][j-1]
                else:
                    matrix[i][j]=matrix[i-1][j-1]+1
                matrix[i][j]=matrix[i-1][j]+1 if matrix[i-1][j]+1<matrix[i][j] else matrix[i][j]
                matrix[i][j]=matrix[i][j-1]+1 if matrix[i][j-1]+1<matrix[i][j] else matrix[i][j]
        return matrix[-1][-1]

3. 应用

常见的应用是计算ASR模型的错字率(WER, Word Error Rate),以及nlp里面计算两个文本的相似度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值