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的身份证号码自动生成程序
Aug 15 Python
Python中subprocess的简单使用示例
Jul 28 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
Python中super函数用法实例分析
Mar 18 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
python 日志 logging模块详细解析
Mar 31 Python
Python中常见的导入方式总结
May 06 Python
Python深度学习之Pytorch初步使用
May 20 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
js实现随机点名功能
2020/12/23 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
Python 制作糗事百科爬虫实例
2016/09/22 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
生产部统计员岗位职责
2014/01/05 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
关于感谢信的范文
2015/01/23 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android
python区块链实现简版工作量证明
2022/05/25 Python