动态规划 求解 Minimum Edit Distance
http://blog.csdn.net/abcjennifer/article/details/7735272
自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit Distance, 也称Levenshtein distance。受到一篇Edit Distance介绍文章的启发,本文用动态规划求取了两个字符串之间的minimal Edit Distance. 动态规划方程将在下文进行讲解。
简单地说,就是仅通过插入(insert)、删除(delete)和替换(substitute)个操作将一个字符串s1变换到另一个字符串s2的最少步骤数。熟悉算法的同学很容易知道这是个动态规划问题。
其实一个替换操作可以相当于一个delete+一个insert,所以我们将权值定义如下:
I (insert):1
D (delete):1
S (substitute):2
2. example:
intention->execution
Minimal edit distance:
delete i ; n->e ; t->x ; insert c ; n->u 求和得cost=8
3.calculate minimal edit distance dynamically
思路见注释,这里D[i,j]就是取s1前i个character和s2前j个character所得minimal edit distance
三个操作动态进行更新:
D(i,j)=min { D(i-1, j) +1, D(i, j-1) +1 , D(i-1, j-1) + s1[i]==s2[j] ? 0 : 2};中的三项分别对应D,I,S。(详见我同学的博客)
- /*
- * minEditDis.cpp
- *
- * @Created on: Jul 10, 2012
- * @Author: sophia
- * @Discription: calculate the minimal edit distance between 2 strings
- *
- * Method : DP (dynamic programming)
- * D[i,j]: the minimal edit distance for s1的前i个字符和 s2的前j个字符
- * DP Formulation: D[i,j]=min(D[i-1,j]+1,D[i,j-1]+1,D[i-1,j-1]+flag);//其中if(s1[i]!=s2[j])则flag=2,else flag=0;
- *
- */
- #include"iostream"
- #include"stdio.h"
- #include"string.h"
- using namespace std;
- #define N 100
- #define INF 100000000
- #define min(a,b) a<b?a:b
- int dis[N][N];
- char s1[N],s2[N];
- int n,m;//length of the two string
- int main()
- {
- int i,j,k;
- while(scanf("%s%s",&s1,&s2)!=EOF)
- {
- n=strlen(s1);m=strlen(s2);
- for(i=0;i<=n+1;i++)
- for(j=0;j<=m+1;j++)
- dis[i][j]=INF;
- dis[0][0]=0;
- for(i=0;i<=n;i++)
- for(j=0;j<=m;j++)
- {
- if(i>0) dis[i][j] = min(dis[i][j],dis[i-1][j]+1); //delete
- if(j>0) dis[i][j] = min(dis[i][j],dis[i][j-1]+1);//insert
- //substitute
- if(i>0&&j>0)
- {
- if(s1[i-1]!=s2[j-1])
- dis[i][j] = min(dis[i][j],dis[i-1][j-1]+2);
- else
- dis[i][j] = min(dis[i][j],dis[i-1][j-1]);
- }
- }
- printf("min edit distance is: %d\n",dis[n][m]);
- }
- return 0;
- }
感谢FallingStar08的提醒,上面最小化的宏定义部分改为
- #ifndef min
- #define min(a,b) (((a) < (b)) ? (a) : (b))
- #endif
运行结果:
intention
execution
min edit distance is: 8
abc
acbfbcd
min edit distance is: 4
zrqsophia
aihposqrz
min edit distance is: 16
另外,xuhanqiu在下面的提示也很有意义:
coursera
上老师讲substitute的cost=2默认了substitute =
delete+insertion,而这样违反了三角不等式即dis(a,b)+dis(a,c)>dis(b,c),这样一来sustitute
就失去了存在的意义,所以如果存在三个基本操作delete,insert和substitute,我们应当把substitute
cost改为1,而上面的代码对应于基本操作仅有delete和insertion的情况。当然,实际中有很多变体,具体问题具体分析。
Reference:
1. https://www.coursera.org/course/nlp
2. http://blog.csdn.NET/huaweidong2011/article/details/7727482
动态规划 求解 Minimum Edit Distance的更多相关文章
- 编辑距离(Minimum Edit Distance)
编辑距离(Minimum Edit Distance,MED),也叫 Levenshtein Distance.他的含义是计算字符串a转换为字符串b的最少单字符编辑次数.编辑操作有:插入.删除.替换( ...
- Minimum edit distance(levenshtein distance)(最小编辑距离)初探
最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离.是指两个字串之间,由一个转成还有一个所需的最少编辑操作次数.许可的编辑操作包含将一个字符替换成还有一个字符. ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- Min Edit Distance
Min Edit Distance ----两字符串之间的最小距离 PPT原稿参见Stanford:http://www.stanford.edu/class/cs124/lec/med.pdf Ti ...
- 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance
引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...
- Edit Distance问题在两种编程范式下的求解
本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...
- Edit Distance——经典的动态规划问题
题目描述Edit DistanceGiven two words word1 and word2, find the minimum number of steps required to conve ...
- Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance)
Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可 ...
- 【leetcode】Edit Distance
Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert ...
随机推荐
- 【Alpha版本】冲刺阶段——Day 4
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
- Nginx配置文件详细说明
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data; #启动进程,通常设置成和cpu的数量相等worker_process ...
- ubuntu eclipse 不能新建javaweb项目解决方案
ubuntu下,通过sudo apt-get install eclipse 成功安装了eclipse,可它简洁的都让我不知如何新建web project.网上查了众多资料,终于找到了一系列简洁的方法 ...
- [转]PL/SQLDeveloper导入导出Oracle数据库方法
原文地址:http://www.2cto.com/database/201405/305452.html 1.Oracle数据库导出步骤 1.1 Tools→Export User Objects.. ...
- iOS开发小技巧--计算label的Size的方法总结
计算label的Size方法 sizeWithAttributes:方法 适用于不换行的情况,宽度不受限制的情况 /// 根据指定文本和字体计算尺寸 - (CGSize)sizeWithText:(N ...
- iOS开发小技巧--实现毛玻璃效果的方法
一.美工出图 二.第三方框架 -- DRNRealTimeBlur,框架继承自UIView.使用方法:创建UIView直接继承自框架的View,就有了毛玻璃效果 三.CoreImage -- 图片加高 ...
- open-flash-chart2
链接 http://www.oschina.net/news/10797/Open-Flash-Chart-2-0 open-flash-chart.rar http://123-reg-suspen ...
- CentOS6.5下搭建NFS文件服务器
本文参考这里 CentOS下搭建NFS服务器总结 环境介绍: 1. 服务器: 192.168.0.100 2. 客户机: 192.168.0.101 安装软件包: 服务器和客户机都要安装nfs 和 r ...
- codeforces 580D:Kefa and Dishes
Description When Kefa came to the restaurant and sat at a table, the waiter immediately brought him ...