原文章链接:python实现计算最小编辑距离
最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:删除,插入,替换。具体内容可参见:Wikipedia - Levenshtein_distance。一般代码实现的方式都是通过动态规划算法,找出从A转化为B的每一步的最小步骤。
动态转移方程:来自字符串编辑距离(Levenshtein距离)算法
levA, B(i, j)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧ijmin⎩⎨⎧leva, b(i, j−1)+1leva, b(i−1, j)+1leva, b(i−1, j−1)+1(ai≠bi), j=0, i=0, otherwise
Python代码实现, (其中要注意矩阵的下标从1开始,而字符串的下标从0开始):
def normal_leven(str1, str2):
len_str1 = len(str1) + 1
len_str2 = len(str2) + 1
# 创建矩阵
matrix = [0 for n in range(len_str1 * len_str2)]
#矩阵的第一行
for i in range(len_str1):
matrix[i] = i
# 矩阵的第一列
for j in range(0, len(matrix), len_str1):
if j % len_str1 == 0:
matrix[j] = j // len_str1
# 根据状态转移方程逐步得到编辑距离
for i in range(1, len_str1):
for j in range(1, len_str2):
if str1[i-1] == str2[j-1]:
cost = 0
else:
cost = 1
matrix[j*len_str1+i] = min(matrix[(j-1)*len_str1+i]+1,
matrix[j*len_str1+(i-1)]+1,
matrix[(j-1)*len_str1+(i-1)] + cost)
return matrix[-1] # 返回矩阵的最后一个值,也就是编辑距离