您是否尝试过使用最长公共子序列算法?这些在源代码管理应用程序和一些文本编辑器中使用的“差异”文本比较工具中很常见。diff 算法有助于识别两个文本样本中已更改和未更改的字符。
http://en.wikipedia.org/wiki/Diff
几年前,我开发了一个与您类似的 OCR 应用程序。我没有将多个 OCR 引擎应用于一张图像,而是使用一个 OCR 引擎来分析同一图像的多个版本。每个处理后的图像都是对原始图像应用不同去噪技术的结果:一种技术在低对比度下效果更好,另一种技术在字符形成不良时效果更好。比较每个图像上的 OCR 结果的“投票”方案提高了任意文本字符串的读取率,例如“BQCM10032”。OCR 的学术文献中描述了其他投票方案。
有时您可能需要匹配一个没有任何 OCR 结果组合会产生所有字母的单词。例如,可能缺少中间字母,如“w rd”或“c tch”(可能是“word”和“catch”)。在这种情况下,它可以帮助您使用三个键中的任何一个来访问您的字典:首字母、中间字母和尾字母(或字母组合)。每个键都与按语言中出现频率排序的单词列表相关联。(我使用这种多键查找来提高填字游戏生成应用程序的速度;可能有更好的方法,但这个很容易实现。)
为了节省内存,您可以只对语言中的前几千个常用词应用多键方法,然后对不太常用的词只使用一种查找技术。
有几个在线词频列表。
http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists
如果你想变得花哨,你也可以依靠文本中的先前出现频率。例如,如果“Byrd”多次出现,那么如果 OCR 引擎报告“bird”或“bard”的置信度得分较低,则可能是更好的选择。仅当在同一页面上出现统计上不太可能的医学术语时,您才可以将医学词典加载到内存中——否则将医学术语从您的工作词典中删除,或者至少为它们分配合理的可能性。“假肢”是一个常用词;“前列腺炎”就更少了。
如果您有图像处理技术(例如去噪和形态学运算)的经验,您还可以尝试在将图像传递给 OCR 引擎之前对其进行预处理。在您的软件识别出 OCR 引擎表现不佳的单词或区域后,图像处理也可以应用于选择区域。
某些字母/字母和字母/数字替换很常见。数字 0(零)可能与字母 O、C 代表 O、8 代表 B、E 代表 F、P 代表 R,等等。如果发现一个词的置信度较低,或者如果有两个常见词可以匹配一个未完全阅读的词,那么特别的形状匹配规则可能会有所帮助。例如,“bcth”可以匹配“both”或“bath”,但对于许多字体(和上下文),“both”更可能匹配,因为“o”在形状上更类似于“c”。在长长的单词串中,例如小说或杂志文章中的一段,“bath”比“b8th”更合适。
最后,您可能会编写一个插件或脚本将结果传递给一个拼写检查引擎,该引擎检查名词-动词一致性和其他语法检查。这可能会捕获一些额外的错误。也许您可以尝试 VBA for Word 或任何其他流行的脚本/应用程序组合。