“使用自定义查询将Amazon Textract定制为针对特定业务文件的解决方案”

将Amazon Textract定制为特定业务文件的解决方案:利用自定义查询开创全新发展

Amazon Textract是一种机器学习(ML)服务,可自动从扫描的文档中提取文本、手写和数据。Queries是一个功能,使您能够使用自然语言从不同、复杂的文档中提取特定的信息。自定义查询为您提供了一种自助方式来自定义Queries功能,以处理特定于您业务的非标准文档,如汽车贷款合同、支票和工资单。通过自定义该功能以识别独特术语、结构和与这些文档类型特定的关键信息,您可以满足下游处理需求,减少人工干预并提高准确性。自定义查询易于集成到现有的Textract流程中,您仍然可以从Amazon Textract的完全托管智能文档处理功能中受益,而无需投资于机器学习专业知识或基础设施管理。

在本文中,我们展示了如何使用自定义查询从复杂的非标准文档中准确提取支票数据。此外,我们还讨论了自定义查询的好处,并分享了有效使用此功能的最佳实践。

解决方案概述

在开始新的用例时,您可以通过导航到Textract控制台 并使用“分析文档演示”或“批量文档上传器”来评估Textract Queries在您的文档上的表现。请参阅查询的最佳实践以起草适用于您的用例的查询。如果您在查询响应中发现由于业务文档性质而导致的错误,您可以使用自定义查询来提高准确性。几小时内,您可以使用AWS管理控制台使用样本文档注释和训练适配器。适配器是插入到Amazon Textract预训练深度学习模型的组件,根据您的带注释的文档定制其输出。您可以通过将适配器标识符作为分析文档查询 API请求的附加参数来使用适配器进行推理。

让我们来看看自定义查询如何在提取支票数据等具有挑战性的实际情况中提高准确率。在处理支票时,主要的挑战来自于其高度变化取决于类型(例如个人支票或出纳支票)、金融机构和国家(例如MICR行格式)。这些变化可能包括收款人姓名、金额(数字和文字)、日期和签名的位置。识别和适应这些变化可能是数据提取过程中的复杂任务。为了提高数据提取效果,组织通常会采用手动验证和验证过程,这增加了提取过程的成本和时间。

自定义查询通过允许您自定义在不同类型的支票上进行预训练的查询功能,以解决这些挑战。定制预训练功能帮助您在处理特定布局的情况下实现高数据提取准确性。

在我们的用例中,一个金融机构希望从支票中提取以下字段:收款人姓名、付款人姓名、账号、路由号码、支付金额(数字形式)、支付金额(文字形式)、支票编号、日期和备注。

让我们探索生成支票处理适配器(自定义输出的组件)的过程。适配器可以通过控制台或通过API以编程方式创建。本文详细介绍了控制台体验;但是,如果您想以编程方式创建适配器,请参考custom-queries-checks-blog.ipynb Jupyter笔记本中的代码示例(选项2)。

适配器生成过程包括五个高级步骤:创建适配器,上传样本文档,注释文档,训练适配器和评估性能指标。

创建适配器

在亚马逊Textract控制台上,通过提供名称、描述和可选标签创建一个新的适配器,这些标签可以帮助您识别适配器。您可以选择启用自动更新,这样当底层的查询功能更新为新功能时,亚马逊Textract可以更新您的适配器。

创建适配器后,您将在“如何工作”部分中看到适配器详细信息页面的步骤列表。当您按顺序完成它们时,此部分将激活您的下一步操作。

上传样本文档

适配器生成的初始阶段涉及仔细选择适当的一组样本文档,用于注释、训练和测试。我们有一个选项,可以自动将文档分成测试和训练数据集;然而,对于此过程,我们需要手动拆分数据集。

重要的是要注意,您可以使用仅包含五个测试和五个训练样本的适配器,但是确保此样本集多样且代表生产环境中遇到的工作负载是非常重要的。

对于本教程,我们已经为您提供了样本支票数据集供您下载。我们的数据集包括个人支票、出纳支票、刺激支票以及嵌入在工资单中的支票等各种变体。我们还包括手写和打印的支票,以及一些字段的变体,如备忘录行。

注释样本文档

作为下一步,您可以通过控制台将查询与相应的答案关联,通过关联样本文档注释样本文档。您可以通过自动标注或手动标注来启动注释过程。自动标注使用亚马逊Textract Queries对数据集进行预标注。我们建议使用自动标注来加速注释过程。

对于支票处理的情况,我们使用以下查询。如果您的用例涉及其他文档类型,请参考查询的最佳实践来起草适用于您的用例的查询。

  • 收款人是谁?
  • 支票号是多少?
  • 收款人地址是什么?
  • 日期是多少?
  • 账号是多少?
  • 支票金额用文字表示是多少?
  • 账户名/付款人/出票人是谁?
  • 金额是多少?
  • 银行名/承兑人是谁?
  • 银行路由号是多少?
  • MICR行是什么?
  • 备注是什么?

自动标签过程完成后,您有选项可以查看并编辑每个文件提供的答案。选择开始审查来审查每个图像的注释。

如果对查询的响应缺失或错误,您可以通过绘制边界框或手动输入响应来添加或编辑响应。

为了加快您的操作,我们已经预先为您进行了检查样本的预标注,方便您将其复制到您的AWS账户中。在custom-queries-checks-blog.ipynb Jupyter笔记本中运行Amazon Textract code samples库,可以自动更新您的注释。

训练适配器

在您审查了所有的样本文件以确保注释准确性之后,您可以开始适配器训练过程。在这一步骤中,您需要指定一个存储位置来保存适配器。训练过程的持续时间将根据用于训练的数据集大小而有所变化。如果您选择使用自己选择的注释工具并将相关输入文件传递给API,还可以以编程方式调用训练API。有关更多详细信息,请参考自定义查询

评估性能指标

适配器训练完成后,您可以通过评估指标(如F1得分精度和召回率)来评估其性能。您可以整体或按每个文档进行分析这些指标。使用我们的样本检查数据集,经过训练的适配器的准确性指标(F1得分)从68%提高到92%。

此外,您可以选择尝试适配器来测试适配器对新文档的输出。

在评估完成后,您可以选择通过将附加的样本文档纳入训练数据集或重新注释得分低于阈值的文档来提升适配器的性能。要重新注释文档,请在适配器详情页上选择验证文档,选择文档,然后选择审查注释

以编程方式测试适配器

成功完成培训后,您现在可以在您的 AnalyzeDocument API 调用中使用适配器。API 请求与亚马逊 Textract 查询 API 请求相似,但添加了 AdaptersConfig 对象。

您可以运行以下示例代码,或直接在 custom-queries-checks-blog.ipynb Jupyter 笔记本中运行它。示例笔记本还提供了对比 Amazon Textract 查询和 Amazon Textract 自定义查询结果的代码。

创建一个带有适配器 ID 和适配器版本的 AdaptersConfig 对象,并可选择包括要应用适配器的页面:

!python -m pip install amazon-textract-caller --upgrade!python -m pip install amazon-textract-response-parser –upgradeimport boto3from textractcaller.t_call import call_textract, Textract_Features, Query, QueriesConfig, Adapter, AdaptersConfigimport trp.trp2 as t2from tabulate import tabulate# 创建 AdaptersConfigadapter1 = Adapter(adapter_id=”111111111”, version="1", pages=["*"])adapters_config = AdaptersConfig(adapters=[adapter1])

创建一个带有您训练了适配器的查询的 QueriesConfig 对象,并调用 Amazon Textract API。请注意,您还可以包括适配器未经训练的其他查询。亚马逊 Textract 将自动为这些问题使用 Queries 功能,而不是自定义查询,从而为您提供在需要时仅使用自定义查询的灵活性。

# 创建 QueriesConfigqueries = []queries.append(Query(text="What is the check#?", alias="CHECK_NUMBER", pages=["*"]))queries.append(Query(text="What is the date?", alias="DATE", pages=["*"]))queries.append(Query(text="What is the check amount in words?", alias="CHECK_AMOUNT_WORDS", pages=["*"]))queries.append(Query(text="What is the dollar amount?", alias="DOLLAR_AMOUNT", pages=["*"]))queries.append(Query(text="Who is the payee?", alias="PAYEE_NAME", pages=["*"]))queries.append(Query(text="What is the customer account#", alias="ACCOUNT_NUMBER", pages=["*"]))queries.append(Query(text="what is the payee address?", alias="PAYEE_ADDRESS", pages=["*"]))queries.append(Query(text="What is the bank routing number?", alias="BANK_ROUTING_NUMBER", pages=["*"]))queries.append(Query(text="What is the memo", alias="MEMO", pages=["*"]))queries.append(Query(text="What is the account name/payer/drawer name?", alias="ACCOUNT_NAME", pages=["*"]))queries.append(Query(text="What is the bank name/drawee name?", alias="BANK_NAME", pages=["*"]))queries_config = QueriesConfig(queries=queries)document_name = "<image_name>"textract_json_with_adapter = call_textract(input_document=document_name,                  boto3_textract_client=textract_client,                  features=[Textract_Features.QUERIES],                  queries_config=queries_config,                  adapters_config=adapters_config)

最后,我们用表格形式呈现我们的结果以获得更好的可读性:

def tabulate_query_answers(textract_json):    d = t2.TDocumentSchema().load(textract_json)    for page in d.pages:        query_answers = d.get_query_answers(page=page)        print(tabulate(query_answers, tablefmt="github"))tabulate_query_answers(textract_json_with_adapter)

清理

为清理您的资源,请完成以下步骤:

  1. 在亚马逊 Textract 控制台上,选择导航窗格中的Custom Queries
  2. 选择要删除的适配器。
  3. 选择删除

适配器管理

您可以通过创建先前生成的适配器的新版本来定期改进您的适配器。要创建适配器的新版本,请将新的样本文档添加到现有适配器中,对文档进行标注并进行培训。您可以同时维护多个适配器版本,以便在开发流水线中使用。为了无缝更新适配器,请勿对储存适配器生成所需文件的 Amazon Simple Storage Service (Amazon S3) 存储桶进行更改或删除。

最佳实践

在使用文档的自定义查询时,请参考亚马逊文本抽取自定义查询的最佳实践以获取额外的注意事项和最佳实践。

自定义查询的好处

自定义查询提供以下好处:

  • 增强文档理解 – 通过准确提取和规范化数据的能力,自定义查询减少了对手动审核和审计的依赖,并使您能够为智能文档处理工作流程构建更可靠的自动化流程。
  • 更快的价值实现时间 – 当您遇到需要更高准确性的新类型文档时,您可以使用自定义查询在几个小时内自助生成适配器。您无需等待预训练模型更新,即可应对工作流程中的新类型文档或现有文档的变体。您完全掌控自己的流程,无需依赖亚马逊文本抽取来支持新类型文档。
  • 数据隐私 – 自定义查询不会保留或使用用于生成适配器的数据,以增强适用于所有客户的通用预训练模型。适配器仅限于客户账户或客户明确指定的其他账户,确保只有这些账户可以访问使用客户数据进行改进的内容。
  • 便利性 – 自定义查询提供类似查询的完全托管推断体验。适配器训练是免费的,您只需支付推断费用。自定义查询节省了训练和操作自定义模型的开销和费用。

结论

在本文中,我们讨论了自定义查询的好处,展示了自定义查询如何准确提取支票中的数据,并分享了有效利用此功能的最佳实践。在短短几个小时内,您可以使用控制台创建适配器,并在AnalyzeDocument API中将其用于数据提取需求。有关更多信息,请参阅自定义查询