2011-05-21 25 views
5

Sözlükle birlikte bir optik karakter tanıma sistemi oluşturmaya çalışıyorum. Henüz bir uygulamaya sözlüğü yok AslındaOCR: ağırlıklı Levenshtein mesafesi

=)

farklı semboller arasındaki hesap farklı mesafe almak Levenstein mesafeye göre basit metriği bulunmadığına dikkat duydum. Örneğin. 'N' ve 'H' birbirine çok yakındır ve d ("THEATER", "TNEATRE") d ("THEATER", "TOEATRE") 'den daha az olmalıdır ve bu da temel Levenstein mesafesini kullanarak imkansızdır.

Bu tür bir metriği bulmama yardımcı olabilir misiniz, lütfen.

Dikkat Edilmesi Gereken Tanklar.

cevap

4

Bu aradığınızı olabilir:

Güncelleme http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance (ve nazik bazı çalışma kod bağlantı dahildir):

İşte

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

+0

Maalesef aradığım şey bu değildi. Neyse zaten onur derecesiyle mezun oldum - ve artık bir çözüme ihtiyacım yok =) – leshka

+0

Bu garip, çünkü amaç tam olarak istediğin şey. – briantyler

+1

hmmm .. Bağlantınıza baktım. Ama benim anladığım şu ki, sadece bir operasyon daha eklediler: transpozisyon. İki komşu sembolü değiştirdiğinizde aktarımın olduğu yer. Eğer yanılıyorsam, lütfen wiki sayfasındaki yeri, farklı harfler arasındaki farklı mesafeden söz ediyor olabilir misiniz? – leshka

1

bir örnektir (C#) "karakter değiştir" işleminin ağırlığı, karakter kodları arasındaki uzaklığa bağlıdır:

 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] ; 
    } 

Burada nasıl çalıştığını görüyorsunuz: http://ideone.com/RblFK