动态规划-计算字符串相似度 Levenshtein Distance

编程之美这本书里说过:
许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程序。我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:
1.修改一个字符(如把“a”替换为“b”);  
2.增加一个字符(如把“abdd”变为“aebdd”);
3.删除一个字符(如把“travelling”变为“traveling”);
比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。上面的两种方案,都仅需要一 次 。把这个操作所需要的次数定义为两个字符串的距离,而相似度等于“距离+1”的倒数。也就是说,“abcdefg”和“abcdef”的距离为1,相似度 为1/2=0.5。
那么我们为什么会需要计算Levenshtein Distance呢?

用途:
.模糊查询
.论文查重
.爬虫技术,不通过搜索引擎的存储而直接获取最相似的url
那么是如何实现的呢?


核心代码如下:
//建立一个表格
int[][] dif = new [str1.length()+1][str2.length()+1];
//对表格行初始化
for(int i=0;i<=str1.length();i++){
    dif[i][0]=i;
}
//对表格列初始化
for(int i=0;i<=str2.length();i++){
    dif[0][i]=i;
}
int temp = 0;
for(int i=1;i<str1.length();i++){
    for(int j=0;j<str2.length();j++){
        if(str1.charAt(i-1)==str.charAt(j-1)){
           temp = 0;
    }else{
           temp = 1;
     }
     dif[i][j]=min(dif[i-1][j]+1,dif[i][j-1]+1,dif[i-1][j-1]+temp);
  }

}
//根据相似度公式进行计算
 float similarity =1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());  

猜你喜欢

转载自w-sl.iteye.com/blog/2306072
今日推荐