从票据提取信息
引言
在这篇报告中,我们将探讨如何从规整票据或不规整票据中提取信息。我们会重点探讨谷歌的一篇论文表征学习用于从表单式票据中提取信息(Representation Learning for Information Extraction from Form-like Documents) 。该论文也收录在计算语言学学会2020。
如果能通过扫描名片直接添加所有联系人的信息,如联系电话、邮箱、地址等等,那不是很有趣吗?这个小功能会节省很多时间。
对我们来说,从票据提取信息是件麻烦事,当然了,成本也很高。
关于如何提取信息,我们就探讨一些深度学习的方式。
查看GitHub上的代码→
注意:代码实现并不像预期那么奏效。但这是你实现该论文的好起点。
多种方式
-
基于模板的信息提取。
-
表征学习用于从表单式票据中提取信息(Representation Learning for Information Extraction from Form-like Documents)
图片来源 : 计算语言学学会的演示文稿
. 传统方式是使用基于模板的方式并用模板匹配OCR(光学字符识别)得到的文本,然后再提取信息。但由于发票千变万化,不可能大规模使用该方式。
图片1
来源 : 论文
不同供应商的发票使用不同的格式来表示信息。因此使用模板的方式是无法进行扩展的,并且易于出错。
在这篇博文中,我们将探讨一个高级观点,出自论文表征学习用于从表单式票据中提取信息(Representation Learning for Information Extraction from Form-like Documents) 。若要深入了解其它技巧,可以看Nanonets的这篇博文。
数据集详细信息
在该论文中,作者们用了两种数据集。
- 发票:有2个发票语料库。第一个语料库含有14237张发票,而第二个含有595张发票。这些发票之间没有相同的模板。每张发票的模板都和别的不一样。
发票语料库是非公开数据集。
- 收据:该数据集对公众开放,是扫描的收据语料库,作为ICDAR(文档分析与识别国际会议)2019年扫描OCR和(SROIE)强健阅读挑战赛的一部分公布。
该数据集含有626张图像,并且有真实的四个字段:地址、公司名、总额、日期。我们只使用总额和日期字段作为我们的目标。该数据集还OCR得到的CSV文件,CSV文件中的坐标和对应文本相关联。
图像样本
真实信息样本
{
"company": "BOOK TA .K (TAMAN DAYA) SDN BHD",
"date": "25/12/2018",
"address": "NO.53 55,57 & 59, JALAN SAGU 18, TAMAN DAYA, 81100 JOHOR BAHRU, JOHOR.",
"total": "9.00"
}
观察结果
在深入探究模型以前,我们来探讨几个观察结果。
- 每个字段常常对应着一种大家所熟知的类型。比如说,总额的候选框应该是数字型的实例。对于总额这一栏,像“Weights and Biases”这样的内容明显不对。
图片来源: 计算语言学学会的演示文稿
按照类别限制搜索空间大幅减少了问题的复杂度。所以我们将用一些程序库为每个字段生成候选框。比如,日期这一栏的候选框生成器应该是日期解析程序库。我们还可以利用云服务(例如谷歌NLP)更高效地生成候选框。
- 每个字段实例都与关键短语相关联。比如说,从图1我们可以推断,日期实例的周围总会有关键短语日期或出票日期。并且,关键短语并不总是位于同一条线上。有效的解决方案就是要同时包含空间信息以及文本信息。
图片来源 : 计算语言学学会的演示文稿
如何把空间信息包含进来?
通过考虑每个词的周围邻元素把空间信息包含进来。对于选取邻元素,论文作者定义了一个邻域范围。
邻域范围:对于每个候选框,邻域范围一直延伸到页面左侧,向上延伸到候选框上方页面高度的10%。
边界框与邻域范围有50%以上重叠的所有文本标记都
- 字段的关键短语主要取自于一个有限的词汇表。发票中大约93%的日期实例与“日期”“出票日期”这样的关键短语相关联(摘自该论文)。这表明,通过少量的训练数据便能解决此问题。
图片来源 : 计算语言学学会的演示文稿
以上全部观察结果适用于各种票据的很多字段。
在这个问题中,数据预处理非常关键,比模型部分重要。接下来,让我们使用上述观察结果来看看数据处理管道。
图片来源 : 计算语言学学会的演示文稿
-
OCR:为了提取图像中的文字,我们要运用OCR。你可以用开源工具,如EasyOCR、PyTesseract ,或者云服务,如Google OCR。在我们的案例中,ICDAR已经提供了OCR的文本。
-
候选框生成器(标注实体):在上述观察结果中已经提到,我们将用多个候选框生成器来生成候选框。由于总体系统的回调不能超越候选框生成器的回调,因此候选框生成器的回调一定要高。
-
计分和分配模块:该模块利用一个神经网络模块为每个候选框单独计算一个分数,分数介于0和1之间,然后将可能是其真实提取结果的得分候选框分配给每个字段。
- 像这样把计分和分配分开,我们就能在学习每个候选框的表征时只根据其邻域,独立于其它候选框和字段。这还让我们在需要时可以把任意复杂的业务规则编码进分配器,例如,发票的到期日不能早于开票日期,诸如此类……(摘自该论文)
为简便起见,作者省略了分配模块的细节,而是用一个简单的分配方式报告结果,这种分配方式为每个字段选取得分最高的候选框,并且独立于其它字段
神经网络计分模型
为确保模型在多种票据模板上通用,模型试图为候选框及其所属的字段分开学习嵌入,而候选框与字段嵌入之间的相似度决定了分数。
作者们所做的另一个重要的设计决策就是,不把候选框文本并入模型,这是为了避免意外的过度拟���。举例来说,数据集可能包含2020年之前的所有发票,模型有可能学习出票日期必须发生在2020年之前。
邻域嵌入:利用一个词嵌入表格来嵌入相邻的文本标记。通过一个非线性位置嵌入方式来嵌入每个邻元素相对位置,该非线性位置嵌入方式由两个使用丢弃法(dropout)的ReLU激活函数层组成。这种非线性嵌入使模型能够学习解决位置上的细微差别,比方说,和候选框处于同一条线上的邻元素与这条线上方的邻元素之间的区别。(摘自那篇论文)
邻域编码:所有邻域嵌入相互独立。为了获取邻元素之间的关系,就用到自注意力机制。这将确保减少那些对预测无关的邻元素的权重,并为邻元素生成基于上下文的表征。
邻域编码:所有邻域嵌入相互独立。为了获取邻元素之间的关系,要用到自注意力机制。这将确保减少那些与预测无关的邻元素的权重,并为邻元素生成基于上下文的表征。
由于已经在嵌入本身获取了邻元素相对于候选框的相对位置信息,因此为了确保邻域编码不随邻元素包含于特征中的(任意)顺序发生变化,就采用了最大池化(max-pooling)的机制。
候选框编码:把邻域编码与候选框位置嵌入相连接便得到了候选框编码。
字段嵌入:还利用一个字段嵌入层把字段编号ID嵌入,从而生成字段ID的表征
候选框分数:候选框编码应包含候选框位置以及邻域细节的全部信息。它独立于候选框所属的字段。
现在我们计算候选框编码和字段嵌入之间的余弦相似度(CosineSimilarity)。由于相似度介于-1到1范围内,我们只要把相似度范围调整到0到1之间,并选择分数最高的候选框即可。
结果
为了表明该模型的用处,该论文的作者们提出了两个基准并比较了结果。
词袋(BoW)基准仅包含候选框的邻接标记,但不包含其位置。MLP基准使用与我们的模型相同的输入特征,包括候选框邻元素的相对位置,并且用3个隐藏层编码候选框。
这两个基准采用了相同的方法,分别对候选框与字段进行编码。
很明显,该模型胜过了以上两个基准。MLP基准使用了邻元素位置,因而胜过词袋基准。
特征重要性的相对顺序:
neighbor text > candidate position > neighbor position
我们还观察到,去掉自注意力层会导致计分器ROC AUC(受试者操作特征曲线下面积)降低1点,并导致端到端最大F1降低1.7点。
模型表征
该论文令人激动的部分就是,他们研究了模型的内部表征并利用t-SNE(降维技术)进行了可视化。
你对表征的结果图感到兴奋吗?我们去看看。
要点:
- 为了表明该模型的用处,该论文的作者们提出了两个基准并比较了结果。
2.一定要注意,字段嵌入位于聚类的边缘并远离那些点,而不是在聚类的中心。这种图案可从事实预测出来:损失函数实质上试图使字段嵌入与其正例之间的余弦距离最小化,同时使与负例(最重要的是,与其它字段的正例)之间的余弦距离最大化。
3.再看图4(c),一个出票日期样本远离出票日期聚类。很明显这是标注者的错误,标注者把采购日期标成了出票日期。.
- 图4(d)中样本的候选框编码位于出票日期与到期日之间。可以解释这一点的事实就是,这个候选框被到期日和出票日期这两项同时包围.
5 图4(e)中样本的候选框编码远离出票日期聚类。仔细检查后发现,这是由于扫描噪声导致的OCR错误.
我相信,模型表征可视化对通常的所有模型都很有帮助。
结论
我希望大家喜欢这篇博文。从票据提取信息是个艰难的任务。提高候选框生成器的准确率仍在研究之中,且需要大量的领域专业知识。欢迎大家提出意见和建议,可在评论处留言,或发送至我的Twitter。