Amazon Textract 是一种机器学习(ML)服务,可自动从任何文档或图像中提取文本、手写内容和数据。Amazon Textract 在 AnalyzeDocument API 中提供了 Tables 功能,可以自动从任何文档中提取表格结构。在这篇文章中,我们将讨论 Tables 功能的改进以及如何更轻松地从各种文档中提取表格结构中的信息。
文档中的表格结构(例如财务报告、工资单和分析证书文件)通常以易于解释信息的方式进行格式化。它们通常还包括表格标题、表格页脚、节标题和摘要行等信息,以便更好地阅读和组织。在此改进之前,AnalyzeDocument 中的 Tables 功能将识别这些元素作为单元格,并且不会提取表格范围之外存在的标题和页脚。在这种情况下,需要自定义后处理逻辑来识别此类信息或从 API 的 JSON 输出中单独提取它。随着 Tables 功能的增强公告,各种表格数据方面的提取变得更加简单。
在 2023 年 4 月,Amazon Textract 通过 Tables 功能引入了自动检测文档中存在的标题、页脚、节标题和摘要行的能力。在本文中,我们将讨论这些增强功能,并提供示例以帮助您了解并在文档处理工作流程中使用它们。我们通过代码示例讲解如何使用这些增强功能来使用 API 并使用 Amazon Textract Textractor 库处理响应。
解决方案概述
下图显示了更新的模型不仅识别文档中的表格,还识别所有相应的表格标题和页脚。此示例财务报告文档包含表格标题、页脚、节标题和摘要行。
Tables 功能增强功能添加了对 API 响应中四个新元素的支持,使您能够轻松提取每个表格元素,并添加了区分表格类型的能力。
表格元素
Amazon Textract 可以识别表格的几个组件,例如表格单元格和合并单元格。这些组件称为 Block
对象,它们封装了与组件相关的详细信息,例如边界几何、关系和置信度分数。 Block
表示在彼此接近的像素组中在文档中识别出的项。以下是此增强功能中引入的新 Table Blocks:
- 表格标题 – 一种新的
Block
类型称为TABLE_TITLE
,使您能够识别给定表格的标题。标题可以是一行或多行,通常位于表格上方或作为表格中的单元格嵌入。 - 表格页脚 – 一种新的
Block
类型称为TABLE_FOOTER
,使您能够识别与给定表格相关联的页脚。页脚可以是一行或多行,通常位于表格下方或作为表格中的单元格嵌入。 - 节标题 – 一种新的
Block
类型称为TABLE_SECTION_TITLE
,使您能够识别检测到的单元格是否为节标题。 - 摘要单元格 – 一种新的
Block
类型称为TABLE_SUMMARY
,使您能够确定单元格是否为摘要单元格,例如工资单上的总额单元格。
表格类型
当 Amazon Textract 在文档中识别表格时,它会将表格的所有细节提取到顶层 Block
类型的 TABLE
中。表格可以有各种形状和大小。例如,文档通常包含具有可辨别表头的表格或没有可辨别表头的表格。为了帮助区分这些类型的表格,我们为 TABLE Block
添加了两种新的实体类型:SEMI_STRUCTURED_TABLE
和 STRUCTURED_TABLE
。这些实体类型帮助您区分结构化与半结构化表格。
结构化表格是具有明确定义列标题的表格。但是对于半结构化表格,数据可能不遵循严格的结构。例如,数据可能以表格结构出现,但没有定义的标题。新的实体类型提供了选择在后处理期间保留或删除哪些表格的灵活性。下图显示了STRUCTURED_TABLE
和SEMI_STRUCTURED_TABLE
的示例。
分析API输出
在本节中,我们将探讨如何使用Amazon Textract Textractor库使用表格功能增强后的AnalyzeDocument
API输出进行后处理。这允许您从表格中提取相关信息。
Textractor是一个库,旨在与Amazon Textract API和实用程序无缝协作,以随后将API返回的JSON响应转换为可编程对象。您还可以使用它在文档上可视化实体,并将数据导出为逗号分隔值(CSV)文件等格式。它旨在帮助Amazon Textract客户设置其后处理管道。
在我们的示例中,我们使用来自10-K SEC备案文件文档的以下示例页面。
以下代码可以在我们的GitHub存储库中找到。要处理此文档,我们使用Textractor库并导入它,以便我们可以后处理API输出并可视化数据:
pip install amazon-textract-textractor
第一步是调用Amazon Textract AnalyzeDocument
,并使用Tables功能,由features=[TextractFeatures.TABLES]
参数表示,以提取表格信息。请注意,此方法调用实时(或同步)AnalyzeDocument API,支持单页面文档。但是,您可以使用异步StartDocumentAnalysis
API来处理多页文档(最多为3,000页)。
from PIL import Image
from textractor import Textractor
from textractor.visualizers.entitylist import EntityList
from textractor.data.constants import TextractFeatures, Direction, DirectionalFinderType
image = Image.open("sec_filing.png") # loads the document image with Pillow
extractor = Textractor(region_name="us-east-1") # Initialize textractor client, modify region if required
document = extractor.analyze_document(
file_source=image,
features=[TextractFeatures.TABLES],
save_image=True
)
document
对象包含有关文档的元数据,可以进行审查。请注意,它识别出文档中的一个表格以及文档中的其他实体:
This document holds the following data:
Pages - 1
Words - 658
Lines - 122
Key-values - 0
Checkboxes - 0
Tables - 1
Queries - 0
Signatures - 0
Identity Documents - 0
Expense Documents – 0
现在,我们拥有包含表格信息的API输出,我们可以使用先前讨论的响应结构可视化表格的不同元素:
table = EntityList(document.tables[0])
document.tables[0].visualize()
Textractor库使用不同的颜色代码突出显示检测到的表格中的各个实体。让我们深入探讨如何提取每个元素。以下代码段演示如何提取表格的标题:
table_title = table[0].title.text
table_title
'The following table summarizes, by major security type, our cash, cash equivalents, restricted cash, and marketable securities that are measured at fair value on a recurring basis and are categorized using the fair value hierarchy (in millions):'
同样地,我们可以使用以下代码提取表格的页脚。请注意,table_footers 是一个列表,这意味着可以有一个或多个与表格相关联的页脚。我们可以遍历此列表以查看所有存在的页脚,如以下代码片段所示,输出显示了三个页脚:
table_footers = table[0].footers
for footers in table_footers:
print (footers.text)
(1) "其他收入(支出),净额" 中记录的相关未实现收益(亏损)分别为 2021 年第三季度和 2022 年第三季度的 $(116) 百万和 $10 亿,以及截至 2021 年和 2022 年 9 月 30 日的 $6 百万和 $(113)亿。
(2) 我们需要将部分现金、现金等价物和可变息证券主要作为房地产、特定司法管辖区的第三方卖家应付款项、债务以及备用和贸易信用证的抵押或限制。我们将使用受限制的现金、现金等价物和可变息证券分类为 "应收账款、净额和其他",且使用期限小于 12 个月的为非流动的 "其他资产",在我们的合并资产负债表上。请参见 "注 4 - 承诺和事项"。
(3) 我们对 Rivian 的股权投资在 2021 年 12 月 31 日和 2022 年 9 月 30 日分别具有 $156 亿和 $52 亿的公允价值。该投资受到监管销售限制的影响,因缺乏市场流动性而产生了约 $8 亿的折价,截至 2021 年 12 月 31 日,该折价在 2022 年第一季度到期。
生成下游数据
Textractor 库还可以帮助您简化将表格数据导入下游系统或其他工作流程的过程。例如,您可以将提取的表格数据导出到可读的 Microsoft Excel 文件中。截至本文撰写时,这是唯一支持合并表格的格式。
table[0].to_excel(filepath="sec_filing.xlsx")
我们还可以将其转换为 Pandas DataFrame。DataFrame 是 Python 和 R 等编程语言中的数据操作、分析和可视化的流行选择。
在 Python 中,DataFrame 是 Pandas 库中的主要数据结构。它具有灵活和强大的功能,通常是数据分析专业人士在各种数据分析和 ML 任务中的首选。以下代码片段展示了如何将提取的表格信息转换为 DataFrame,只需一行代码:
df=table[0].to_pandas()
df
最后,我们可以将表格数据转换为 CSV 文件。CSV 文件通常用于将数据导入关系型数据库或数据仓库。请参见以下代码:
table[0].to_csv()
',0,1,2,3,4,5\n0,,"2021 年 12 月 31 日",,2022 年 9 月 30 日,\n1,,总估计公允价值,成本或摊销成本,总未实现收益,总未实现亏损,总估计公允价值\n2,现金,"$ 10,942","$ 10,720",$ -,$ -,"$ 10,720"\n3,一级证券:,,,,,\n4,货币市场基金,"20,312","16,697",-,-,"16,697"\n5,股票证券 (1)(3),"1,646",,,,"5,988"\n6,二级证券:,,,,,\n7,外国政府和机构证券,181,141,-,(2),139\n8,美国政府和机构证券,"4,300","2,301",-,(169),"2,132"\n9,公司债券证券,"35,764","20,229",-,(799),"19,430"\n10,资产支持证券,"6,738","3,578",-,(191),"3,387"\n11,其他固定收益证券,686,403,-,(22),381\n12,股票证券 (1)(3),"15,740",,,,19\n13,,"$ 96,309","$ 54,069",$ -,"$ (1,183)","$ 58,893"\n14,"减:受限制的现金、现金等价物和市场able证券 (2)",(260),,,,(231)\n15,"总现金、现金等价物和市场证券","$ 96,049",,,,"$ 58,662"\n'</p><h2> </h2>
结论
引入这些新的块和实体类型(TABLE_TITLE
,TABLE_FOOTER
,STRUCTURED_TABLE
,SEMI_STRUCTURED_TABLE
,TABLE_SECTION_TITLE
,TABLE_FOOTER
和TABLE_SUMMARY
)标志着使用Amazon Textract从文档中提取表格结构的显著进步。
这些工具提供了更加细致和灵活的方法,既适用于结构化表格也适用于半结构化表格,并确保不会忽略任何重要数据,无论其在文档中的位置如何。
这意味着我们现在可以以更高效和准确的方式处理各种数据类型和表格结构。随着我们继续拥抱文档处理工作流程自动化的力量,这些增强功能无疑将为更加简化的工作流程、更高效的生产力和更深入的数据分析铺平道路。有关AnalyzeDocument
和表格功能的更多信息,请参阅AnalyzeDocument。