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 相关文章推荐
Python下使用Psyco模块优化运行速度
Apr 05 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
Python获取邮件地址的方法
Jul 10 Python
Python实现一个简单的验证码程序
Nov 03 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
Python 可迭代对象 iterable的具体使用
Aug 07 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 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
PHP5中虚函数的实现方法分享
2011/04/20 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
Python二维码生成识别实例详解
2019/07/16 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
python实现四人制扑克牌游戏
2020/04/22 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
python基于opencv 实现图像时钟
2021/01/04 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
原装进口全世界:天猫国际
2016/08/03 全球购物
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
经典c++面试题六
2012/01/18 面试题
求职信模板怎么做
2014/01/26 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
详解Java实践之抽象工厂模式
2021/06/18 Java/Android