動態規劃 求解 Minimum Edit Distance
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
自然語言處理(NLP)中,有一個基本問題就是求兩個字串的minimal Edit Distance, 也稱Levenshtein distance。受到一篇Edit Distance介紹文章的啟發,本文用動態規劃求取了兩個字串之間的minimal Edit Distance. 動態規劃方程將在下文進行講解。
1. what is 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:bint dis[N][N];char s1[N],s2[N];int n,m;//length of the two stringint 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的情況。當然,實際中有很多變體,具體問題具體分析。
1. https://www.coursera.org/course/nlp
2. http://blog.csdn.net/huaweidong2011/article/details/7727482