最小编辑距离

33 篇文章 0 订阅
最小编辑距离是用来衡量两个字符串的相似度
比如从“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;		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值