【发布时间】:2023-04-04 01:14:01
【问题描述】:
我想识别扫描文档中可能存在 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 距离和字符串长度获取候选人列表。此外,我排除了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 结果。以上面的例子为例:对于词序lev2 <= 1,就足够了,而对于payment,至少应该计算lev2 <= 3。
其次,我如何确定剩下的候选人之一是否真的与单词匹配?在lev == 0 的情况下,当所有字符的置信度值为>= 90 时,这是显而易见的。但是考虑到糟糕的 OCR 结果,我可以开发什么算法同时包含替代 OCR 选择?
【问题讨论】:
标签: algorithm ocr levenshtein-distance error-correction