Python实现计算最小编辑距离


Posted in Python onMarch 17, 2016

最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:删除,插入,替换。具体内容可参见:维基百科—莱文斯坦距离。一般代码实现的方式都是通过动态规划算法,找出从A转化为B的每一步的最小步骤。从Google图片借来的图,

Python实现计算最小编辑距离

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

代码地址

Python 相关文章推荐
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
pandas数据处理进阶详解
Oct 11 Python
python常用排序算法的实现代码
Nov 08 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
python requests.get带header
May 05 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
python入门之算法学习
Apr 22 Python
详解Python 3.10 中的新功能和变化
Apr 28 Python
Python引用模块和查找模块路径
Mar 17 #Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 #Python
Python保存MongoDB上的文件到本地的方法
Mar 16 #Python
Python3中的真除和Floor除法用法分析
Mar 16 #Python
学习python类方法与对象方法
Mar 15 #Python
Python 的内置字符串方法小结
Mar 15 #Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 #Python
You might like
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
python flask安装和命令详解
2019/04/02 Python
使用python去除图片白色像素的实例
2019/12/12 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
元旦红领巾广播稿
2014/02/19 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
作风建设年活动总结
2014/08/27 职场文书
2015年教师节感言
2015/08/03 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
Django基础CBV装饰器和中间件
2022/03/22 Python