使用 python 和机器学习从发票中提取信息?初始数据集?

数据挖掘 机器学习 Python 特征选择 特征提取 天蓝色毫升
2021-10-03 20:32:58

免责声明:我完全没有机器学习/数据科学的背景,也不熟悉数据科学的通用术语,所以请多多包涵。

我正在尝试使用 Python 制作一个机器学习应用程序来提取发票信息(发票编号、供应商信息、总金额、日期、税款等)。截至目前,我正在使用 Microsoft Vision API 从给定的发票图像中提取文本,并将响应组织成一个自上而下的逐行文本文档,希望它可以提高我的准确性最终的机器学习模型。我目前的情况是严格使用字符串解析,这种方法对于发票号、数据和总金额都非常有效。

然而,当涉及到供应商信息(名称、地址、城市、省份等)时,由于我的脚本依赖于地址检测(因为与其他地址相比,地址具有非常不同的格式),字符串解析几乎不起作用发票上的信息)。由于发票上出现的数值数量众多,税务信息难以解析。


所以(这就是我迷路的地方) 我设想了一个机器学习模型,该模型将输入来自用户的单个发票图像,其输出将是提取的发票信息。我目前正在研究 Azure 机器学习工作室,因为它的即插即用方面对我很有吸引力,而且它似乎很容易使用和试验。但是我不知道初始数据集的要求是什么!我是否应该用一堆示例发票中的必要信息(发票编号、总金额、日期……)填充我的数据集(顺便说一句,以 CSV 格式)?如果不是,我应该在我的数据集中包含哪些其他信息?我在想重要信息出现在图像上的位置的 xy 坐标对。

最后一个问题与这个问题范围有关,哪种算法(回归、分类、聚类)甚至可以从输入文本中“提取”(或帮助它)信息?据我所知,回归预测数值(即 2 + x = 10,因此 8 + x 可能是 16)和分类“标签”事物(即,此图像包含一棵树,此图像不包含)。我对聚类不太熟悉,尽管我认为识别输入文本的结构可能很有用。

总结一下:发票的哪些特征可以填充初始数据集以初始化模型?如何使用聚类算法来识别发票的结构?我如何在这个问题中使用回归/分类算法,这些算法需要哪些输入才能提供有意义的结果?

任何帮助/指导/反馈将不胜感激。对不起,我缺乏知识,但这个领域非常有趣,需要一些帮助来解决这个问题。谢谢:)

3个回答

我也是一个初学者,但我想根据我的一些经验帮助指导您进行下一步。

首先,您在此处说明的内容听起来有点类似于传统 EDI 系统在供应链和采购处理中的作用,它将接收文档并将信息输入基于交易的操作系统以创建记录作为数据。我不完全确定它们是如何工作的,以及它们是否只能从文档中提取标准化格式,但您可以通过一些搜索来查看这些内容。

现在就创建 CSV 数据集而言,这是在一组发票上测试算法的准确性以训练模型的好主意。训练模型是不言自明的,但本质上你将使用监督机器学习策略,系统主动使用已知正确答案的训练数据集。通过将模型结果与数据集进行比较,您可以知道算法是否正确地检索了信息。我建议您包含应用程序应从每张发票中获取的信息,并将其与机器所做的进行比较取回。这样你就可以有效地知道模型的错误。(x,y) 坐标可以很好地用于初步尝试以更好地了解基于位置的发票评估,所以我认为这也是一个不错的主意。

关于算法类型,这个几乎总是“取决于”。很多时候,我会使用一对并比较每个模型返回的错误,以找到最适合我预测的错误。也就是说,聚类可用于基于坐标位置的连续数字数据和“分组”项目。如果您要分解图像上信息的坐标,我认为聚类可能很有用,但对于从发票中收集和提取文本没有多大用处。为了不深入,K-Means 可能根本不会很好,因为集群质心的位置是完全随机的,并且您还必须声明许多 n 个集群,这对于手头的目的来说是不切实际的。

我建议研究不同类型的神经网络(NN)。这些被广泛用于拍摄某种图像,并将它们分解以最好地估计未知输入的内容。这是谷歌用来进行图像搜索和类似事情的算法类型。它也是一种告诉自动驾驶汽车前方标志是停车标志的软件。那里有不同类型的神经网络,而且很快就会变得非常难以控制,所以我建议查看基本视频来解释它。如果你决定走这条路,谷歌云有一个非常可靠的平台,里面有 google.vision 和其他非常容易导入和使用的机器学习库。

就输入而言,定义您想要提取的信息,并记录该数据以供我上面提到的测试和训练使用。然后在 sciket-learn 和 TensorFlow 中尝试一些方法!

不幸的是,我无法就不同算法或输入的许多权衡给出直接的答案,但我希望这能给你一些关于下一步的想法,或者让你更好地理解如何开始该项目。祝你好运!

发票处理随着时间和地点而发展。对于大公司,他们的财务部门可能会要求供应商将采购订单编号放在发票上。采购订单编号可能具有固定格式,例如 PO-0001。因此,在提取发票时,它所要做的就是找到该模式。获得采购订单号后,数据库查找将返回您需要的所有信息。

下一阶段,如果您的供应商数量有限,您可以为每个供应商的发票定义模板。例如,左上角有供应商名称。它将帮助您确定需要提取的信息。当有未知发票时,一些人工操作员必须创建该模板。一些商业应用属于这一类。如果您有人工操作员的资源,那可能是一种选择。

同样,使用机器学习,您可以根据这些培训发票的布局生成集群。当新发票到来时,您可以尝试匹配相应的集群/模板。这种方法在处理未知发票方面存在局限性。

有一些基于机器学习的软件即服务 (SaaS) 提供商,例如mlreader它比上面更复杂。如果您不必在内部构建它,您可以尝试一下。它可能更具成本效益。

你正在处理一个非常困难的问题。也许尝试将其分解为更简单的子问题,例如:

  1. 使用类似于 Google 或 AWS 的 Ms Vision 等解决方案从发票图像中提取文本/数字数据

  2. 找出一些可以将发票分成的类别(可能按国家和/或公司类型?)

  3. 训练一些分类器(无论您发现更容易配置和使用的可训练图像分类器,可能在 Azure/AWS/Google 机器学习 API 中有一些易于使用的分类器)通过使用它们的图像而不是先前提取的文本数据来对发票进行分类

  4. 然后有一个“最终模型”,可以调整以考虑每个“发票类别”的不同内容,甚至可以包含手工编码的特征和特定于例如的启发式方法。“来自 X 国的发票”,将第一步提取的测试/数字数据以及图像分类器分类的发票类别作为输入

直觉是每个地理区域可能有最多 N 个发票软件提供商,并且这些软件具有最多 M 个输出配置,因此应该有一堆启发式快捷方式,您可以在这里利用并合并到您的第 4 步模型中.

但是我不知道第 4 步模型应该是什么,所以这只是一堆提示,不是真正的答案,我知道......

关于:

我在想重要信息出现在图像上的位置的 xy 坐标对。

我只能告诉你这种方法可能很糟糕,从来没有听说过有人用"extracted data + (x, y) of where it was extracted from image"这种方法取得任何进展。您要么自己承担全部任务,从[image data]那里完成这项任务[extracted numeric features]将是一项艰巨、几乎不可能完成的任务(您基本上需要重新发明 Azure ML 所做的一个版本,只是它会针对您的发票数据任务进行专门优化萃取)。