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中的应用之translate和maketrans用法详解
Aug 27 Python
Python中__init__.py文件的作用详解
Sep 18 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
python打开使用的方法
Sep 30 Python
python图形用户接口实例详解
Dec 16 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
python 批量压缩图片的脚本
Jun 02 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
重置版战役片段
2020/04/09 魔兽争霸
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
php上传大文件设置方法
2016/04/14 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
用python找出那些被“标记”的照片
2017/04/20 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
浅析python中while循环和for循环
2019/11/19 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
介绍一下内联、左联、右联
2013/12/31 面试题
统计系教授推荐信
2014/02/28 职场文书
早会主持词
2014/03/17 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
故宫导游词
2015/01/31 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
详解python字符串驻留技术
2021/05/21 Python