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”之间的编辑距离矩阵则有如下表示:

最终的编辑距离即为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)

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

代码如下:

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)]

python 编辑距离_最小编辑距离python相关推荐

  1. python 编辑距离_最小编辑距离(Levenshtein)的 Python 实现

    一直以为这个算法实现起来的代码量很高,直到最近刷 <Speech and Language Processing>,用动态规划做起来,简单.优雅. 算法原理 字符串 X,Y 的长度分别是 ...

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

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

  3. python 切片_全面解读Python高级特性切片

    大家好,欢迎来到Crossin的编程教室! 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slic ...

  4. 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程

    学习python课程 Python is a popular, versatile and easy-to-learn language. It's the go-to language for AI ...

  5. 2018年python薪资_最好的Python:2017和2018年至今我最喜欢的文章集

    2018年python薪资 我打算发布此收藏集 (My intention with publishing this collection) Last year I only used Medium ...

  6. python中求最小公约数,python求最大公约数和最小公倍数的简单方法

    python求最大公约数和最小公倍数的简单方法 python怎么求最大公约数和最小公倍数 一.求最大公约数 用辗转相除法求最大公约数的算法如下: 两个正整数a和b(a>b),它们的最大公约数等于 ...

  7. python股市_如何使用python和破折号创建仪表板来主导股市

    python股市 始终关注大局 (Keep Your Eyes on the Big Picture) I've been fascinated with the stock market since ...

  8. python 堆排序_堆排序用python

    Python天天美味(30) - python数据结构与算法之快速排序 快速排序的原理是将取出第一个数,将整个数组分为两波,一拨都大于这个数,另一波都小于这个数,然后递归用同样的方法处理第一波数字和第 ...

  9. aws python库_如何使用Python,AWS和IEX Cloud创建自动更新股市数据的Excel电子表格

    aws python库 Many Python developers in the financial world are tasked with creating Excel documents f ...

最新文章

  1. ecdf函数_关于ecdf函数的使用问题
  2. 按部就班——图解配置IIS5的SSL安全访问
  3. 求数组中元素为另外两个元素和的最大元素
  4. 可以进行单元测试么_前端与单元测试
  5. 第十四天 网页初步
  6. java 下载管理_Java多线程文件下载管理器详解
  7. MongoDB副本集学习(一):概述和环境搭建
  8. Laravel使用腾讯云COS服务
  9. matlab绝对均值,MATLAB中均值、方差、均方差的计算方法
  10. python垃圾邮件识别_手把手教你用 python 和 scikit-learn 实现垃圾邮件过滤
  11. c语言利用公式求sin(x)的近似值,用下列公式计算sin(x)的近似值
  12. 北京著名“十大特色美食街”
  13. 风控策略的自动化生成-利用决策树分分钟生成上千条策略
  14. “我的代码正在被千百万人使用”,MySQL 之父等六大国际数据库掌门人谈如何做数据库!...
  15. 炉石胖枫抽到什么刀片服务器准系统整机主板,中速猎天下第一!老将胖枫喜提炉石传说青岛黄金赛大师组冠军...
  16. CF1765M Minimum LCM
  17. 基于python+django框架+Mysql数据库的校园二手书籍交易系统设计与实现
  18. 更多的 Ubuntu 手机即将上市
  19. 《资本论》读书笔记(2)第二卷第一章:资本形态变化及其循环
  20. 低温工作笔记本计算机,为什么极低温度下不宜使用笔记本电脑?

热门文章

  1. 利用TabWidget实现底部菜单
  2. CompletableFuture详解~cancel
  3. Java消息服务~@JmsListener集成
  4. 掌控谈话~标注对方的痛苦
  5. php mysql 字段不为空_Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?...
  6. c语言每轮for循环初始化i,十三.Linux博客-2016年8月18日while、for特殊用法、selet循环与菜单、函数...
  7. chackbox的值 php获取_最详细最全的PHP面试题(附答案)
  8. mysql 唯一约束 多字段_mysql多字段唯一约束
  9. 模拟网页行为之实践四
  10. React Native新手引导