从字符串编辑距离到字符串对齐

(一)字符串编辑距离

字符串编辑距离,也称莱文斯坦距离,它是指把一个字符串变为另一个字符串需要的最小操作步数,每一步可以在“一个字符串”上做以下三种操作之一:

(1)插入一个字符;

(2)删除一个字符;

(3)修改一个字符。

计算编辑距离的常见方法是动态规划,思路是这样的:

(1)首先找到动态规划里的状态。我们可以计算word1(第一个字符串)的前i个字符组成的子字符串到word2(第二个字符串)的前j个字符的编辑距离(当i和j分别等于word1和word2的长度时,实际上就是计算word1到word2的编辑距离),我们用一个符号表示这个意思:

d(i,j)

这就是状态。

(2)然后寻找状态转移方程。假设word1的最后一个字符为c1,word2的最后一个字符为c2。

当c1等于c2时,有:

d(i,j)=d(i-1,j-1);

c1不等于c2时,就需要一步操作来改变word1使之与word2匹配,我们可以在c1后面插入一个字符c2,这时:

d(i,j)=d(i,j-1)+1;(加1是因为当前这一步操作)

或者,删除c1,这时:

d(i,j)=d(i-1,j)+1;

又或者将c1改为c2,这时:

d(i,j)=d(i-1,j-1)+1。

因为我们需要的是最小步数,所以,我们希望:

d(i,j)=min(d(i-1,j-1)d(i,j-1)+1d(i-1,j)+1d(i-1,j-1)+1)。

这就是状态转移方程。

另外还有两个一眼就能看出的编辑距离:

(1)当word1为空时,最短编辑距离就是len2(word2的长度),也就是len2次插入操作;

(2)当word2为空时,最短编辑距离就是len1(word1的长度),也就是len1删除操作。

我们可以用一个(len1 + 1) x (len2 + 1)的矩阵dMatrix来存储所有的d(i,j),这时dMatrix[len1][len2]存储的就是word1到word2的最小编辑距离。

举个例子:

word1=XGYXYXYX

word2=XYXYXYTX

我们根据“两个一眼就能看出的编辑距离”填充dMatrix矩阵的一部分,得到如下的矩阵:


根据上面的分析,d(i,j)总是是可以根据d(i-1,j-1)d(i,j-1)d(i-1,j)之一计算出来的,计算的方式就是上面给出的状态转移方程,所以,我们可以首先计算出下图中红色数字:


然后,一行一行地计算出矩阵中所有的值,计算的顺序如下图所示:


最终结果如下图所示:

(二)字符串对齐

我现在能想到的字符串编辑距离的唯一用途就是用来对齐字符串了。这里的对齐字符串,既不是左对齐,也不是右对齐,而是让两个字符串中相同的字符串彼此对应上。举个例子。假设我们需要对齐上面的两个字符串:

word1=XGYXYXYX

word2=XYXYXYTX

对齐的结果是:

word1=XGYXYXY_X
word2=X_YXYXYTX

这里,word1里下划线表示相应位置需要插入一个字符,word2里的下划线表示相应的word1位置上的字符应该被删除,如果word1某个位置的字符和word2相应位置的字符不一样且都不是下划线,则表示这里是一个修改操作。

那么,如何使字符串对齐呢?这就要用到字符串编辑距离矩阵了。我们从矩阵dMatrixdMatrix[len1][len2]位置出发,不断寻找下一个位置,下一个位置就是d(i-1,j-1)d(i,j-1)d(i-1,j)中使得dMatrix[len1][len2]最小的那个,这也就是寻找下一个位置方式。整个寻找下一个位置的过程,就是寻找得到word1到word2最小编辑距离经过的所有“状态”(动态规划里的状态)的过程。结果是,得到一条状态链。针对上面的例子,我们得到下面这个状态链:

[i=8, j=8], [i=7, j=7], [i=7, j=6], [i=6, j=5], [i=5, j=4], [i=4, j=3], [i=3, j=2], [i=2, j=1],  [i=1, j=1], [i=0, j=0]

我们可以根据这个状态链来获得word1变为word2的所有操作信息。比如,从[i=8, j=8]到[i=7, j=7],因为i和j都减少了1,所以存在两种情况,相应的字符对一样,或者这里有一次修改操作;[i=7, j=7]到 [i=7, j=6],因为i不变,j少了1,说明这里有一次插入操作;[i=2, j=1]到[i=1, j=1],因为i少了1,j不变,说明这里有一次删除操作。利用这些信息,我们就可以对齐字符串了。

最近在学习从网页中抽取有用数据,而字符串对齐就是其中遇到的关键技术之一,用于寻找字符串中的模式。比如,我们有很多CSDN博客的源码,字符串对齐可以用于寻找CSDN给我们提供的博客框架。

字符串对齐的源码可以在这里下载:

https://github.com/l294265421/algorithm-general(代码在项目的levenshteinDistance包下)

参考书籍:

《Web数据挖掘》第二版,作者:Bing Liu,译者:俞勇



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值