2011-05-21 172 views
5

我試圖用字典創建光學字符識別系統。OCR:加權Levenshtein距離

有實現的字典其實我還不=)

我聽說有基於編輯距離其採取不同符號之間的帳戶不同距離的簡單的指標。例如。 'N'和'H'非常接近,d(「THEATER」,「TNEATRE」)應該小於d(「THEATER」,「TOEATRE」),使用基本的Levenstein距離是不可能的。

請幫我找到這樣的指標。

坦克的注意。

回答

4

這可能是你在找什麼:http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance(和親切一些工作代碼包含在的鏈接)

更新:

http://nlp.stanford.edu/IR-book/html/htmledition/edit-distance-1.html

+0

不幸的是,這不是我正在尋找。無論如何,我已經以優異成績畢業了 - 我不再需要解決方案了=) – leshka 2011-07-29 11:35:42

+0

這很奇怪,因爲它的目的正是你所要求的。 – briantyler 2011-07-29 12:59:45

+1

嗯..我查看了你的鏈接。但是我知道他們只是增加了一個操作:換位。當你改變兩個相鄰的符號時換位。如果我錯了,請在維基頁面上指定他們在談論不同字母之間不同距離的地方? – leshka 2011-07-29 13:07:14

1

下面是一個例子(C#) 「替換字符」操作的重量取決於字符代碼之間的距離:

 static double WeightedLevenshtein(string b1, string b2) { 
     b1 = b1.ToUpper(); 
     b2 = b2.ToUpper(); 

     double[,] matrix = new double[b1.Length + 1, b2.Length + 1]; 

     for (int i = 1; i <= b1.Length; i++) { 
      matrix[i, 0] = i; 
     } 

     for (int i = 1; i <= b2.Length; i++) { 
      matrix[0, i] = i; 
     } 

     for (int i = 1; i <= b1.Length; i++) { 
      for (int j = 1; j <= b2.Length; j++) { 
       double distance_replace = matrix[(i - 1), (j - 1)]; 
       if (b1[i - 1] != b2[j - 1]) { 
        // Cost of replace 
        distance_replace += Math.Abs((float)(b1[i - 1]) - b2[j - 1])/('Z'-'A'); 
       } 

       // Cost of remove = 1 
       double distance_remove = matrix[(i - 1), j] + 1; 
       // Cost of add = 1 
       double distance_add = matrix[i, (j - 1)] + 1; 

       matrix[i, j] = Math.Min(distance_replace, 
            Math.Min(distance_add, distance_remove)); 
      } 
     } 

     return matrix[b1.Length, b2.Length] ; 
    } 

你看它是如何工作在這裏:http://ideone.com/RblFK