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

1 什么是编辑距离

在计算文本的相似性时,经常会用到编辑距离(Levenshtein距离),其指两个字符串之间,由一个字符串转成另一个所需的最少编辑操作次数。在字符串形式上来说,编辑距离越小,那么两个文本的相似性越大,暂时不考虑语义上的问题。其中,编辑操作包括以下三种:

插入:将一个字符插入某个字符串

删除:将字符串中的某个字符删除

替换:将字符串中的某个字符串替换为另一个字符

为了更好地说明编辑距离的概念,我们看看一个例子,将字符串“batyu”变为“beauty”,编辑距离是多少呢?分析步骤如下:

将batyu插入字符e有:beatyu

将beatyu删除字符u有:beaty

将beaty插入字符u有:beauty

所以,字符串“batyu”与字符串“beauty”之间的编辑距离为:3.

2 数学化

先抛开具体编程语言实现,我们简单地分析一下如何计算两个字符串之间的编辑距离

当两个字符串都为空串的时候,那么编辑距离就是0

当其中一个字符串为空串时,那么编辑距离为另一个非空字符串的长度

当两个字符串A,B均为非空时(假设长度分别为i,j),那么有如下三种情况,我们取这三种情况的最小值即可:

1). 已知字符串A中长为 i - 1(从字符串首开始,以下描述字符串长默认此种描述)和字符串B长为j的编辑距离,那么在此基础上加1即可

2).长度分别为i,h和j-1的编辑距离已知,那么加1即可

3).长度分别为i-1和j-1的编辑距离已知,这个时候需要考虑两种情况,若第i个字符和第j个字符不同,那么加1即可,如果相同,那么就不需要加1.

从上面的描述,很明显可以发现是动态规划的思想。

我们将上面的叙述数学化,则有:求长度为m和n的字符A、B串编辑距离,即函数:edit(i,j),它表示第一个长度为i(从字符首开始)的字符串与第二个长度为j的字符串之间的编辑距离。动态规划表达式则有如下写法,假设i,j表示字符串A,B的字串长度:

if i==0 且 j==0,edit(i,j)=0

if (i==0 且 j>0) 或者(i>0 且j ==0),edit(i,j)=i + j

if i>= 1 且 j >= i, edit(i, j) = min(edit(i-1,j) + 1, edit(i, j-1) + 1, edit(i-1,j-1) + d(i,j);当第一个字符串的第i个字符不等于第二个字符串第j个字符时,d(i,j)=1,否则为0

字符串“batyu”与字符串“beauty”之间的编辑距离矩阵则有如下表示:

1533981-20200228125406704-1251526518.png

最终的编辑距离即为edit(m,n)。

3 编程实现

有了上面的思路,使用Python去实现计算两个字符串的编辑距离就简单多了。

def test(s1,s2):

edit = [[i+j for j in range(len(s2)+1)] for i in range(len(s1)+1)]

for i in range(1,len(s1)+1):

for j in range(1,len(s2)+1):

if s1[i-1]==s2[j-1]:

d=0

else:

d=1

edit[i][j] = min(edit[i-1][j]+1,edit[i][j-1]+1,edit[i-1][j-1]+d)

return edit[len(s1)][len(s2)]

t = test('batyu','beauty')

print(t)

根据最小编辑距离的算法思路很容易让我们想到生成指定编辑距离的单词,方法如下:

1533981-20200406191452648-987147498.png

代码如下:

def generate_edit_one(s):

'''

生成所有距离为1的所有字符串列表

:param s:

:return:

'''

letters = 'qwertyuioplkjhgfdsazxcvbnm'

splits = [(s[:i],s[i:]) for i in range(len(s)+1)]

inserts = [L+c+R for L,R in splits for c in letters]

deletes = [L+R[1:] for L,R in splits if R]

replaces = [L+c+R for L,R in splits if R for c in letters]

return set(inserts+deletes+replaces)

def generate_edit_two(s):

'''

编辑距离不大于2的所有字符串

:param s:

:return:

'''

return [e2 for e1 in generate_edit_one(s) for e2 in generate_edit_one(e1)]

1533981-20200406191713936-2021725151.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp多表查询并显示_MySQL多表查询与事务

回顾1. DQL单表高级查询条件 where比较运算逻辑运算符in关键字between关键字if null关键字like关键字% 多个任意字符_ 单个任意字符排序 order byascdesc聚合函数count(*) 统计行,包括null值maxminavgsum分组 group by 分组字段 having 分组后条件过滤分页 limit 开…

Bias and Debias in Recommender System: A Survey and Future Directions学习笔记

1 引言 2006-2020发表的有关推荐系统去偏的论文统计: 2 推荐系统的偏差 偏差发生在推荐系统的不同阶段: 用户交互到生成数据的阶段: – 选择偏差: – 一致性偏差(从众偏差): – 曝光偏差&a…

卡扇区数据教程_分享一款硬盘分区和数据恢复软件

最近有朋友留言,自己的硬盘被格式化了,没法恢复。今天给大家介绍一款解决硬盘恢复软件--DiskGenius,文末附下载地址,觉得有用点个在看吧。DiskGenius是一款功能非常强大的硬盘分区及数据恢复软件,算法精湛、功能强大&a…

名图1.8智能隐藏功能_7年后再度回归 全新一代名图“大”不同_搜狐汽车

本文车型速览除了文章作者的主观观点外,我们正尝试基于全网可查的客观数据,为您提供中立、客观的参考依据:本文部分车型速览:畅销车型质量排行top10展开微信扫码,直接一次看完附近所有城市低价(附近城市均有经销商可售…

3 vue 线条箭头_线条眉要如何处理才能更自然?

更多纹绣内容关注公众号:法米索半永久学堂。眉头的操作确实不是一件容易的事,都说万事开头难,很多纹绣师把握不好眉头的操作技巧,一不小心就会把眉头做的方了、圆了,总之就是非常不自然。但只要我们把眉头做好了&#…

git rebase用法_Git:Clone别人的代码之后push到自己码云上失败的解决办法

最近也是刚开始使用gitee,比较生疏。场景是这样的:clone了朋友的一份代码到自己的本地,然后自己想把它保存到自己的gitee 私有仓库上,就在gitee上面创建了一个私有的仓库,然后多次push都失败了,实践了网上提…

fpga板子怎么和电脑连_windows7台式电脑怎么连接路由器?台式win7电脑连路由器步骤...

相信还有许多在使用windows7系统,尽管使用很长一段时间了,不过对win7系统的一些功能还是不太了解。大家家里应该都有路由器,那么windows7台式电脑怎么连接路由器,下面我们就一起来看看台式win7电脑连接路由器步骤。win7台式电脑连…

英特尔核显自定义分辨率_让免费的核显更好用!英特尔酷睿集成的GPU如何优化?...

点击上方电脑爱好者关注我们在笔记本领域,无论是英特尔酷睿还是AMD锐龙,都采取了“买一赠一”的策略,即都在处理器内集成了性能还不赖的核显,虽然它们无法驾驭3A游戏大作,但应对《英雄联盟》级别的游戏还是不成问题的。…

python脚本式编程_Python编程入门(一)

Python编程入门(一)概述:编程语言 1.脚本编程语言★脚本编程语言如php,perl,python,java等为脚本编程语言,通常需要通过解释器解释运行。 ★python(java)程序的执行过程s…

for循环里面有异步操作_JS 线程与异步的那些事

已知,JavaScript 是单线程的,天生异步,适合 IO 密集型,不适合 CPU 密集型,但是,为什么是异步的喃,异步由何而来的喃,我们将在这里逐渐讨论实现。一、进程与线程1. 浏览器是多进程的它…

FDRNet: Fourier Document Restoration for Robust Document Dewarping and Recognition学习笔记

1 广告 这篇工作由字节跳动商业化技术团队与新加坡南洋理工大学合作完成。 话不都说,先看效果: FDRNet的效果看上去有点好,可惜没有源代码提供。 2 相关工作 2.1 几何形变恢复方法Geometric Document Restoration 由相机传感器捕获的文档…

通讯可以并联吗_工业控制知识:吃透RS485通讯的连接方式,接485总线就简单多了...

RS485被广泛使用,可以支持ModBus协议。由于其简单、价优、可靠和成熟,因此,被广泛应用于工业控制、智能仪器和电力通信。我们来看看RS485的一个典型组网结构:理论上,RS485总线的传输距离可以达到1200米。然而&#xff…

python编程a的x次方_「Python 面试」第四次更新

阅读本文大约需要 5 分钟。 15.说一说 GIL 前面有提到由于 Python 基于 C 语言编写的解释器中设置了一个 GIL 全局变量锁,该锁使得 Python 的多线程在处理 CPU 计算密集型任务时,同一时刻只能有一个线程在运行,这也是为什么说 Python 的多线程…

Exploiting Vector Fields for Geometric Rectification of Distorted Document Images学习笔记

1 广告 [1] Exploiting Vector Fields for Geometric Rectification of Distorted Document Images 利用矢量场对变形文档图像进行几何校正。 2018年发表在ECCV会议上的一篇非深度学习的文档去扭曲。 本文提出了一种对手持相机捕获的扭曲文档图像进行几何校正的无分段方法。…

java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题

往期文章「Java并发编程」谈谈Java中的内存模型JMM面试官:说说你知道多少种线程池拒绝策略为什么不要在MySQL中使用UTF-8编码方式前言很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标&…

java编译_解析 Java 即时编译器原理。

↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!一、导读常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成…

ios nsstring根据ascii码大小排序_iOS(NSPredicate) 谓词的使用

参考iOS-谓词的使用详解NSPredicate 谓词NSPredicateA definition of logical conditions used to constrain a search either for a fetch or for in-memory filtering.一种逻辑条件的定义,可以根据定义的模糊查询条件,对内存对象进行过滤搜索。1.比较运…

恒位油杯故障原因_抽油烟机常见故障及处理方法

您知道抽油烟机常见故障及处理方法是什么吗?抽油烟机通电后不能启动,可能是因为电源线断路或接头脱焊,仔细查出断路点或脱焊点,重新焊牢。通断开关断路或触点接触不良,检查断路器处是否焊好,若触点接触不良…

会议容易中吗_在装配式建筑中重要又容易被忽视的部分,你中招了吗?

装配式 建筑装配式建筑大家应该都有听过,那么这种建筑又是怎样构成的呢?装配式建筑概览▲▲▲装配式建筑粘结方案▲▲▲密封胶作为装配式建筑中的重要材料,起到不可忽视的作用~SMP密封胶,1978年开始生产,最初是针对硅酮…

Document image dewarping using text-lines and line Segments学习笔记

1 核心思想 论文:Robust Document Image Dewarping Method Using Text-Lines and Line Segments 论文:Document Dewarping via Text-line based Optimization 代码:https://github.com/taeho-kil/Document-Image-Dewarping 传统的基于文本行的文档去扭曲方法在处理复杂布局…