什么是Levenshtein
Levenshtein 距離,又稱編輯距離,指的是兩個字符串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。levenshtein() 函數返回兩個字符串之間的 Levenshtein 距離。編輯距離的算法是首先由俄國科學家Levenshtein提出的,故又叫Levenshtein Distance
實現過程
首先我們明確從一個字符串變化到另一個字符串需要進行添加、修改、刪除來變化
如a變化到ab需要一步,添加一個b,
aa變化到ab需要修改一個a到b,
ab變化到a需要刪除一個b。
首先我們確定了兩個字符串str1,str2;假設這兩個字符為a1a2a3a4......,b1b2b3......
那么構建一個二維矩陣
空 a1 a2 a3 a4 ......
空 [1] [2] [3] [4] [5]......
b1 [6] [7] [8] [9] [10]......
b2 [11] [12] [13] [14] [15]......
b3 [16] [17] .......
...
1.判斷[1]左邊為空,上面為空,從空到空需要變化0次
2.所以可以得到下面的矩陣
空 a1 a2 a3 a4 ......
空 0 1 2 3 4......
b1 1 [7] [8] [9] [10]......
b2 2 [12] [13] [14] [15]......
b3 3 [17] .......
.......
3.到7的位置表示了[空a1]變化到[空b1],這里我們需要得到三個值
1)從[2]變化到[7]需要的步數是[2]+1
2)從[6]變化到[7]需要的變化是[6]+1
3) 從[1]變化到[7]需要的變化是 ,如果a1=b1,那么需要0步,如果a1!=b1,那么需要刪除一個a1在添加一個b1,需要2步,也就是大於1步。
我們取這三步中所需走的最短步數填到[7]的位置 。
4.以此推得到
Amn的值為Am-1n+1,Amn-1+1,Am-1n-1+x(當am=bn時x=0,否則x=2)的最小值
5.當求得的值的最后一位得到的值N,用1-n/(max(len(a),len(b)))得到相關度。
實現代碼
/// <summary> /// Levenshtein 算法實現 /// </summary> /// <param name="value1"></param> /// <param name="values2"></param> /// <returns></returns> public static float Leven(string value1, string value2) { int len1 = value1.Length; int len2 = value2.Length; int [,] dif =new int[len1+1,len2+1]; for (int a=0;a<=len1;a++) { dif[a,0] = a; } for (int a = 0; a <= len2; a++) { dif[0, a] = a; } int temp =0; for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { if (value1[i - 1] == value2[j - 1]) { temp = 0; } else { temp = 1; } dif[i,j] = Min(dif[i - 1,j - 1] + temp, dif[i,j - 1] + 1, dif[i - 1,j] + 1); } } float similarity=1- (float)dif[len1, len2]/Math.Max(len1,len2); return similarity; } public static int Min(int a, int b, int c) { int i = a < b ? a : b; return i = i < c ? i : c; }