莱文斯坦距离计算字符串的相似度

基本理论

莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为 s (原字符串) 和 t (目标字符串)。莱文斯坦距离被定义为”将字符串 s 变换为字符串 t 所需的删除、插入、替换操作的次数”

算法原理

该算法的解决是基于动态规划的思想,具体如下:
设 s 的长度为 n,t 的长度为 m。如果 n = 0,则返回 m 并退出;如果 m=0,则返回 n 并退出。否则构建一个数组 d[0..m, 0..n]。
将第0行初始化为 0..n,第0列初始化为0..m。
依次检查 s 的每个字母(i=1..n)。
依次检查 t 的每个字母(j=1..m)。
如果 s[i]=t[j],则 cost=0;如果 s[i]!=t[j],则 cost=1。将 d[i,j] 设置为以下三个值中的最小值:
紧邻当前格上方的格的值加一,即 d[i-1,j]+1
紧邻当前格左方的格的值加一,即 d[i,j-1]+1
当前格左上方的格的值加cost,即 d[i-1,j-1]+cost
重复3-6步直到循环结束。d[n,m]即为莱茵斯坦距离。

代码实现

import Levenshtein
class TextAnalyse:
    def LevenshiteinSimilarity(self,string1,string2):
        return Levenshtein.ratio(string1,string2)
    def similay(self,string1,string2):
        similar = self.LevenshiteinSimilarity(string1,string2)
        return similar
if __name__ == '__main__':
    t = TextAnalyse()
    print t.similay('基于YYYssssssssssss的xxxxxx001项目','YYYssssssssssss')

java版:

public class MinimumEditDistance { 

    public static int minEditDistance(String dest, String src) { 
        int[][] f = new int[dest.length()+1][src.length() + 1]; 
        f[0][0] = 0; 
        for (int i = 1; i < dest.length() + 1; i  ) { 
            f[i][0] = i; 
        } 
        for (int i = 1; i < src.length() + 1; i  ) { 
            f[0][i] = i; 
        } 
        for (int i = 1; i < dest.length() + 1; i  ) { 
            for (int j = 1; j < src.length() + 1; j  ) { 
                // 替换的开销 
                int cost = 0; 
                if (dest.charAt(i - 1) != src.charAt(j - 1)) { 
                    cost = 1; 
                } 
                int minCost; 
                if (f[i - 1][j] < f[i][j - 1]) { 
                    minCost = f[i - 1][j] + 1; 
                } else { 
                    minCost = f[i][j - 1] + 1; 
                } 
                if (minCost > f[i - 1][j - 1] + cost) { 
                    minCost = f[i - 1][j - 1] + cost; 
                } 
                f[i][j] = minCost; 
            } 
        } 
        return f[dest.length()][src.length()]; 

    } 
    public static void main(String[] args) { 
        System.out.println(minEditDistance("kindle", "ainelw")); 
    } 
}

你可能感兴趣的:(自然语言处理,莱文斯坦距离-字符串)