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的更多相关文章

  1. C#实现Levenshtein distance最小编辑距离算法

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

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

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

  3. lintcode:最小编辑距离

    最小编辑距离 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 样例 给出 work1=&quo ...

  4. 自然语言处理(5)之Levenshtein最小编辑距离算法

    自然语言处理(5)之Levenshtein最小编辑距离算法 题记:之前在公司使用Levenshtein最小编辑距离算法来实现相似车牌的计算的特性开发,正好本节来总结下Levenshtein最小编辑距离 ...

  5. POJ 3356 AGTC(最小编辑距离)

    POJ 3356 AGTC(最小编辑距离) http://poj.org/problem?id=3356 题意: 给出两个字符串x 与 y,当中x的长度为n,y的长度为m,而且m>=n.然后y能 ...

  6. Minimum edit distance(levenshtein distance)(最小编辑距离)初探

    最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离.是指两个字串之间,由一个转成还有一个所需的最少编辑操作次数.许可的编辑操作包含将一个字符替换成还有一个字符. ...

  7. 【NLP_Stanford课堂】最小编辑距离

    一.什么是最小编辑距离 最小编辑距离:是用以衡量两个字符串之间的相似度,是两个字符串之间的最小操作数,即从一个字符转换成另一个字符所需要的操作数,包括插入.删除和置换. 每个操作数的cost: 每个操 ...

  8. 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】

    链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...

  9. 通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的 ...

随机推荐

  1. Python输出三位数以内的水仙花数

    num = 100 while num <= 999: a = num % 10 #取个位数 b = num // 10 % 10 #取十位数 c = num // 100 #取百位数 if n ...

  2. python语言入门

    1.python语言是一种高级的脚本语言,诞生于1991年. 2.python是目前主流的编程语言,具有超高的人气,是因为它是目前大数据与人工智能的语言基础,应用范围非常广泛. 3.python语言是 ...

  3. 视图家族 & 路由组件

    目录 视图家族 & 路由组件 视图集与路由组件 基于 GenericAPIView 的十大接口 基于 generics 包下工具视图类的六大基础接口 视图集 路由组件:必须配合视图集使用 自定 ...

  4. rendering path定义了什么?有哪些?有什么作用?有什么限制?

    rendering path 定义了光照在一个shader pass中处理的对象与顺序,如逐像素处理,逐顶点处理,向前处理,后向 deferred用于处理不透明物体,会先把它们根据深度检测,过滤后的内 ...

  5. java并发(二):初探syncronized

    参考博客 Java多线程系列--"基础篇"04之 synchronized关键字 synchronized基本规则 第一条 当线程访问A对象的synchronized方法和同步块的 ...

  6. new Vue() 和 export default {}及Vue页面组件和标签组件说明与比较(非常重要)

    说明与比较:new Vue() 和 export default {} (1)vue就是一个构造函数 (2)vue标签组件:是HTML标签的扩展https://www.cnblogs.com/w-wa ...

  7. 用 lastIndexOf()、substr()、split()方法截取一段字符串

    lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索. split() 方法用于把一个字符串分割成字符串数组,抽取到分割符前面部分. subst ...

  8. CMake查找第三方库路径

    问题 一直都有一个问题,就是基于Windows下使用CMake构建VS工程时,CMake是如何查找到第三方库所在的路径的呢? 答案 今天重新想起这个问题,就拿构建Vtk的VS工程测试了一下, 才发现是 ...

  9. Java导出Excel(项目实战Demo)

    Controller 层 /** * 考勤机刷卡明细导出Excel * * @throws Exception */ // @RequiresPermissions("report:Expo ...

  10. WPBakery Page Builder页面生成器6.0 汉化版

    WPBakery Page Builder 是一个可视化编辑器插件 ,相较于WP自带的编辑器使用起来更加方便,同时功能更 加强大,完全的可视化操作,使用比较简单,国外有多款主题需要使用插件. WPBa ...