我想从扫描文档中识别可能存在 OCR 错误的关键字。基于关键字列表和每个字符的置信度值及其扫描文档的替代项,我如何开发一种算法来可靠地识别关键字?
对于 OCR,我使用的是 Tesseract,它为每个字符及其最佳选择提供置信度值。因此,对于每个单词,我都有一个这样的列表:
Word=order
[0] o (93%) [alts: 0 (90%), c (83%), e (82%)]
[1] r (96%)
[2] d (96%)
[3] e (90%) [alts: a (75%)]
[4] r (95%)
另一个包括 OCR 错误的示例:
Word=PaYmeHI (Payment would be correct)
[0] P (81%) [alts: p (78%), D (68%)]
[1] a (76%) [alts: 3 (73%), e (63%), ö (61%)]
[2] Y (87%) [alts: V (86%)]
[3] m (83%)
[4] E (71%) [alts: € (79%), 9 (72%), % (67%), e (65%), B (64%), G (64%)]
[5] H (76%) [alts: n (83%), D (74%), N (70%), ü (69%)]
[6] I (75%) [alts: t (69%), { (67%), 1 (65%), i (61%)]
如您所见,tesseract 并不总是选择百分比最高的结果 (4, 5)。
从浏览结果来看,大多数具有 90% 以上值的字符都是正确的。但是,坏结果不一定包含替代列表中的正确字符(请参阅 [2],它应该是小写的y
.
目前我正在通过使用 Levenshtein 距离和字符串长度来获取候选人列表。此外,我排除了关键字 where lev2 > 3
。这只是硬编码,因为我仍在寻找确定阈值的好方法。
int lev = getLevenshteinDistance(keyword, s);
int lev2 = getLevenshteinDistance(keyword.toLower(), s.toLower());
int len = Math.abs(keyword.length - s.length);
int x = lev + lev2 + len;
我正在对关键字列表进行排序x
,以获得最可能的结果。
所以首先,我正在寻找一种方法来根据 OCR 结果和字符串长度确定一个好的阈值。短字符串需要比大字符串更低的阈值和可靠的 OCR 结果。以上面的例子为例:对于单词 order lev2 <= 1
,就足够了,而 for payment
at leastlev2 <= 3
应该计算。
其次,我怎样才能确定剩下的候选人之一是否真的与这个词匹配?如果lev == 0
所有字符的置信度值都是>= 90
显而易见的。但是考虑到糟糕的 OCR 结果,我可以开发什么算法来包括替代 OCR 选择?