【问题标题】: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。您必须先解析原始文件的文本内容。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 2013-04-26
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多