/OCR-Corrector

利用语言模型,纠正OCR识别错误

Primary LanguagePythonApache License 2.0Apache-2.0

OCR后处理-纠错

概述

专门针对OCR进行的纠错工作。

要点

  1. 使用OCR预测的字符概率作为检错的标准
  2. 使用BERT模型预测正确的字
  3. 使用关键词匹配法寻找正确的关键词

性能指标

测试中,待更新

1 项目目标

在OCR识别出结果后,利用NLP技术对结果进行修正,主要引入了非视觉信息的语义的信息,包括

局部语义(即OCR识别结果需要是通顺的一句话)或全局语义(OCR识别某种单据只能输出某些词)。

目标F1:待更新

目标速度:每张图片耗时为OCR识别本身耗时的1/10以下

2 方法综述

2.1 NLP方面

纠错方法和NLP主流方法相同,一般可分为:

2.1.1 统计语言模型

​建立 2-gram,3-gram语言模型,根据语言模型评分来发现错字、从候选集中选择。

2.1.2 seq2seq模型

准备 错句vs对句 样本对,和训练翻译模型一样训练,预测时输入错句,直接输出对句。优点是可以handle加字减字的情况,缺点是容易改错。

2.1.3 transformer模型

在预训练的bert模型上进行fine-tune,准备 错句vs对句 样本对,输入错句,输出句中每个字的预测结果;之后再根据预测结果的置信度及字形特征决定是否修改。

优点是预测可以考虑上下文,结果比较准确;缺点是速度较慢,其次在OCR使用场景中较难输入完整的句子,会降低准确率甚至错纠。

2.2 字形方面

专门针对OCR的纠错一般加入对字形的考虑,本质上是对 p(原字|错误字) 后验概率分布的模拟。加入字形因素的方法有:

2.2.1 建立形近字字典,纠错范围限于形近字;

2.2.2 将汉字的字形以某种方式编码,使得编码后汉字的编辑距离可以表征误识别的可能性。了解到的比较好用的方法为,将汉字笔画拆解后得到编码,详见https://github.com/cjkvi/cjkvi-ids。

3 方案说明

为贴合业务场景,提出本方案:

3.0.1 主要使用了2种方法,对应2种业务场景。

方案 场景 特点 场景举例
BERT 文档类 文本长,范围大 文章
关键字 单据类 文本短,范围窄 证件,单据,表格

3.0.2 错误定位部分,直接采用OCR算法在预测文字时softmax输出的概率值作为标准。这样首先可以更精准地定位错误,减少了错纠的可能性,其次大大提升了性能,不必对全篇进行纠正。

3.1 BERT纠错方案

主要参考了爱奇艺的 Faspell 项目,对应2.1.3及2.2.2。

3.2 关键字纠错方案

针对某特定种类单据,准备一个关键词表。根据3.0.2的方法确定错词后,首先利用 BKTree 搜索关键词表中和其编辑距离等于错字数的词,然后根据错字位置进行过滤,得到候选字,用 2.2.2 的方法找到编辑距离最近的字进行替换。

4 使用方法

4.1 安装依赖

pip install -r requirements.txt

4.2 数据准备

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

4.3 使用

运行 sh bin/correct_ocr_result.sh <图片名称 img1.jpeg|img2.jpeg> 测试纠错效果 img1.jpeg : 文档类,测试BERT模型 img2.jpeg : 单据类,测试关键字法

5 优化方向

5.1 代码优化

5.2 效果

5.2.1 bert 纠错依赖充分的上下文,OCR识别时单张小图识别结果可能只是一段话中的一个片段,会影响bert的预测结果。可能需要优化OCR使其输出段落信息。

5.2.2 bert模型未针对当前业务场景进行微调。

5.3 性能

5.3.1 bert 模型性能调优。

参考文献

爱奇艺 Faspell: https://github.com/iqiyi/FASPell pycorrector: https://github.com/shibing624/pycorrector