計算字符串相似度算法—Levenshtein


什么是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;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM