如何从文本中去除OCR伪影?

4
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 öffnet, 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
你只需要处理异常。编译一个德语中长度为1个字符的单词列表。 - Knu
1
这可能会更加复杂,你可能需要一本德语词典和一些语法规则。而且你应该接受一些错误... - Basile Starynkevitch
我理解您需要目标语言的语料库。与其询问具体算法,我更感兴趣的是一般方向、设置和扩展问题等。 - miku
我的答案有什么遗漏或错误吗? - j_random_hacker
@j_random_hacker,不,完全不是,我很高兴看到你的回答。我只是想看看这个话题是否有更多的意见。 - miku
1个回答

2
如果您有目标语言的字典,并且所有空格分开的单词都由一个单词组成,那么很容易:只需扫描文本,查找最长的连续的单个字母的空格,如果存在相应的字典单词,则用该单个字典单词替换它们(否则保持不变)。
唯一的真正困难是像“mitdem”这样对应于两个或多个单独单词的字符串。简单的方法是贪心地“咬下”出现在字典中的前缀,但这可能会导致次优结果,尤其是后缀不对应于任何字典字符串的情况,即使不同的断点选择可以起作用(例如,如果您从前面贪婪地抓取“bei”而不是“beim”,那么“beimArzt”将无法工作)。幸运的是,有一种简单的线性时间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,则会得到尽可能少的单词分解。您还可以选择为更“可能”的单词授予更高的分数。

计算这些分数后,您可以通过DP矩阵向后遍历以重构对应于最大分数的分解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接