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!
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