2017-07-26 4 views
0

Ich habe OCR eine große Anzahl von Dokumenten gescannt und muss ein Schlüsselwort in den gescannten Dateien identifizieren. Das Problem ist, weil die OCR nicht zuverlässig ist - zum Beispiel das Wort "ABONNEMENT" möglicherweise "SUBSCR | P || ON" - ich muss nach einem in der Nähe von Match anstatt einer vollständigen Übereinstimmung suchen.Ruby - Datei nach einem ähnlichen Wort suchen

Weiß jemand, wie ich eine Datei nach dem Wort "SUBSCRIPTION" durchsuchen kann und true zurückgeben kann, wenn eine Übereinstimmung von 80% gefunden wird?

+2

Vielleicht könnte die [Levenshtein Distance] (https://en.wikipedia.org/wiki/Levenshtein_distance) in diesem Zusammenhang nützlich sein. Es gibt einige Implementierungen dieses Algorithmus auf [Rubygems] (https://rubygems.org/search?query=Levenshtein). – spickermann

Antwort

0

Werfen Sie einen Blick auf das Juwel Amatch, gefunden here. Dieses Juwel implementiert mehrere Distanzalgorithmen. Lesen Sie auch diese anderen answer über den Unterschied zwischen Levenshtein und Jaro Abstand Algorithmen und überprüfen Sie, welche für Sie besser geeignet ist.

TL, DR, hier ist ein kleiner Ausschnitt, der Ihnen bei der Lösung Ihres Problems hilft, indem Sie den Edelstein Amatch verwenden.

'subscription'.levenshtein_similar('SUBSCR|P||ON') #=> 0.0 
'SUBSCRIPTION'.levenshtein_similar('SUBSCR|P||ON') #=> 0.75 
'subscription'.jaro_similar('SUBSCR|P||ON')  #=> 0.83 
'SUBSCRIPTION'.jaro_similar('SUBSCR|P||ON')  #=> 0.83 
'subscription'.jarowinkler_similar('SUBSCR|P||ON') #=> 0.9 
'SUBSCRIPTION'.jarowinkler_similar('SUBSCR|P||ON') #=> 0.9 

Wenn Sie, wenn ein bestimmter Text alle Vorkommen eines Wortes hat bewerten zu können, versuchen Sie dies:

def occurs?(text, target_word) 
    text_words = text.split(' ') # Splits the text into an array of words. 
    text_words.each do |word| 
    return true if word.jaro_similar(target_word) > 0.8 
    end 
    false 
end 

example_text = 'This text has the word SUBSCR|P||ON malformed.' 
other_text = 'This text does not.' 

occurs?(example_text, 'SUBSCRIPTION') #=> true 
occurs?(other_text, 'SUBSCRIPTION') #=> false 

Beachten Sie, dass Sie die Methode #downcase den Text Wörter nennen, wenn Sie es vorziehen. Und Sie müssen zuerst den Textinhalt Ihrer Originaldatei analysieren. Hoffe das hilft!

Verwandte Themen