最小编辑距离(Minimum Edit Distance)

参考:https://web.stanford.edu/class/cs124/lec/med.pdf

目标(objective):给定两个字符串s1s_{1}s1​、s2s_{2}s2​及编辑操作,求将字符串s1s_{1}s1​转换为s2s_{2}s2​所需的最小操作代价。

编辑操作:

  • 插入(insert),插入一个新字符,代价(cost)oio_{\text{i}}oi​;

  • 删除(delete),删除一个字符,代价(cost)odo_{\text{d}}od​;

  • 替换(substitute),将一个字符替换为另一个字符,代价(cost)oso_{\text{s}}os​。

1 递归(Recursion)

计算时间复杂度(time complexity):O(3n)\mathcal{O} (3^{n})O(3n)


import numpy as np
COST_INSERT=1
COST_DELETE=1
COST_REPLACE=2def edit_distance_recur(str1, str2):"""find minimum number operations required to convert string str1 into str2comparing string from right to left (backward)"""op_list = ["insert", "delete", "replace"]if len(str1) == 0:distance = len(str2) * COST_INSERTop_sequence = {"insert": list(str2),"delete": [],"replace": [],}return distance, op_sequenceif len(str2) == 0:distance = len(str1) * COST_DELETEop_sequence = {"insert": [],"delete": list(str1),"replace": [],}return distance, op_sequenceif str1[-1] == str2[-1]:distance, op_sequence = edit_distance_recur(str1[: -1], str2[: -1])else:distance_insert, op_sequence_insert = edit_distance_recur(str1, str2[: -1])distance_delete, op_sequence_delete = edit_distance_recur(str1[: -1], str2)distance_replace, op_sequence_replace = edit_distance_recur(str1[: -1], str2[: -1])distance_insert += COST_INSERTdistance_delete += COST_DELETEdistance_replace += COST_REPLACEop = np.argmin(a=[distance_insert, distance_delete, distance_replace])op = op_list[op]if op == "insert":distance = distance_insertop_sequence = op_sequence_insertop_sequence["insert"].append(str2[-1])elif op == "delete":distance = distance_deleteop_sequence = op_sequence_deleteop_sequence["delete"].append(str1[-1])else:distance = distance_replaceop_sequence = op_sequence_replaceop_sequence["replace"].append(str1[-1] + " with " + str2[-1])return distance, op_sequence
edit_distance_recur("intention", "execution")
(8,{'insert': ['x', 'e', 'c', 'u'],'delete': ['i', 'n', 't', 'n'],'replace': []})

2 动态规化(Dynamic Programming)

动态规化(Dynamic&programming):将问题分解为子问题(subproblem)求解;构造计算表(a tabular computation)D(m,n)D(m, n)D(m,n)

计算时间复杂度为O(mn)\mathcal{O} (mn)O(mn);计算空间复杂度为O(mn)\mathcal{O} (mn)O(mn)

自下而上(bottom-up)


def edit_distance_dp(str1, str2, cost_insert=1, cost_delete=1, cost_replace=1):"""find minimum number operations required to convert string str1 into str2bottom-up"""len_str1 = len(str1)len_str2 = len(str2)str1 = "#" + str1str2 = "#" + str2# initializationdistance_table = np.zeros(shape=(len_str1 + 1, len_str2 + 1))distance_table[:, 0] = np.linspace(start=0, stop=len_str1, num=len_str1 + 1)distance_table[0, :] = np.linspace(start=0, stop=len_str2, num=len_str2 + 1)for idx1 in range(1, len_str1 + 1):for idx2 in range(1, len_str2 + 1):# insertdistance_insert = distance_table[idx1, idx2 - 1] + cost_insert# deletedistance_delete = distance_table[idx1 - 1, idx2] + cost_delete# replace or remainif str1[idx1] == str2[idx2]:distance_replace = distance_table[idx1 - 1, idx2 - 1]else:distance_replace = distance_table[idx1 - 1, idx2 - 1] + cost_replacedistance_table[idx1, idx2] = np.min([distance_insert, distance_delete, distance_replace])return distance_table[-1, -1]
edit_distance_dp("intention", "execution", cost_replace=2)
8.0

3 回溯(Backtrace)

回溯(Backtrace)计算时间、空间复杂度均为O(m+n)\mathcal{O} (m + n)O(m+n)



从(0,0)(0, 0)(0,0)到(M,N)(M, N)(M,N)的任意非减路径均为一条可行对齐路径;最优路径由最优子路径组成

def edit_distance_dp_backtrace(str1, str2, cost_insert=1, cost_delete=1, cost_replace=1):"""find minimum number operations required to convert string str1 into str2bottom-upbacktrace"""len_str1 = len(str1)len_str2 = len(str2)str1 = "#" + str1str2 = "#" + str2# initializationdistance_table = np.zeros(shape=(len_str1 + 1, len_str2 + 1))distance_table[:, 0] = np.linspace(start=0, stop=len_str1, num=len_str1 + 1)distance_table[0, :] = np.linspace(start=0, stop=len_str2, num=len_str2 + 1)for idx1 in range(1, len_str1 + 1):for idx2 in range(1, len_str2 + 1):# insertdistance_insert = distance_table[idx1, idx2 - 1] + cost_insert# deletedistance_delete = distance_table[idx1 - 1, idx2] + cost_delete# replace or remainif str1[idx1] == str2[idx2]:distance_replace = distance_table[idx1 - 1, idx2 - 1]else:distance_replace = distance_table[idx1 - 1, idx2 - 1] + cost_replacedistance_table[idx1, idx2] = np.min([distance_insert, distance_delete, distance_replace])op_list = ["replace", "insert", "delete"]path = []idx1 = len_str1idx2 = len_str2while (idx1 > 0) & (idx2 > 0):op = np.argmin(distance_table[idx1 - 1: idx1 + 1, idx2 - 1: idx2 + 1])op = op_list[op]if op == "insert":op = "{} {}".format(op, str2[idx2])idx2 -= 1elif op == "delete":op = "{} {}".format(op, str1[idx1])idx1 -= 1else:if str1[idx1] == str2[idx2]:op = "remaind"else:op = "{} {} with {}".format(op, str1[idx1], str2[idx2])idx1 -= 1idx2 -= 1path.append(op)if idx1 == 0:path.extend(["{} {}".format("insert", str2[i]) for i in range(idx2, 0, -1)])if idx2 == 0:path.extend(["{} {}".format("delete", str1[i]) for i in range(idx1, 0, -1)])path.reverse()return distance_table[-1, -1], path
min_edit_distance, optimal_path = edit_distance_dp_backtrace("intention", "execution", cost_replace=2)
print("min edit distance: ", min_edit_distance)
print("optimal path: ", optimal_path)
min edit distance:  8.0
optimal path:  ['insert e', 'replace i with x', 'replace n with e', 'replace t with c', 'delete e', 'replace n with u', 'remaind', 'remaind', 'remaind', 'remaind']

动态规化 - 最小编辑距离相关推荐

  1. 黄金矿工问题【动态规化】

    文章目录 黄金矿工 解题思路 递归实现 二维数组实现 一维数组实现 黄金矿工 很久很久以前,有一位国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不同.例如有的金矿储量是500kg黄 ...

  2. 清华鲁继文团队提出DynamicViT:一种高效的动态稀疏化Token的ViT

    [导读] 由于随着ViT中的token数量的增长,会导致计算成本呈平方级急剧增加!近期,清华黄高团队提出了自适应序列长度的DVT方案,本篇文章,我们将介绍另一种方法.6月3日,清华鲁继文教授团队提出了 ...

  3. python 编辑距离_最小编辑距离python

    1 什么是编辑距离 在计算文本的相似性时,经常会用到编辑距离(Levenshtein距离),其指两个字符串之间,由一个字符串转成另一个所需的最少编辑操作次数.在字符串形式上来说,编辑距离越小,那么两个 ...

  4. 还在用全部token训练ViT?清华UCLA提出token的动态稀疏化采样,降低inference时的计算量...

    关注公众号,发现CV技术之美 本文分享一篇由清华& UCLA联合研究的论文『DynamicViT: Effificient Vision Transformers with Dynamic T ...

  5. mysql 编辑距离 搜索_最小编辑距离(Minimum Edit Distance)

    最小编辑距离 1)定义 编辑距离(Minimum Edit Distance,MED),又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需要的最少编辑操作次数.允许的编辑操作包括 ...

  6. stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)

    I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...

  7. 最小编辑距离 (MED)实现-Python

    此帖内容是去年9月份自己做的小实验~ 1. 实验目的 最小编辑距离旨在定义两个字符串之间的相似度,定义相似度可以用于拼写纠 错.计算生物学上的序列对比.机器翻译.信息提取和语音识别等. 最小编辑距离就 ...

  8. Levenshtein distance最小编辑距离算法实现

    Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑 ...

  9. 动态子类化CComboBox以得到子控件EDIT及LISTBOX

    动态子类化CComboBox以得到子控件EDIT及LISTBOX Joise.LI写于2004-4-6 ComboBox是比较常用的一个控件,有三种样式:CBS_SIMPLE(简单),CBS_DROP ...

最新文章

  1. c# 如何找到项目中图片的相对路径
  2. 金融反欺诈和金融构建信用评分或者金融预测特征抽取案例
  3. 学好python薪水有多少笔画_Python学到什么程度可以面试工作?
  4. Android深度探索读书笔记 第六章
  5. python接口自动化(四十三)-公共模块 pymysql 连接mysql数据库(单独说明)
  6. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)
  7. python-图书管理系统2-整体 代码架构
  8. python为什么不能删除_为什么python不允许我删除文件?
  9. 别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)
  10. 算法入门 13.并查集
  11. 【每周CV论文推荐】GAN在医学图像生成与增强中的典型应用
  12. 最近复习了一下JavaScript
  13. 用php 用拼出一个菱形_用php语言编程:输出一个由“*”符号组成的菱形图形(必须使用for循环语句)...
  14. [数学学习笔记]函数的连续性
  15. matplotlib如何绘制圆
  16. 主机宝iis版_主机宝IIS版|IIS网站宝(IIS科技主机管理系统)下载 v3.0 官方免费版 - 比克尔下载...
  17. Linux系统 | vim配置
  18. linux怎么共享打印机驱动程序,为samba共享的打印机添加Windows驱动
  19. Linux设备驱动程序
  20. Android 语音播报 , 百度在线语音合成封装;

热门文章

  1. 【陈工笔记】# 玩转电脑桌面的神器,让每一天不枯燥 #
  2. HYCON单片机_以32位MCU-HY16F198实现AC电流量测应用-测试测量-与非网
  3. 计算机本科学生毕业设计课题,计算机科学与技术本科毕业设计选题.doc
  4. NLP中的数据增强方法
  5. FHQ-Treap(非旋treap/平衡树)——从入门到入坟
  6. iPhone XS Max(xr)进入DFU模式的方法
  7. 88 java反射_4 _注解
  8. 企业数字化不是各自发展,而是全面SaaS化推进
  9. vue中使用Echarts绘制K线图
  10. https://www.jianshu.com/p/15c85b1901f7