最小编辑距离是用来衡量两个字符串的相似度
比如从“cabc”到“abc”,我们删除最前面的‘c’即可。
对于字符串的操作主要包括三类:删除,插入和替换(替换可以看作是删除和插入的组合)
我们设置删除和插入的代价为1,那么替换的代价则为2.
详细参考《自然语言处理总理》5.6最小编辑距离。
比如从“cabc”到“abc”,我们删除最前面的‘c’即可。
对于字符串的操作主要包括三类:删除,插入和替换(替换可以看作是删除和插入的组合)
我们设置删除和插入的代价为1,那么替换的代价则为2.
详细参考《自然语言处理总理》5.6最小编辑距离。
java实现版本
public class MED{
public static void main(String[] args){
MED med = new MED();
med.min_edit_dic("abc", "cabc");
}
public int min_edit_dic( String target ,String source){
int n = target.length();
int m = source.length();
int[][] distance = new int[ n+1 ][ m+1 ];
distance[ 0 ][ 0 ] = 0;
for ( int i = 1; i <= n; i++){
distance[ i ][ 0 ] = distance[ i-1 ][ 0 ] + ins_cost(target.charAt(i-1));
}
for ( int j = 1; j <= n; j++){
distance[ 0 ][ j ] = distance[ 0 ][ j-1 ] + ins_cost(target.charAt(j-1));
}
for ( int i = 1; i <= n; i++){
for ( int j = 1; j <= m; j++){
int ins = distance[ i-1 ][ j ] +ins_cost(target.charAt(i-1));
int sub = distance[ i-1 ][ j-1 ] + subs_cost(target.charAt(i-1),source.charAt(j-1));
int del = distance[ i ][ j -1 ] + del_cost(source.charAt(j-1));
distance[i][j] = min( ins, min(sub,del));
}
}
for ( int i = 0; i <= n; i++){
for ( int j = 0; j <= m; j++){
System.out.print(distance[i][j]+"\t");
}
System.out.println();
}
return 1;
}
private int min(int d1, int d2){
return d1 < d2 ? d1: d2;
}
private int ins_cost(char c){
return 1;
}
private int del_cost(char c){
return 1;
}
private int subs_cost(char c1 , char c2){
return c1 != c2 ? 2 : 0;
}
}