使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。

使用深度学习的表检测和信息提取


表抽取简介

随着应用程序、软件和在线平台的数量不断增加,收集的数据量每天都在急剧增加。

为了有效地处理/访问这些庞大的数据,有必要开发有价值的信息提取工具。

信息提取领域需要关注的子领域之一是从图像中提取表格或从表单、PDF 和文档中检测表格数据。

表抽取 是检测和分解文档中的表信息的任务。

Table OCR - Nanonets 从图像中提取表格数据!
Table OCR – Nanonets 从图像中提取表格数据!

想象一下,您有很多包含表格数据的文档,您需要提取这些数据以进行进一步处理。 通常,您可以手动复制它们(到纸上)或将它们加载到 Excel 表中。

但是,使用表格 OCR 软件,您可以自动检测表格并一次性从文档中提取所有表格数据。 这样可以节省大量时间和返工。

在本文中,我们将首先了解 Nanonets 如何从图像或文档中自动提取表格。 然后,我们将介绍一些流行的 DL 技术来检测和提取文档中的表格。


想要从发票、收据或任何其他类型的文档中提取表格数据? 看看 Nanonets 的 PDF表格提取器 提取表格数据。 预约演示 了解有关自动化的更多信息 表提取.


目录

使用 Nanonets Table OCR 从图像中提取表格

  • 注册 免费的 Nanonets 帐户

    • 将图像/文件上传到 Nanonets Table OCR 模型
    • Nanonets 自动检测并提取所有表格数据
    • 编辑和审查数据(如果需要)
    • 将处理后的数据导出为 Excel、csv 或 JSON

用 Nanonets 从图像中提取表格

从PDF抓取数据 文件, 将PDF表转换为Excel or 自动提取表格? 找出 Nanonets 如何 PDF刮板 or PDF解析器 可以使您的业务更有效率。


Nanonets 表 OCR API

使用 Nanonets 的表格 OCR
使用 Nanonets 的表格 OCR

纳米网 OCR API 使您可以轻松构建OCR模型。 您不必担心图像预处理,也不必担心模板匹配或构建基于规则的引擎来提高OCR模型的准确性。

您可以上传数据、对其进行注释、将模型设置为训练并等待通过基于浏览器的 UI 获得预测,而无需编写任何代码、担心 GPU 或使用深度学习模型为您的表检测找到合适的架构。

您还可以获取每个预测的 JSON 响应,以将其与您自己的系统集成,并基于最先进的算法和强大的基础架构构建机器学习驱动的应用程序。

https://nanonets.com/documentation/


您的企业是否处理数字文档、PDF 或图像中的数据或文本识别? 您是否想知道如何提取表格数据, 从图像中提取文本 , 从PDF提取数据 or 从PDF中提取文本 准确高效?


谁会发现表提取有用

如上一节所述,表格经常用于以干净的格式表示数据。 我们可以在多个领域经常看到它们,从通过跨表构建数据来组织我们的工作到存储公司的巨额资产。 有很多组织每天必须处理数百万张表格。 为了促进手动完成所有这些繁重的任务,我们需要求助于更快的技术。 让我们讨论几个用例,其中 提取表 可能是必不可少的:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
Sumber: 帕特里克·托马索斯,不飞溅

个人用例

表提取 过程对于小型个人用例也很有帮助。 有时我们在手机上捕获文档,然后将它们复制到我们的计算机上。 我们可以直接捕获文档并将它们保存为自定义模板中的可编辑格式,而不是使用此过程。 以下是一些关于我们如何将表格提取融入个人日常生活的用例 -

扫描文档至电话: 我们通常会在手机上捕获重要表格的图像并将其保存,但是通过表格提取技术,我们可以捕获表格的图像并将其直接以表格格式存储在excel或google工作表中。 这样,我们无需搜索图像或将表内容复制到任何新文件中,而是可以直接使用导入的表并开始处理提取的信息。

转换成HTML的文件: 在网页中,我们找到了使用表格显示的大量信息。 它们帮助我们与数据进行比较,并以有组织的方式为我们提供有关数字的快速注释。 通过使用表提取过程,我们可以扫描PDF文档或JPG / PNG图像,并将信息直接加载到自定义的自定义表格式中。 我们可以进一步编写脚本以在现有表的基础上添加其他表,从而使信息数字化。 这有助于我们编辑内容并加快存储过程。


工业用例

全球有许多行业在文书工作和文件编制方面发挥着巨大作用,尤其是在银行和保险领域。 从存储客户的详细信息到满足客户的需求,表格被广泛使用。 该信息再次作为文档(纸质副本)传递到不同的分支机构进行批准,其中有时沟通不畅会导致在从表中获取信息时出错。 相反,在这里使用自动化可以使我们的生活更加轻松。 一旦捕获并批准了初始数据,我们就可以直接将这些文档扫描到表格中,然后进一步处理数字化数据。 更不用说减少时间消耗和故障了,我们可以通知客户有关信息处理的时间和位置。 因此,这确保了数据的可靠性,并简化了我们处理操作的方式。 现在让我们看一下其他可能的用例:

质量控制: 质量控制是顶尖行业提供的核心服务之一。 它通常是在内部并为利益相关者完成的。 其中一部分是从消费者那里收集的许多反馈表,以提取有关所提供服务的反馈。 在工业部门,他们使用表格记下每日检查清单和注释,以查看生产线的工作方式。 所有这些都可以使用表格提取轻松地记录在一个地方。

资产跟踪: 在制造业中,人们使用硬编码表来跟踪制造的实体,例如钢,铁,塑料等。每个制造物品都标有唯一编号,其中他们使用表来跟踪每天制造和交付的物品。 自动化可以帮助您节省大量时间和资产,例如放错位置或数据不一致。


业务用例

有许多在excel表格和脱机表格上运行的商业行业。 但是在某一时刻,很难搜索这些表格和表格。 如果我们手动输入这些表,那将很耗时,并且错误输入数据的机会将会很高。 因此,表提取是解决业务用例的更好选择,如下所示。

发票 自动化: 有许多小型和大型工业 发票 仍然以表格格式生成。 这些不提供适当安全的税务报表。 为了克服这些障碍,我们可以使用表提取来转换所有 发票 成可编辑的格式,从而将它们升级到更新的版本。

表单自动化: 在线表单通过帮助企业收集他们需要的信息并同时将其连接到其工作流程中内置的其他软件平台,打破了这种久经考验的方法。 除了减少手动数据输入的需要(使用 自动数据输入) 和后续电子邮件,表格提取可以消除打印、邮寄、存储、组织和销毁传统纸张替代品的成本。


有 OCR 问题吗? 想要数字化 发票、PDF 或车牌? 前往 纳米网 并免费构建OCR模型!


行动中的深度学习

深度学习是基于人工神经网络的更广泛的机器学习方法系列的一部分。

神经网络是一个框架,该框架通过模仿人脑操作方式的过程来识别给定数据中的潜在关系。 他们具有数据通过的不同人工层,可以在其中了解要素。 有不同的体系结构,例如卷积神经网络,递归神经网络,自动编码器,生成对抗神经网络,可以处理各种数据。 这些很复杂,但是却具有高性能,可以实时解决问题。 现在,让我们研究一下使用神经网络在表提取领域中进行的研究,并让我们简要回顾一下它们。


表格网

纸: TableNet:深度学习模型,用于从扫描的文档图像进行端到端表检测和表格数据提取

介绍: TableNet是现代深度学习架构,由TCS Research年度的团队在2019年提出。其主要动机是通过手机或照相机从扫描的表中提取信息。

他们提出了一种解决方案,其中包括准确检测图像中的表格区域并随后从检测到的表格的行和列中检测和提取信息。

资料集: 使用的数据集是Marmot。 它有2000页的PDF格式,并与相应的实际内容一起收集。 这也包括中文页面。 链接– http://www.icst.pku.edu.cn/cpdp/sjzy/index.htm

结 构: 该架构基于 Long et al.,一种用于语义分割的编码器-解码器模型。 相同的编码器/解码器网络用作表提取的 FCN 架构。 图像经过预处理和修改 Tesseract OCR.

通过对输入内容进行深度学习,可以分为两个阶段导出模型。 在第一阶段,他们使用了预先训练的VGG-19网络的权重。 他们已经用1×1卷积层替换了已用VGG网络的完全连接层。 在所有卷积层之后都跟随ReLU激活和概率为0.8的退出层。 他们称第二阶段为由两个分支组成的解码网络。 根据直觉,列区域是表区域的子集。 因此,单个编码网络可以使用表区域和列区域的特征以更高的精度滤除活动区域。 来自第一个网络的输出分配到两个分支。 在第一个分支中,应用了两个卷积运算,并且最终特征图按比例放大以适应原始图像尺寸。 在另一个用于检测列的分支中,有一个具有ReLU激活功能的附加卷积层和一个具有与前面提到的相同的丢弃概率的退出层。 在(1×1)卷积层之后使用分数步卷积对特征图进行上采样。 下面是该体系结构的图像:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
TableNet的架构

输出: 使用该模型处理文档后,将生成表和列的掩码。 这些蒙版用于从图像中过滤出表格及其列区域。 现在,使用Tesseract OCR,从分段区域中提取信息。 下图显示了生成的遮罩,随后从表中提取了它们:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。

他们还提出了用ICDAR进行微调的相同模型,其性能要优于原始模型。 微调模型的Recall,Precision和F1-Score分别为0.9628、0.9697和0.9662。 原始模型以相同的顺序记录了0.9621、0.9547、0.9583的度量。 现在让我们深入探讨另一种架构。


深度DeSRT

纸: DeepDeSRT:深度学习,用于文档图像中表格的检测和结构识别

介绍: DeepDeSRT是一个神经网络框架,用于检测和理解文档或图像中的表。 如标题所述,它有两个解决方案:

  1. 它为文档图像中的表格检测提供了一种基于深度学习的解决方案。
  2. 它提出了一种新颖的基于深度学习的表结构识别方法,即在检测到的表中标识行,列和单元格位置。

所提出的模型完全基于数据,不需要文档或图像的启发式或元数据。 培训方面的一个主要优势是他们没有使用大型培训数据集,而是使用转移学习和域自适应的概念来进行表检测和表结构识别。

资料集: 使用的数据集是ICDAR 2013表格竞赛数据集,包含67个文档,总共238页。

结 构:

  • 表检测 所提出的模型使用Fast RCNN作为检测表格的基本框架。 该体系结构分为两个不同的部分。 在第一部分中,他们通过所谓的区域提议网络(RPN)根据输入图像生成了区域提议。 在第二部分中,他们使用Fast-RCNN对区域进行了分类。 为了支持这种架构,他们使用了 采埃孚网 和VGG-16的重量。
  • 结构识别 成功检测到表并知道系统的位置后,理解表内容的下一个挑战是识别并找到构成表物理结构的行和列。 因此,他们使用了权重为VGG-16的完全连接的网络,该网络从行和列中提取信息。 以下是DeepDeSRT的输出:

输出:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
表检测的输出
使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
结构识别的输出[6]

评估结果表明,DeepDeSRT的性能优于最先进的表检测和结构识别方法,直到1年,其对表检测和结构识别的F96.77度量分别达到91.44%和2015%。


图神经网络

纸: 使用图神经网络重新思考表识别

介绍: 在这项研究中,来自美国国家人工智能中心(NCAI)深度学习实验室的作者提出了Graph神经网络,用于从表格中提取信息。 他们认为图网络是解决这些问题的更自然的选择,并进一步探索了两个基于梯度的图神经网络。

提出的模型结合了卷积神经网络和视觉问题网络两者的优点,其中卷积神经网络用于视觉特征提取。

资料集: 作者提出了一个新的大型综合生成的数据集,该数据集包含0.5万张表,分为四类。

  1. 图像是没有合并且具有裁定线的纯图像
  2. 图像具有不同的边框类型,包括偶尔缺少标线
  3. 介绍单元格和列合并
  4. 相机通过线性透视变换捕获图像

结 构: 他们使用了浅层卷积网络,生成了各自的卷积特征。 如果输出要素的空间尺寸与输入图像不同,则它们将根据输入和输出尺寸之间的比例线性缩小位置,并将其发送到具有两个称为DGCNN的图形网络的交互网络和GravNet。 图网络的参数与原始CNN相同。 最后,他们使用了运行时对采样来对提取的内容进行分类,这些内容在内部使用了基于Monte Carlo的算法。 以下是输出:

输出:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
图神经网络生成的输出

以下是由网络针对网络的四个类别生成的列表精度数字,如 数据集 部分:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。

CGAN和遗传算法

纸: 使用条件生成对抗网络和遗传算法从文档中提取表格

介绍: 在这项研究中,作者使用了自上而下的方法,而不是使用自下而上的方法(将行集成到单元格,行或列中)。

在这种方法中,他们使用生成对抗网络,将表格图像映射为标准化的“骨架”表格形式。 此骨架表表示没有表内容的大致行和列边界。 接下来,他们使用通过遗传算法优化的距离度量,将候选潜伏表结构的渲染与骨架结构拟合。

资料集: 作者使用了他们自己的具有4000个表的数据集。

结 构: 提出的模型包括两个部分。 在第一部分中,使用条件生成对抗神经网络将输入图像抽象到骨架表中。 GAN再次有两个网络,一个是生成随机样本的生成器,另一个是鉴别器,用于识别生成的图像是伪造的还是原始的。 生成器G是一个编码器/解码器网络,在该网络中,输入图像会通过一系列逐渐降采样的层,直到瓶颈层被逆转。 为了将足够的信息传递给解码层,使用具有跳过连接的U-Net架构,并通过连接在第i和n-i层之间添加跳过连接,其中n是层的总数,i是层数在编码器中。 鉴别符D使用PatchGAN体系结构。这会在补丁范围内惩罚输出图像结构。 这些将输出作为框架表。

在第二部分中,他们使用每个候选者与骨骼之间距离的度量来优化候选潜在数据结构对生成的骨骼图像的拟合。 这就是提取图像内部文本的方式。 下图描述了体系结构:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
方法的一般示意图

输出: 估算的表格结构通过比较– 行和列号,左上角位置,行高和列宽

遗传算法从表中提取信息时,行精度为95.5%,列精度为96.7%。

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。

需要数字化文件, or 发票 但是懒得写代码? 前往 纳米网 并免费构建OCR模型!


[代码]传统方法

在本节中,我们将学习如何使用深度学习和OpenCV从表中提取信息的过程。 您可以将这种解释视为简介,但是,构建最新模型需要大量的经验和实践。 这将帮助您了解我们如何使用各种可能的方法和算法训练计算机的基础知识。

为了更精确地理解问题,我们定义了一些基本术语,这些术语将在本文中通篇使用:

  • 文本:包含一个字符串和五个属性(顶部,左侧,宽度,高度,字体)
  • Line:包含假定与原始文件在同一行上的文本对象
  • 单线:只有一个文本对象的行对象。
  • 多线:带有多个文本对象的行对象。
  • 多线 阻止:一组连续的多行对象。
  • :表中的水平块
  • :表中的垂直块
  • 手机:行和列的交集
  • 单元格–填充:单元格内部的内部填充或空间。

使用OpenCV进行表格检测

我们将使用传统的计算机视觉技术从扫描表中提取信息。 这是我们的管道; 我们首先使用普通摄像机捕获数据(需要从中提取信息的表格),然后使用计算机视觉来尝试查找边界,边缘和单元格。 我们将使用不同的过滤器和轮廓,并将突出显示表格的核心功能。

我们将需要一张桌子的图像。 我们可以在手机上捕获它或使用任何现有图像。 下面是代码片段,

file = r’table.png’
table_image_contour = cv2.imread(file, 0)
table_image = cv2.imread(file)

在这里,我们加载了相同的图像图像两个变量,因为我们将使用 表格图像轮廓 当将我们检测到的轮廓绘制到加载的图像上时。 下面是我们在程序中使用的表的图像:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
桌子的形象

我们将采用一种称为 逆图像阈值 这样可以增强给定图像中的数据。

ret, thresh_value = cv2.threshold( table_image_contour, 180, 255, cv2.THRESH_BINARY_INV)

另一个重要的预处理步骤是 图像扩张。 扩散是应用于二进制图像(黑白)的简单数学运算,它会逐渐扩大前景像素区域的边界( 白色像素)。

kernel = np.ones((5,5),np.uint8)
dilated_value = cv2.dilate(thresh_value,kernel,iterations = 1)

在OpenCV中,我们使用方法, 查找轮廓 以获得当前图像中的轮廓。 此方法采用三个参数,第一个是膨胀图像(用于生成膨胀图像的图像是table_image_contour-findContours方法仅支持二进制图像),第二个是 CV2.RETR_TREE 告诉我们使用轮廓检索模式,第三个是  cv2.CHAIN_APPROX_SIMPLE 这是轮廓逼近模式。 的 查找轮廓 解包两个值,因此我们将再添加一个名为 等级制度。 嵌套图像时,轮廓相互依存。 为了表示这种关系,使用了层次结构。

contours, hierarchy = cv2.findContours( dilated_value, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

轮廓线标记图像中确切存在数据的位置。 现在,我们遍历在上一步中计算出的轮廓列表,并使用方法计算在原始图像中观察到的矩形框的坐标,  cv2.boundingRect。 在上一次迭代中,我们使用方法将这些框放到原始图像table_image上, cv2.rectangle().

for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # bounding the images if y < 50: table_image = cv2.rectangle(table_image, (x, y), (x + w, y + h), (0, 0, 255), 1) 

这是我们的最后一步。 这里我们使用方法 命名窗口 用提取的内容和轮廓嵌入表格来渲染表格。 下面是代码片段:

plt.imshow(table_image)
plt.show()
cv2.namedWindow('detecttable', cv2.WINDOW_NORMAL)

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
输出

在上面的代码片段中将y的值更改为300,这将是您的输出:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。

提取表格后,您可以通过tesseract OCR引擎运行每个轮廓作物,有关该教程的信息,请参见 此处。 一旦有了每个文本的框,我们就可以基于它们的x和y坐标对它们进行聚类,以得出它们所属的对应行和列。

除此之外,您还可以选择使用 PDFMiner 将您的 pdf 文档转换为 HTML 文件,我们可以使用正则表达式解析这些文件以最终获得我们的表格。 这是你如何做到的。


PDFMiner和Regex解析

要从较小的文档中提取信息,需要花时间配置深度学习模型或编写计算机视觉算法。 相反,我们可以在 Python 中使用正则表达式 提取文字 从 PDF 文档。 另外,请记住,此技术不适用于图像。 我们只能使用它从 HTML 文件或 PDF 文档中提取信息。 这是因为,当您使用正则表达式时,您需要将内容与源匹配并提取信息。 使用图像,您将无法匹配文本,并且正则表达式将失败。 现在让我们处理一个简单的 PDF 文档并从其中的表格中提取信息。 下面是图片:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。

第一步,我们将PDF加载到程序中。 完成后,我们将PDF转换为HTML,以便我们可以直接使用正则表达式,从而从表中提取内容。 为此,我们使用的模块是 pdfminer。 这有助于从PDF读取内容并将其转换为HTML文件。

下面是代码片段:

from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.converter import HTMLConverter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
import re def convert_pdf_to_html(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = HTMLConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = file(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 #is for all caching = True pagenos=set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,password=password,caching=caching, check_extractable=True): interpreter.process_page(page) fp.close() device.close() str = retstr.getvalue() retstr.close() return str

代码积分: Zevross

我们导入了很多模块,其中包括正则表达式和PDF相关库。 在方法中 convert_pdf_to_html, 我们发送需要转换为HTML文件的PDF文件的路径。 该方法的输出将是一个HTML字符串,如下所示:

'<span style="font-family: XZVLBD+GaramondPremrPro-LtDisp; font-size:12px">Changing Echoesn<br>7632 Pool Station Roadn<br>Angels Camp, CA 95222n<br>(209) 785-3667n<br>Intake: (800) 633-7066n<br>SA </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> TX DT BU </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> RS RL OP PH </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> CO CJ n<br></span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> SF PI </span><span style="font-family: GDBVNW+Wingdings-Regular; font-size:11px">s</span><span style="font-family: UQGGBU+GaramondPremrPro-LtDisp; font-size:12px"> AH SPn<br></span></div>' 

正则表达式是用于模式匹配的最棘手和最酷的编程技术之一。 它们被广泛用于多种应用程序中,例如,用于代码格式化,Web抓取和验证。 在开始从HTML表中提取内容之前,让我们快速了解有关正则表达式的一些知识。

该库提供了各种内置方法来匹配和搜索模式。 以下是一些:

import re # Match the pattern in the string
re.match(pattern, string) # Search for a pattern in a string
re.search(pattern, string) # Finds all the pattern in a string
re.findall(pattern, string) # Splits string based on the occurrence of pattern
re.split(pattern, string, [maxsplit=0] # Search for the pattern and replace it with the given string
re.sub(pattern, replace, string)

您通常在正则表达式中看到的字符/表达式包括:

  • [AZ] - 任何大写字母
  • d - 数字
  • w - 单词字符(字母、数字和下划线)
  • s - 空格(空格、制表符和空格)

现在要找到HTML中的特定模式,我们使用正则表达式,然后相应地编写模式。 我们首先将数据分割,以便根据程序名称(ANGELS CAMP,APPLE VALLEY等)将地址块分隔为单独的块:

pattern = '(?<=<span style="font-family: XZVLBD+GaramondPremrPro-LtDisp; font-size:12px">)(.*?)(?=<br></span></div>)' for programinfo in re.finditer(pattern, biginputstring, re.DOTALL): do looping stuff…

稍后,我们发现程序名称,城市,州和邮政编码始终遵循相同的模式(文本,逗号,两位大写字母,5个数字(或5个连字符XNUMX个数字)–这些都存在于PDF文件中,我们认为是输入)。 检查以下代码段:

# To identify the program name
programname = re.search('^(?!<br>).*(?=\n)', programinfo.group(0))
# since some programs have odd characters in the name we need to escape
programname = re.escape(programname) citystatezip =re.search('(?<=>)([a-zA-Zs]+, [a-zA-Zs]{2} d{5,10})(?=\n)', programinfo.group(0))
mainphone =re.search('(?<=<br>)(d{3}) d{3}-d{4}x{0,1}d{0,}(?=\n)', programinfo.group(0))
altphones = re.findall('(?<=<br>)[a-zA-Zs]+: (d{3}) d{3}-d{4}x{0,1}d{0,}(?=\n)(?=\n)', programinfo.group(0)) 

这是一个简单的示例,解释了我们如何使用正则表达式从PDF文件中提取信息。 提取所有必需的信息后,我们将此数据加载到CSV文件中。

def createDirectory(instring, outpath, split_program_pattern): i = 1 with open(outpath, 'wb') as csvfile: filewriter = csv.writer(csvfile, delimiter=',' , quotechar='"', quoting=csv.QUOTE_MINIMAL) # write the header row filewriter.writerow(['programname', 'address', 'addressxtra1', 'addressxtra2', 'city', 'state', 'zip', 'phone', 'altphone', 'codes']) # cycle through the programs for programinfo in re.finditer(split_program_pattern, instring, re.DOTALL): print i i=i+1 # pull out the pieces programname = getresult(re.search('^(?!<br>).*(?=\n)', programinfo.group(0))) programname = re.escape(programname) # some facilities have odd characters in the name

因此,这是一个简单的示例,解释了如何将提取的HTML推入CSV文件。 首先,我们创建一个CSV文件,找到我们所有的属性,然后将其一一推入各自的列中。 以下是屏幕截图:

使用深度学习 PlatoBlockchain 数据智能进行表检测和信息提取。 垂直搜索。 哎。
使用正则表达式从表中提取的项目的屏幕截图

有时,以上讨论的技术似乎很复杂,并且如果所有表都是嵌套且复杂的,则会给程序员带来挑战。 在这里,选择简历或深度学习模型可以节省大量时间。 让我们看看哪些弊端和挑战阻碍了这些传统方法的使用。


传统方法的挑战

在本节中,我们将深入了解表提取过程可能在哪些地方失败,并进一步了解使用深度学习所带来的现代方法克服这些障碍的方法。 但是,此过程并非易事。 原因是表通常在整个过程中都不保持恒定。 它们具有表示数据的不同结构,表中的数据可以是具有多种格式样式(字体样式,颜色,字体大小和高度)的多语言版本。 因此,要建立一个健壮的模型,就应该意识到所有这些挑战。 通常,此过程包括三个步骤:表检测,提取和转换。 让我们一一找出所有阶段的问题:


表检测

在此阶段,我们确定表在给定输入中的确切位置。 输入可以是任何格式,例如图像,PDF / Word文档,有时还可以是视频。 我们使用不同的技术和算法通过线或坐标来检测表格。 在某些情况下,我们可能会遇到根本没有边框的表,因此我们需要选择不同的方法。 除了这些,还有其他一些挑战:

  • 图像转换: 图像变换是检测标签的主要步骤。 这包括增强表中存在的数据和边界。 我们需要根据表中显示的数据选择适当的预处理算法。 例如,当我们处理图像时,我们需要应用阈值和边缘检测器。 此转换步骤可帮助我们更精确地找到内容。 在某些情况下,轮廓可能会出错,并且算法无法增强图像。 因此,选择正确的图像转换步骤和预处理至关重要。
  • 画面质量: 当我们扫描表格以提取信息时,我们需要确保在更明亮的环境中扫描这些文档,以确保高质量的图像。 当光照条件较差时,CV和DL算法可能无法检测给定输入中的表。 如果我们使用深度学习,则需要确保数据集是一致的,并且具有一组良好的标准图像。 如果我们在旧的弄皱的纸上的桌子上使用这些模型,那么首先我们需要预处理并消除这些图片中的噪音。
  • 各种结构布局和模板: 所有表不是唯一的。 一个单元可以跨越垂直或水平方向上的多个单元,并且跨单元的组合可以创建大量的结构变化。 此外,某些功能还强调了文本的功能,并且表格行会影响表格结构的理解方式。 例如,水平线或粗体文本可能会强调表格的多个标题。 该表的结构直观地定义了单元格之间的关系。 表中的视觉关系使得很难通过计算找到相关的单元格并从中提取信息。 因此,构建在处理表的不同结构方面具有鲁棒性的算法非常重要。
  • 单元格填充,边距,边框: 这些是任何表格的基本要素–填充,边距和边框并不总是相同。 有些表在单元格内部有很多填充,有些则没有。 使用高质量的图像和预处理步骤将有助于表格提取过程的顺利进行。

表抽取

这是识别表后提取信息的阶段。 关于内容的结构和表中存在什么内容,有很多因素。 因此,在构建算法之前了解所有挑战非常重要。

  • 密集内容: 单元格的内容可以是数字或文本。 但是,文本内容通常很密集,其中包含使用缩写词和缩写的不明确的短文本块。 为了理解表格,需要对文本进行歧义消除,并且需要扩展缩写词和首字母缩写词。
  • 不同的字体和格式: 字体通常具有不同的样式,颜色和高度。 我们需要确保它们是通用的并且易于识别。 很少有字体家族,特别是那些属于草书或手写字体的家族,很难提取。 因此,使用良好的字体和正确的格式设置有助于算法更准确地识别信息。
  • 多页PDF和分页符: 表中的文本行对预定义的阈值敏感。 而且,由于跨多个页面跨越单元格,因此很难识别表。 在多表页面上,很难区分不同的表。 稀疏和不规则的表格很难使用。 因此,图形标线和内容布局应一起用作发现表格区域的重要来源。

表转换

最后一个阶段包括在Excel中或使用其他软件将从表中提取的信息转换为可编辑文档,并将其编译为可编辑文档。 让我们了解一些挑战。

  • 设置布局: 从扫描的文档中提取不同格式的表格时,我们需要具有适当的表格布局以将内容压入其中。有时,该算法无法从单元格中提取信息。 因此,设计合适的布局也同样重要。
  • 多种价值表现模式: 可以使用不同的语法表示模式来显示单元格中的值。 将该表中的文本视为6±2。该算法可能无法转换该特定信息。 因此,提取数值需要了解可能的显示模式。
  • 可视化表示: 表格的大多数表示格式(例如可以描述表格的标记语言)都是为了可视化而设计的。 因此,自动处理表具有挑战性。

这些是我们在使用传统技术进行表提取过程中面临的挑战。 现在让我们看看如何在深度学习的帮助下克服这些问题。 它正在各个领域得到广泛研究。



需要数字化文件、收据或 发票 但是懒得写代码? 前往 纳米网 并免费构建OCR模型!


总结

在本文中,我们详细介绍了从表中提取信息。 我们已经看到了像深度学习和计算机视觉这样的现代技术如何通过构建强大的算法来输出准确的结果来自动化平凡的任务。 在最初的部分中,我们了解了表格提取在促进个人、行业和商业部门任务中的作用,并回顾了详细说明从 PDF/HTML 中提取表格、表单自动化、 发票 自动化等。我们使用计算机视觉编写了一种算法,使用阈值、膨胀和轮廓检测技术来查找表中信息的位置。 我们讨论了在使用传统技术时在表格检测、提取和转换过程中可能面临的挑战,并说明了深度学习如何帮助我们克服这些问题。 最后,我们回顾了一些神经网络架构,并了解了它们基于给定训练数据实现表格提取的方法。



更新:
‌ 添加了更多关于使用深度学习进行表格检测和信息提取的不同方法的阅读材料。

时间戳记:

更多来自 人工智能与机器学习