python difflib 编辑距离_最小编辑距离_Python

最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:删除,插入,替换。具体内容可参见:维基百科—莱文斯坦距离。

一般代码实现的方式都是通过动态规划算法,找出从A转化为B的每一步的最小步骤。

从Google图片借来的图(原图地址),

矩阵示意图

Python代码实现, (其中要注意矩阵的下标从1开始,而字符串的下标从0开始):

def normal_leven(str1, str2):

len_str1 = len(str1) + 1

len_str2 = len(str2) + 1

#create matrix

matrix = [0 for n in range(len_str1 * len_str2)]

#init x axis

for i in range(len_str1):

matrix[i] = i

#init y axis

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]

最近看文章看到Python库提供了一个包difflib实现了从对象A转化对象B的步骤,那么计算最小编辑距离的代码也可以这样写了:

def difflib_leven(str1, str2):

leven_cost = 0

s = difflib.SequenceMatcher(None, str1, str2)

for tag, i1, i2, j1, j2 in s.get_opcodes():

#print('{:7} a[{}: {}] --> b[{}: {}] {} --> {}'.format(tag, i1, i2, j1, j2, str1[i1: i2], str2[j1: j2]))

if tag == 'replace':

leven_cost += max(i2-i1, j2-j1)

elif tag == 'insert':

leven_cost += (j2-j1)

elif tag == 'delete':

leven_cost += (i2-i1)

return leven_cost

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值