专门针对OCR进行的纠错工作。
- 使用OCR预测的字符概率作为检错的标准
- 使用BERT模型预测正确的字
- 使用关键词匹配法寻找正确的关键词
测试中,待更新
在OCR识别出结果后,利用NLP技术对结果进行修正,主要引入了非视觉信息的语义的信息,包括
局部语义(即OCR识别结果需要是通顺的一句话)或全局语义(OCR识别某种单据只能输出某些词)。
目标F1:待更新
目标速度:每张图片耗时为OCR识别本身耗时的1/10以下
纠错方法和NLP主流方法相同,一般可分为:
2.1.1 统计语言模型
建立 2-gram,3-gram语言模型,根据语言模型评分来发现错字、从候选集中选择。
2.1.2 seq2seq模型
准备 错句vs对句 样本对,和训练翻译模型一样训练,预测时输入错句,直接输出对句。优点是可以handle加字减字的情况,缺点是容易改错。
2.1.3 transformer模型
在预训练的bert模型上进行fine-tune,准备 错句vs对句 样本对,输入错句,输出句中每个字的预测结果;之后再根据预测结果的置信度及字形特征决定是否修改。
优点是预测可以考虑上下文,结果比较准确;缺点是速度较慢,其次在OCR使用场景中较难输入完整的句子,会降低准确率甚至错纠。
专门针对OCR的纠错一般加入对字形的考虑,本质上是对 p(原字|错误字) 后验概率分布的模拟。加入字形因素的方法有:
2.2.1 建立形近字字典,纠错范围限于形近字;
2.2.2 将汉字的字形以某种方式编码,使得编码后汉字的编辑距离可以表征误识别的可能性。了解到的比较好用的方法为,将汉字笔画拆解后得到编码,详见https://github.com/cjkvi/cjkvi-ids。
为贴合业务场景,提出本方案:
3.0.1 主要使用了2种方法,对应2种业务场景。
方案 | 场景 | 特点 | 场景举例 |
---|---|---|---|
BERT | 文档类 | 文本长,范围大 | 文章 |
关键字 | 单据类 | 文本短,范围窄 | 证件,单据,表格 |
3.0.2 错误定位部分,直接采用OCR算法在预测文字时softmax输出的概率值作为标准。这样首先可以更精准地定位错误,减少了错纠的可能性,其次大大提升了性能,不必对全篇进行纠正。
主要参考了爱奇艺的 Faspell 项目,对应2.1.3及2.2.2。
针对某特定种类单据,准备一个关键词表。根据3.0.2的方法确定错词后,首先利用 BKTree 搜索关键词表中和其编辑距离等于错字数的词,然后根据错字位置进行过滤,得到候选字,用 2.2.2 的方法找到编辑距离最近的字进行替换。
pip install -r requirements.txt
4.2.1 BERT 模型 下载预训练好的BERT模型 到 model/pre-trained 目录下 如需进行fine-tuning,请参照BERT
4.2.2 字形编码文件 下载char_meta.txt 字形编码(IDS)文件下载后放到 data 目录下 下载地址:https://pan.baidu.com/s/1iqA-GbzzHBBWfWaxe1g_fg 密码:3f11
运行 sh bin/correct_ocr_result.sh <图片名称 img1.jpeg|img2.jpeg> 测试纠错效果 img1.jpeg : 文档类,测试BERT模型 img2.jpeg : 单据类,测试关键字法
5.2.1 bert 纠错依赖充分的上下文,OCR识别时单张小图识别结果可能只是一段话中的一个片段,会影响bert的预测结果。可能需要优化OCR使其输出段落信息。
5.2.2 bert模型未针对当前业务场景进行微调。
5.3.1 bert 模型性能调优。
爱奇艺 Faspell: https://github.com/iqiyi/FASPell pycorrector: https://github.com/shibing624/pycorrector