【问题标题】:How to remove OCR artifacts from text?如何从文本中删除 OCR 伪影?
【发布时间】:2023-04-11 05:17:01
【问题描述】:

OCR 生成的文本有时会附带工件,例如这个:

Diese grundsätzliche V e r b o r g e n h e i t Gottes, die sich n u r dem N a c h f o l g e r ö f f n e t , ist m i t d e m Messiasgeheimnis gemeint

虽然将字母之间的间距用作强调(可能是由于早期印刷机的限制)并不罕见,但它不利于检索任务。

如何将上述文本转换为更规范的形式,例如:

Diese grundsätzliche Verborgenheit Gottes, die sich nur dem Nachfolger öffnet, ist mit dem Messiasgeheimnis gemeint

这可以有效地处理大量文本吗?


一个想法是连接整个字符串(跳过猜测,单词边界在哪里),然后对其运行文本分割算法,可能类似于:http://norvig.com/ngrams/

【问题讨论】:

  • 你只需要处理异常。编译一个 1 个字符长的德语单词列表。
  • 它可能更复杂,你可能需要一个德语词典和一些语法规则。你应该接受一些错误......
  • 我明白,您需要目标语言的语料库。与其要求一个具体的算法,我更感兴趣的是一般方向或设置和缩放问题等等。
  • 我的回答有什么遗漏或错误吗?
  • @j_random_hacker,不,一点也不,我很高兴你的回答。我只是想看看,他们是否对这个话题有更多的看法。

标签: algorithm ocr text-processing information-retrieval text-segmentation


【解决方案1】:

如果您有目标语言的字典,并且所有间隔的单词只是一个单词,那么这很容易:只需扫描文本,寻找最大长度的运行间隔的单个字母,如果存在则用单个对应的字典单词替换它们(否则保持不变)。

唯一真正的困难是像m i t d e m 这样对应于两个或多个单独单词的字符串。一种简单的方法是贪婪地“蚕食”字典中出现的前缀,但这可能会导致次优结果,特别是即使选择不同的断点也会导致后缀与任何字典字符串都不对应工作(例如,如果你从前面贪婪地抓住bei 而不是beimb e i m A r z t 将无法工作)。幸运的是,有一种简单的线性时间 DP 方法可以做得更好——甚至可以在单词上加入权重,这有助于在有多个单词的情况下获得最可能的分解。给定一个字符串 S[1 .. n](去掉空格),我们将计算 f(i),即 S 的长度为 i 前缀的最佳分解分数,对于所有 1

f(0) = 0
f(i) = max over all 0 <= j < i of f(j) + dictScore(S[j+1 .. i])

f(n) 将是整个字符串的最佳分解分数。如果将字典中存在的单词设置为 dictScore(T) 为 1,将不存在的单词设置为 0,您将分解为尽可能多的单词;如果您将 dictScore(T) 设置为,例如,-1 表示字典中存在的单词,而 -2 表示不存在的单词,您将分解为尽可能少的单词。您还可以选择为更“可能”的词授予更高的分数。

计算完这些分数后,您可以回溯 DP 矩阵以重构对应于最大分数的分解。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多