如何从文本中删除 OCR 伪像?

How to remove OCR artifacts from text?

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/

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

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

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 表示不存在的单词,您将分解为尽可能少的单词。您还可以选择为更多 "likely" 个单词奖励更高的分数。

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