编辑距离(LD)计算两个字符串相似度

来源:互联网 发布:软件汇报ppt 编辑:程序博客网 时间:2024/04/29 09:53

【定义】设A和B是两个字符串。将字符串A转换为字符串B所用的最少字符操作数称为字符串A到字符串B的编辑距离。( 这里所说的字符操作包括:删除一个字符,插入一个字符,修改一个字符)

求编辑距离和两个字符串相似度

算法的原理就不做赘述了,记录一下从拿到两个字符串到计算出两个字符串相似度的计算过程。

首先,会有两个字符串这里举例

A串为:GAATTCAGTTA

B串为:GGATCGA


LD具有下列性质:

LD(A,A)=0

LD(A,"")=Len(A)

LD(A,B)=LD(B,A)

0≤LD(A,B)≤Max(Len(A),Len(B))

LD(A,B)=LD(Rev(A),Rev(B))

LD(A+C,B+C)=LD(A,B)

LD(A+B,A+C)=LD(B,C)

LD(A,B)≤LD(A,C)+LD(B,C)

LD(A+C,B)≤LD(A,B)+LD(B,C)


有了这些,然后我们来说一些定义:

A=a1a2……aN,表示A是由a1a2……aN这N个字符组成,Len(A)=N

B=b1b2……bM,表示B是由b1b2……bM这M个字符组成,Len(B)=M

LD(i,j)=LD(a1a2……ai,b1b2……bj),其中0≤i≤N,0≤j≤M

有了这些,不难得到,LD(N,M)=LD(A,B),,,LD(0,0)=0,,,LD(0,j)=j,,,LD(i,0)=i

对于1≤j≤M,1≤i≤N,有如下公式

若ai=bj,则LD(i,j)=LD(i-1,j-1)   取矩阵对角的值

 若ai≠bj,则LD(i,j)=Min(LD(i-1,j-1),LD(i-1,j),LD(i,j-1))+1   在对角,左边,上边,取最小值+1

然后构建一个矩阵,短字符串在矩阵的左侧,长字符串在矩阵的上方。

第一步:

矩阵初始化完成时这样。

LD算法矩阵图  GAATTCAGTTA 01234567891011G1           G2           A3           T4           C5           G6           A7           

第二步:

按照上述公式填满表格

LD算法矩阵图  GAATTCAGTTA 01234567891011G1012345678910G211234566789A321123456788T432212345678C543322234567G654433333456A765444434455


到现在就得到了编辑距离,就是矩阵的最右下角的那个数字,本例中是5.
然后来计算两个字符串的相似度:A和B的相似度=1-(5/11).其中11代表的是两个字符串中较长的那个字符串的长度。
结果越接近越1,说明两个字符串相似度越高。

回溯

现在我们来关注关注表格中的红色数字。

矩阵中的红色数字是怎么确定的呢?
首先从最右下角开始,如果ai=bj,回溯到左上角的单元格,如果ai≠bj,则回溯到左上角、上方和左边中最小的单元格,如果最小
的单元格不唯一,那么优先级的顺序为:左上角、上边、左边。这样就可以得到回溯的结果,也就是图中的红色数字。

接下来就是按照回溯的路径,写出匹配字符串。

若回溯到左上角单元格,将ai添加到匹配字串A,将bj添加到匹配字串B

    若回溯到上边单元格,将ai添加到匹配字串A,将_添加到匹配字串B

    若回溯到左边单元格,将_添加到匹配字串A,将bj添加到匹配字串B

    搜索晚整个匹配路径,匹配字串也就完成了

B=GGA-TC-G--A
A=GAATTCAGTTA

注意,ai 是会对A串来说的,bj 是会对B串来说的,最后的结果是倒序,需要恢复一下。

0 0