本篇内容将讲述Edit Distance(编辑距离),具体包括4个方面:
Defining Minimum Edit Distance
Computing Minimum Edit Distance
Backtrace for Computing Alignments
Weighted Minimum Edit Distance
Definition of Minimum Edit Distance
Minimum Edit Distance是用于衡量从字符串x变到y所需的基本操作的步数,基本操作包括:
- Insertion(插入)
- Deletion(删除)
- Substitution(替换)
如上图所示,d代表删除操作,s代表替换操作,i代表插入操作。(为了简单起见,后面的Edit Distance 简写为ED)
如果每种操作的cost为1,那么ED = 5.
如果s操作的cost为2(即Levenshtein Distance),ED = 8.
Computing Minimum Edit Distance
如何找到两个strings的minimun edit distance呢?把一个string转换为另一个string可以有很多种方法(或者说“路径“)。
对于两个字符串,X的长度为n,Y的长度为m,定义D(i,j)为X的前i个字符与Y的前j个字符之间的距离,X和Y的距离可以用D(n,m)表示。容易想到,这个问题是具有重复子问题和最优子结构性质的,动态规划就可以大展身手了。
算法过程如下图所示(采用Levenshtein Distance即替换的成本为2):
下图是对字符串 INTENTION 和 EXECUTION执行动态规划过程形成的表。
容易看出, INTENTION 和 EXECUTION之间的Minimum Edit Distance为8
Backtrace for Computing Alignments
利用动态规划算法求得Minimum Edit Distance后,可以通过Backtrace ED的计算过程得到两个字符串之间的编辑过程。D(i,j)的取值来源有三种,D(i-1,j)、D(i,j-1)、D(i-1,j-1),下表通过添加箭头的方式显示出整个过程(下面的阴影表示的只是一种路径)
实现寻找路径的思想也很简单,在计算ED的时候给每个单元格定义一个指向标志,指向当前单元格来源LEFT/DOWN/DIAG
Adding Backtrace to Minimum Edit Distance
算法的时间复杂度和空间复杂度均为O(nm)
Weighted Minimum Edit Distance
在拼写中,某些字母更容易出错(键盘布局),或者一些删除、插入操作更频繁,可以在计算ED时加入权重
上图所示的混淆矩阵,数值代表被误写的可能性
Weighted Minimum Edit Distance