文字编辑距离代码实现
2016-11-16 14:51
253 查看
参考资料:自动化所老师宗成庆老师的《自然语言理解》课程
1、在使用word的时候,输入英文会自动检测出单词是否正确,在单词不正确(字典中查不到的时候),还会给出相应的建议单词。这个功能是如何实现的呢?首先引入一个概念叫做英语单词拼写检查,设X为拼写错误的字符串,长度为m,Y为X对应的正确的单词,其长度为n,则X和Y的编辑距离,定义为:从字符串X到字符串Y需要的插入、删除、替换和交换两个相邻的基本单位的最小个数。
2、算法过程
(1)对于X来说,选取前i个字符,去和Y作距离的计算,max(1,n-t)<=i<=min(m,n+t),t是一个阙值,限定编辑距离和确定截取X的范围。
(2)递归计算ed
(2.0)递归出口:递归到某一个串长度为0,返回另一个串d长度
(2.1)如果两个串最后一个字母相同,则比较去掉最后一个字母的串
ed(X[i+1],Y[j+1]) = ed(X[i],Y[j])
(2.2)如果最后两个字母互换位置之后可以变成相同的串,就交换位置
if(X[i+1]==Y[i]&&X[i]==Y[i+1]),ed(X[i+1],Y[i+1])=1+min{ed(X[i-1],Y[j-1]),ed(X[i],Y[j+1]),ed(X[i+1],Y[j])}
三种情况分别表示,直接交换的,X去掉一个字母相等的,X加上一个字母相等的。
(2.3)其他情况下,就是最后1个字母不相等并且也不交换位置能得到的
ed(X[i+1],Y[i+1])=1+min{ed(X[i],Y[j]),ed(X[i],Y[j+1]),ed(X[i+1],Y[j])}
表示替换最后一个字母,X去掉一个字母相等的,X加上一个字母相等的。
(3)对于每个距离,找出最小的ed值,对应的单词长度就是最小编辑距离。
3、代码实现
其实代码实现就很简单啦,只需要把上面的步骤实现就可以了。这里为了更加直观,只计算出了每个i长度单词的ed距离,没有实现(3)中的功能。注意递归边界和下标越界的情况
计算两个单词的编辑距离python代码:
代码运行结果
input string:reprter
input pattern:repo
2 1 1 2 3
repr 和 rep代表这距离repo最近的字符串
1、在使用word的时候,输入英文会自动检测出单词是否正确,在单词不正确(字典中查不到的时候),还会给出相应的建议单词。这个功能是如何实现的呢?首先引入一个概念叫做英语单词拼写检查,设X为拼写错误的字符串,长度为m,Y为X对应的正确的单词,其长度为n,则X和Y的编辑距离,定义为:从字符串X到字符串Y需要的插入、删除、替换和交换两个相邻的基本单位的最小个数。
2、算法过程
(1)对于X来说,选取前i个字符,去和Y作距离的计算,max(1,n-t)<=i<=min(m,n+t),t是一个阙值,限定编辑距离和确定截取X的范围。
(2)递归计算ed
(2.0)递归出口:递归到某一个串长度为0,返回另一个串d长度
(2.1)如果两个串最后一个字母相同,则比较去掉最后一个字母的串
ed(X[i+1],Y[j+1]) = ed(X[i],Y[j])
(2.2)如果最后两个字母互换位置之后可以变成相同的串,就交换位置
if(X[i+1]==Y[i]&&X[i]==Y[i+1]),ed(X[i+1],Y[i+1])=1+min{ed(X[i-1],Y[j-1]),ed(X[i],Y[j+1]),ed(X[i+1],Y[j])}
三种情况分别表示,直接交换的,X去掉一个字母相等的,X加上一个字母相等的。
(2.3)其他情况下,就是最后1个字母不相等并且也不交换位置能得到的
ed(X[i+1],Y[i+1])=1+min{ed(X[i],Y[j]),ed(X[i],Y[j+1]),ed(X[i+1],Y[j])}
表示替换最后一个字母,X去掉一个字母相等的,X加上一个字母相等的。
(3)对于每个距离,找出最小的ed值,对应的单词长度就是最小编辑距离。
3、代码实现
其实代码实现就很简单啦,只需要把上面的步骤实现就可以了。这里为了更加直观,只计算出了每个i长度单词的ed距离,没有实现(3)中的功能。注意递归边界和下标越界的情况
计算两个单词的编辑距离python代码:
#!/usr/bin/python t = 2 s = raw_input("input string:") p = raw_input("input pattern:") m = len(s) n = len(p) l = max(1,n-t) u = min(m,n+t) def ed(i,j): dis = 0 # for k in range(0,i+1): # print s[k], # print if i==0: return j elif j ==0: return i elif i==-1 or j==-1: return max(m,n) elif s[i]==p[j]: return ed(i-1,j-1) elif i>=1 and s[i-1]==p[j] and s[i]==p[j-1]: return 1+min(ed(i-2,j-2),min(ed(i-1,j),ed(i,j-1))) elif s[i]!=p[j] and (s[i-1]!=p[j] or s[i]!=p[j-1]): return 1+min(ed(i-1,j-1),min(ed(i-1,j),ed(i,j-1))) #print s[j], #print for i in range(l-1,u): print ed(i,n-1), #a = int(raw_input("input a:")) #b = int(raw_input("input b:")) #print min(a,b)
代码运行结果
input string:reprter
input pattern:repo
2 1 1 2 3
repr 和 rep代表这距离repo最近的字符串
相关文章推荐
- 文字编辑距离代码实现
- 编辑距离的求解方法和代码实现
- 编辑距离及代码实现
- [网页]双击文字后实现编辑文本功能
- GridView 实现自定义分页、排序、查询、添加、编辑、多选删除 之代码规范
- asp文章中随机插入网站版权文字的实现代码
- 用css滤镜实现的文字描边效果的代码
- GridView 实现自定义分页、排序、查询、添加、编辑、多选删除 之代码规范
- JS实现即点即编辑功能代码
- CSS文字截取功能实现代码
- CSS文字截取功能实现代码
- 用CSS实现文字垂直居中的代码
- 文字逐字上屏的实现(C代码)
- 用CSS实现文字垂直居中的代码
- JQuery AJAX实现目录浏览与编辑的代码
- asp文章中随机插入网站版权文字的实现代码
- 编辑距离算法的java实现
- 如何 实现代码编辑状态下 安全过滤html标签
- gridview 实现自定义分页、排序、查询、添加、编辑、多选删除 之代码规范
- 用CSS实现文字垂直居中的代码