levenshtein 距离 python实现

参考了博客

对于编辑距离,我做了很详细的解释,具体如下:

import numpy as np

"""
此为编辑距离,就是str1转化为str2的编辑距离
采用的就是动态规划思想
举例说明,我们以 str1="leensh",str2="levensh"为例,首先得到的结果为:
      l  e  v  e  n  s  h
 [[0. 1. 2. 3. 4. 5. 6. 7.]
l [1. 0. 1. 2. 3. 4. 5. 6.]
e [2. 1. 0. 1. 2. 3. 4. 5.]
e [3. 2. 1. 1. 1. 2. 3. 4.]
n [4. 3. 2. 2. 2. 1. 2. 3.]
s [5. 4. 3. 3. 3. 2. 1. 2.]
h [6. 5. 4. 4. 4. 3. 2. 1.]]
首先第一个字符完全一致,所以矩阵[1,1]为0,不需要更改,如果[1,2],[1,3],...[1,7]都做改变,距离一次累加,相当于,不管以后的字符,只管
str1只有一个字符l的情况下,变成str2的方法,需要把后边全部变化成str2对应的字符串,所以【1,2】,..,[1,7]依次累计,同理
当第二行,[2,1],认为str2,只有l的时候,由于第一个字符相同,所以str2变成str1只需当前1个过程,【2,2】为0,由于前两个字符相同,同理[2,3],...
[2,7],当在第3行时,【3,3】为1,但是[3,4]为什么也为1,这个是关键,变成[3,4],有三个可能,[2,4],[3,3],[2,3],由于最小积累在,[3,3],[2,3]对应的
待匹配字符串分别为lev ,lev,,但是[3,3]进入到[3,4],需要添加e,这样总代价变成了[3,3]+1=2,而[2,3]当前字符串为lev,我们提供的【2,3】变成第3行
添加了一个e所以,与待匹配e相同,没有变化,所以总代价还是1,而[3,3]已经把给的e变成了v,所以到第4步,需要重新添加e,所以代价为2,依次剩余字符串相同
所以总代价为1,他只需添加了一个
"""
def distance_str(str1,str2):
    dp=np.zeros((len(str1)+1,len(str2)+1))
    m=len(str1)
    n=len(str2)
    for k in range(1,m+1):
        dp[k][0]=k
    for k in range(1,n+1):
        dp[0][k]=k
    for k in range(1,m+1):
        for j in range(1,n+1):
            dp[k][j]=min(dp[k-1][j],dp[k][j-1])+1 #这里表示上边和下边的数值最小数值
            if str1[k-1]==str2[j-1]:
                dp[k][j]=min(dp[k][j],dp[k-1][j-1])
            else:
                dp[k][j]=min(dp[k][j],dp[k-1][j-1]+1)
    print(dp)

if __name__ == '__main__':
    str1="leensh"
    str2="levensh"


猜你喜欢

转载自blog.csdn.net/chenmingwei000/article/details/80605733
今日推荐