【问题标题】:Ruby - search file for a similar wordRuby - 搜索文件中的相似词
【发布时间】:2017-07-26 15:00:42
【问题描述】:
我对大量文档进行了 OCR 扫描,需要在扫描的文件中识别关键字。问题是,因为 OCR 不可靠——例如,“SUBSCRIPTION”这个词可能最终成为“SUBSCR|P||ON”——我需要搜索 near match 而不是完全匹配。
有谁知道我如何在文件中搜索单词“SUBSCRIPTION”并在找到 80% 匹配时返回 true?
【问题讨论】:
标签:
ruby
pdf
match
ocr
partial
【解决方案1】:
查看宝石 Amatch,发现 here。这个 gem 实现了几种距离算法。另外,请阅读其他answer,了解 Levenshtein 和 Jaro 距离算法之间的区别,并检查哪个更适合您。
TL;DR,这里有一个小 sn-p,可帮助您开始使用 Amatch gem 解决问题。
'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
如果您想评估给定文本是否出现任何单词,请尝试以下操作:
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
请注意,如果您愿意,您也可以对文本单词调用方法#downcase。您必须先解析原始文件的文本内容。希望这会有所帮助!