2017-09-09 1 views
0

Ich habe an einem OCR-Programm gearbeitet, das ein Foto mit Text (in diesem speziellen Fall einen Führerschein) sowie einen Vornamen und einen Leisten akzeptiert Name als Argumente.C# Suche nach ähnlichen Nadel im Heuhaufen (für OCR)

Sobald die Software das ID-Foto liest, suche ich nach dem Vor- und Nachnamen im erkannten Text. Leider, da die Bildqualität ziemlich niedrig sein kann, wird es manchmal den Namen nicht ganz richtig bekommen.

Gibt es eine Möglichkeit, nach einer ÄHNLICHEN Nadel im Heuhaufen zu suchen? Suchen Sie nach Vorkommen, die dem Vor-/Nachnamen ähneln? Zum Beispiel:

Needle: campbell 

Haystack: 
operaioxsllcence 
gcltdriver 
exries13NOV2020 
carnpbeiljtttj 
... 

Die Zeichenfolge, die nahe genug wäre, ist "carnpbeil". Diese

ist, was ich bin jetzt mit, und es hilft nur in ganz bestimmten Situationen:

private bool SourceContains(string haystack, string needle) 
    { 
     bool ret = false; 
     if (haystack.Contains(needle) || 
       haystack.Replace("l", "i").Contains(needle) || 
       haystack.Replace("i", "l").Contains(needle) || 
       haystack.Replace("0", "o").Contains(needle) || 
       haystack.Replace("o", "0").Contains(needle) || 
       haystack.Replace("j", "d").Contains(needle) || 
       haystack.Replace("d", "j").Contains(needle) || 
       haystack.Replace("i", "j").Contains(needle) || 
       haystack.Replace("j", "i").Contains(needle) || 
       haystack.Replace("e", "f").Contains(needle) || 
       haystack.Replace("f", "e").Contains(needle) || 
       haystack.Replace("r", "p").Contains(needle) || 
       haystack.Replace("p", "r").Contains(needle) || 
       haystack.Replace("s", "r").Contains(needle) || 
       haystack.Replace("r", "s").Contains(needle) || 
       haystack.Replace("r", "n").Contains(needle) || 
       haystack.Replace("n", "r").Contains(needle) || 
       haystack.Replace("k", "n").Contains(needle) || 
       haystack.Replace("n", "k").Contains(needle) || 
       haystack.Replace("h", "n").Contains(needle) || 
       haystack.Replace("n", "h").Contains(needle) || 
       haystack.Replace("k", "ll").Contains(needle) || 
       haystack.Replace("ll", "k").Contains(needle) || 
       haystack.Replace("ci", "d").Contains(needle) || 
       haystack.Replace("d", "ci").Contains(needle) || 
       haystack.Replace("cl", "d").Contains(needle) || 
       haystack.Replace("d", "cl").Contains(needle) || 
       haystack.Replace("m", "in").Contains(needle) || 
       haystack.Replace("in", "m").Contains(needle) || 
       haystack.Replace("rn", "m").Contains(needle) || 
       haystack.Replace("m", "rn").Contains(needle) 
       ) 
     { 
      ret = true; 
     } 
     return ret; 
    } 

Antwort

0

Für jedes Wort in haystack die levenshtein distance-needle berechnen. Das Wort mit der kürzesten Entfernung ist höchstwahrscheinlich deine Nadel. Sehen Sie sich this question für Implementierungen an.

+0

Leider werden die erkannten Wörter manchmal nicht richtig aufgeteilt. Wie in dem Beispiel, das ich zeigte, wäre "carnpbeil" die Übereinstimmung für Campbell (die Buchstaben SUCHEN das gleiche), aber das "Wort" ist "carnpbeiljtttj", da es auch den Vornamen mit dem letzten einmeißelte. Ich denke, dass die einzige Möglichkeit, die ich verbessern werde, ist, die Qualität der Bilder zu verbessern. –

Verwandte Themen