使用 Amazon Textract 和 Amazon Comprehend PlatoBlockchain Data Intelligence 通过智能文档处理来处理抵押文档。 垂直搜索。 哎。

使用 Amazon Textract 和 Amazon Comprehend 通过智能文档处理来处理抵押文档

贷款和抵押行业的组织每天处理数千份文件。 从新的抵押贷款申请到抵押贷款再融资,这些业务流程涉及每个申请的数百份文件。 如今,用于处理和从所有文档中提取信息的自动化程度有限,尤其是由于格式和布局不同。 由于应用程序数量众多,因此获取战略洞察力并从内容中获取关键信息是一个耗时、高度手动、容易出错且成本高昂的过程。 传统的光学字符识别 (OCR) 工具成本高昂、容易出错、涉及大量配置且难以扩展。 使用 AWS 人工智能 (AI) 服务的智能文档处理 (IDP) 有助于自动化和加速抵押申请处理,目标是更快、更优质地做出决策,同时降低总体成本。

在这篇文章中,我们将演示如何利用机器学习 (ML) 功能 亚马逊Textract亚马逊领悟 无需机器学习技能即可处理新抵押贷款申请中的文件。 我们探索 IDP 的各个阶段,如下图所示,以及它们如何连接到抵押申请流程中涉及的步骤,例如申请提交、承销、验证和关闭。

尽管每个抵押申请可能是独一无二的,但我们考虑了抵押申请中包含的一些最常见的文件,例如统一住宅贷款申请 (URLA-1003) 表格、1099 表格和抵押票据。

解决方案概述

Amazon Textract 是一项 ML 服务,它使用预先训练的 ML 模型从扫描的文档中自动提取文本、笔迹和数据。 Amazon Comprehend 是一种自然语言处理 (NLP) 服务,它使用 ML 来发现文本中有价值的见解和联系,并且可以执行文档分类、名称实体识别 (NER)、主题建模等。

下图显示了 IDP 的各个阶段,因为它与抵押申请流程的各个阶段相关。

图像显示了智能文档处理 (IDP) 阶段的高级解决方案架构,因为它与抵押申请的各个阶段相关。

在流程开始时,文件被上传到 亚马逊简单存储服务 (Amazon S3) 存储桶。 这将启动文档分类过程以将文档分类为已知类别。 文档分类后,下一步是从中提取关键信息。 然后,我们对选定的文档进行丰富,这可以是个人身份信息 (PII) 编辑、文档标记、元数据更新等。 下一步涉及验证在先前阶段提取的数据,以确保抵押申请的完整性。 验证可以通过业务验证规则和跨文档验证规则来完成。 提取信息的置信度得分也可以与设定的阈值进行比较,并通过以下方式自动路由给人工审阅者 亚马逊增强AI (Amazon A2I) 如果未达到阈值。 在流程的最后阶段,提取和验证的数据被发送到下游系统进行进一步的存储、处理或数据分析。

在以下部分中,我们将详细讨论 IDP 的各个阶段,因为它与抵押申请的各个阶段相关。 我们遍历 IDP 的各个阶段并讨论文件的类型; 我们如何存储、分类和提取信息,以及我们如何使用机器学习来丰富文档。

文件储存

Amazon S3 是一种对象存储服务,可提供行业领先的可扩展性、数据可用性、安全性和性能。 在抵押申请过程中和之后,我们使用 Amazon S3 安全地存储抵押文件。 一个 抵押贷款申请包 可能包含多种类型的表格和文件,例如 URLA-1003、1099-INT/DIV/RR/MISC、W2、工资单、银行对账单、信用卡对账单等。 这些文件由申请人在抵押申请阶段提交。 如果不手动查看它们,可能无法立即清楚数据包中包含哪些文档。 该手动过程可能既耗时又昂贵。 在下一阶段,我们使用 Amazon Comprehend 自动执行此过程,以将文档高精度分类到各自的类别中。

文件分类

文档分类是一种对大量未识别文档进行分类和标记的方法。 我们使用 Amazon Comprehend 执行此文档分类 自定义分类器. 自定义分类器是一种 ML 模型,可以使用一组标记文档进行训练,以识别您感兴趣的类。 在托管端点之后训练和部署模型后,我们可以利用分类器来确定特定文档所属的类别(或类)。 在这种情况下,我们训练一个自定义分类器 多级模式,可以使用 CSV 文件或增强的清单文件来完成。 出于本演示的目的,我们使用 CSV 文件来训练分类器。 参考我们的 GitHub存储库 完整的代码示例。 以下是所涉及步骤的高级概述:

  1. 使用 Amazon Textract 从图像或 PDF 文件中提取 UTF-8 编码的纯文本 检测文档文本 API。
  2. 准备训练数据以训练 CSV 格式的自定义分类器。
  3. 使用 CSV 文件训练自定义分类器。
  4. 使用端点部署经过训练的模型以进行实时文档分类或使用支持实时和异步操作的多类模式。

下图说明了这个过程。

图像显示了使用经过训练和部署的分类器模型(实时或批量)的 Amazon Comprehend 自定义分类器训练过程和文档分类。

您可以使用部署的端点自动进行文档分类,以识别和分类文档。 这种自动化对于验证抵押包中是否存在所有必需的文件很有用。 无需人工干预即可快速识别丢失的文件,并在此过程中更早地通知申请人。

文件提取

在此阶段,我们使用 Amazon Textract 和 Amazon Comprehend 从文档中提取数据。 对于包含表单和表格的结构化和半结构化文档,我们使用 Amazon Textract 分析文件 API。 对于 ID 文档等特殊文档,Amazon Textract 提供 分析ID API。 一些文档还可能包含密集的文本,您可能需要从中提取特定于业务的关键术语,也称为 实体。 我们使用 自定义实体识别 Amazon Comprehend 训练自定义实体识别器的能力,该识别器可以从密集文本中识别此类实体。

在以下部分中,我们将浏览抵押申请包中的示例文档,并讨论用于从中提取信息的方法。 对于这些示例中的每一个,都包含一个代码片段和一个简短的示例输出。

从统一住宅贷款申请 URLA-1003 中提取数据

统一住宅贷款申请表 (URLA-1003) 是行业标准的抵押贷款申请表。 这是一份相当复杂的文件,其中包含有关抵押贷款申请人、购买的房产类型、融资金额以及有关房产购买性质的其他详细信息的信息。 以下是一个示例 URLA-1003,我们的目的是从这个结构化文档中提取信息。 因为这是一个表单,所以我们使用带有特征类型的 AnalyzeDocument API 造台 .

图片显示了统一住宅贷款申请 URLA-1003 表格的样本

FORM 特征类型从文档中提取表单信息,然后以键值对格式返回。 以下代码片段使用 amazon-textract-textractor Python 库,只需几行代码即可提取表单信息。 方便的方法 call_textract() 呼叫 AnalyzeDocument API 内部,传递给方法的参数抽象了 API 运行提取任务所需的一些配置。 Document 是一种方便的方法,用于帮助解析来自 API 的 JSON 响应。 它提供了高级抽象并使 API 输出可迭代且易于从中获取信息。 有关详细信息,请参阅 文本响应解析器提取器.

from textractcaller.t_call import call_textract, Textract_Features
from trp import Document

response_urla_1003 = call_textract(input_document='s3://<your-bucket>/URLA-1003.pdf', 
                                   features=[Textract_Features.FORMS])
doc_urla_1003 = Document(response_urla_1003)
for page in doc_urla_1003.pages:
    forms=[]
    for field in page.form.fields:
        obj={}
        obj[f'{field.key}']=f'{field.value}'
        forms.append(obj)
print(json.dumps(forms, indent=4))

请注意,输出包含表单中存在的复选框或单选按钮的值。 例如,在示例 URLA-1003 文档中, 购买 选项被选中。 单选按钮的相应输出被提取为“Purchase”(键)和“SELECTED”(值),表示选择了单选按钮。

[
    { "No. of Units": "1" },
    { "Amount": "$ 450,000.00" },
    { "Year Built": "2010" },
    { "Purchase": "SELECTED" },
    { "Title will be held in what Name(s)": "Alejandro Rosalez" },
    { "Fixed Rate": "SELECTED" },
    ...
]

从 1099 个表单中提取数据

抵押申请包还可能包含许多 IRS 文件,例如 1099-DIV、1099-INT、1099-MISC 和 1099-R。 这些文件显示了申请人通过利息、股息和其他杂项收入组成的收入,这些收入在承保期间有助于做出决定。 下图显示了这些文档的集合,它们的结构相似。 但是,在某些情况下,文档包含表单信息(使用红色和绿色边界框标记)以及表格信息(使用黄色边界框标记)。

图像显示了 1099 个 INT、DIV、MISC 和 R 形式的样本。

为了提取表单信息,我们使用前面解释过的类似代码 AnalyzeDocument API。 我们通过了一个附加功能 到 API 以指示我们需要从文档中提取的表单和表格数据。 以下代码片段使用 AnalyzeDocument 1099-INT 文档中具有 FORMS 和 TABLES 功能的 API:

from textractcaller.t_call import call_textract, Textract_Features
from trp import Document
response_1099_int = call_textract(input_document='s3://<your-bucket>/1099-INT-2018.pdf',
                                  features=[Textract_Features.TABLES, 
                                            Textract_Features.FORMS])
doc_1099_int = Document(response_1099_int)
num_tables=1
for page in doc_1099_int.pages:     
    for table in page.tables:
        num_tables=num_tables+1
        for r, row in enumerate(table.rows):
            for c, cell in enumerate(row.cells):
                print(f"Cell[{r}][{c}] = {cell.text}")
        print('n')

因为文档包含单个表,所以代码的输出如下:

Table 1
-------------------
Cell[0][0] = 15 State 
Cell[0][1] = 16 State identification no. 
Cell[0][2] = 17 State tax withheld 
Cell[1][0] = 
Cell[1][1] = 34564 
Cell[1][2] = $ 2000 
Cell[2][0] = 
Cell[2][1] = 23543 
Cell[2][2] = $ 1000

表格信息包含单元格位置(第 0 行、第 0 列等)和每个单元格内的相应文本。 我们使用一种方便的方法,可以将这个表格数据转换为易于阅读的网格视图:

from textractprettyprinter.t_pretty_print import Textract_Pretty_Print, get_string, Pretty_Print_Table_Format
print(get_string(textract_json=response_1099_int, 
                 table_format=Pretty_Print_Table_Format.grid, 
                 output_type=[Textract_Pretty_Print.TABLES]))

我们得到以下输出:

+----------+-----------------------------+-----------------------+
| 15 State | 16 State identification no. | 17 State tax withheld |
+----------+-----------------------------+-----------------------+
|          | 34564                       | $ 2000                |
+----------+-----------------------------+-----------------------+
|          | 23543                       | $ 1000                |
+----------+-----------------------------+-----------------------+

要以易于使用的 CSV 格式获取输出,格式类型为 Pretty_Print_Table_Format.csv 可以传入 table_format 范围。 还支持其他格式,例如 TSV(制表符分隔值)、HTML 和 Latex。 有关详细信息,请参阅 Textract-PrettyPrinter.

从抵押票据中提取数据

抵押申请数据包可能包含文本密集的非结构化文档。 密集文本文档的一些示例是合同和协议。 抵押票据是抵押申请人与贷方或抵押公司之间的协议,包含密集文本段落中的信息。 在这种情况下,缺乏结构使得很难找到在抵押申请过程中很重要的关键业务信息。 有两种方法可以解决这个问题:

在以下示例抵押票据中,我们特别感兴趣的是找出每月支付金额和本金金额。

图像显示了抵押票据文件的样本。

对于第一种方法,我们使用 QueryQueriesConfig 配置一组传递给 Amazon Textract 的问题的便捷方法 AnalyzeDocument API 调用。 如果文档是多页的(PDF 或 TIFF),我们还可以指定 Amazon Textract 应在其中查找问题答案的页码。 以下代码片段演示了如何创建查询配置、进行 API 调用以及随后解析响应以从响应中获取答案:

from textractcaller import QueriesConfig, Query
import trp.trp2 as t2

#Setup the queries
query2 = Query(text="What is the principal amount borrower has to pay?", alias="PRINCIPAL_AMOUNT", pages=["1"])
query4 = Query(text="What is the monthly payment amount?", alias="MONTHLY_AMOUNT", pages=["1"])

#Setup the query config with the above queries
queries_config = QueriesConfig(queries=[query1, query2, query3, query4])
#Call AnalyzeDocument with the queries_config
response_mortgage_note = call_textract(input_document='s3://<your-bucket>/Mortgage-Note.pdf',
                                       features=[Textract_Features.QUERIES],
                                       queries_config=queries_config)
doc_mortgage_note: t2.TDocumentSchema = t2.TDocumentSchema().load(response_mortgage_note) 

entities = {}
for page in doc_mortgage_note.pages:
    query_answers = doc_mortgage_note.get_query_answers(page=page)
    if query_answers:
        for answer in query_answers:
            entities[answer[1]] = answer[2]
print(entities)

我们得到以下输出:

{
    'PRINCIPAL_AMOUNT': '$ 555,000.00',
    'MONTHLY_AMOUNT': '$2,721.23',
}

对于第二种方法,我们使用 Amazon Comprehend 检测实体 带有抵押票据的 API,它返回它在文本中检测到的实体 预定义的实体集. 这些是 Amazon Comprehend 实体识别器预训练的实体。 但是,由于我们的要求是检测特定实体,Amazon Comprehend 自定义实体识别器使用一组样本抵押票据文档和实体列表进行训练。 我们将实体名称定义为 PRINCIPAL_AMOUNTMONTHLY_AMOUNT. 训练数据是在 Amazon Comprehend 训练之后准备的 数据准备指南 用于自定义实体识别。 实体识别器可以用 文档注释实体清单. 出于本示例的目的,我们使用实体列表来训练模型。 训练模型后,我们可以使用 实时端点批处理模式 从文档内容中检测这两个实体。 以下是训练和部署自定义实体识别器所涉及的步骤。 有关完整的代码演练,请参阅我们的 GitHub 存储库。

  1. 准备训练数据(实体列表和(UTF-8 编码)纯文本格式的文档)。
  2. 使用 创建实体识别器 使用训练数据的 API。
  3. 使用实时端点部署经过训练的模型 创建端点 API。

从美国护照中提取数据

亚马逊文摘 分析身份证件 能力可以从美国的身份证件(例如驾照和护照)中检测和提取信息。 这 AnalyzeID API 能够检测和解释 ID 文档中的隐含字段,这使得从文档中提取特定信息变得容易。 身份证件几乎总是抵押申请包的一部分,因为它用于在承销过程中验证借款人的身份,并验证借款人的履历数据的正确性。

图像显示美国护照样本

我们使用一种方便的方法,名为 call_textract_analyzeid,它调用 AnalyzeID 内部 API。 然后我们遍历响应以从 ID 文档中获取检测到的键值对。 请参阅以下代码:

from textractcaller import call_textract_analyzeid
import trp.trp2_analyzeid as t2id

response_passport = call_textract_analyzeid(document_pages=['s3://<your-bucket>/Passport.pdf'])
doc_passport: t2id.TAnalyzeIdDocument = t2id.TAnalyzeIdDocumentSchema().load(response_passport)

for id_docs in response_passport['IdentityDocuments']:
    id_doc_kvs={}
    for field in id_docs['IdentityDocumentFields']:
        if field['ValueDetection']['Text']:
            id_doc_kvs[field['Type']['Text']] = field['ValueDetection']['Text']
print(id_doc_kvs)

AnalyzeID 在一个名为的结构中返回信息 IdentityDocumentFields,其中包含规范化的键及其对应的值。 例如,在以下输出中, FIRST_NAME 是规范化的键,值为 ALEJANDRO. 在示例护照图像中,名字的字段被标记为“Given Names / Prénoms / Nombre”,但是 AnalyzeID 能够将其规范化为键名 FIRST_NAME. 有关支持的规范化字段的列表,请参阅 身份证明文件响应对象.

{
    'FIRST_NAME': 'ALEJANDRO',
    'LAST_NAME': 'ROSALEZ',
    'DOCUMENT_NUMBER': '918268822',
    'EXPIRATION_DATE': '31 JAN 2029',
    'DATE_OF_BIRTH': '15 APR 1990',
    'DATE_OF_ISSUE': '29 JAN 2009',
    'ID_TYPE': 'PASSPORT',
    'ENDORSEMENTS': 'SEE PAGE 27',
    'PLACE_OF_BIRTH': 'TEXAS U.S.A.'
}

抵押贷款包可能包含其他一些文件,例如工资单、W2 表格、银行对账单、信用卡对账单和就业证明信。 我们为每个文档提供了样本以及从中提取数据所需的代码。 如需完整的代码库,请查看我们的笔记本 GitHub存储库.

文档充实

文档丰富的最常见形式之一是对文档的敏感或机密信息编辑,这可能是由于隐私法律或法规而强制执行的。 例如,抵押贷款申请人的工资单可能包含敏感的 PII 数据,例如姓名、地址和 SSN,这些数据可能需要编辑以进行扩展存储。

在前面的示例 paystub 文档中,我们对 SSN、姓名、银行帐号和日期等 PII 数据进行了编辑。 为了识别文档中的 PII 数据,我们使用 Amazon Comprehend PII 检测 通过能力 检测PII实体 API。 此 API 检查文档的内容以识别 PII 信息的存在。 由于此 API 需要以 UTF-8 编码的纯文本格式输入,我们首先使用 Amazon Textract 从文档中提取文本 检测文档文本 API,它从文档中返回文本,还返回几何信息,例如边界框尺寸和坐标。 然后使用这两种输出的组合来对文档进行编辑,作为丰富过程的一部分。

审查、验证和整合数据

从文档提取阶段提取的数据可能需要根据特定的业务规则进行验证。 特定信息也可以在多个文档中进行验证,也称为 跨文档验证. 跨文档验证的一个示例可能是将身份证文件中的申请人姓名与抵押申请文件中的姓名进行比较。 您还可以在此阶段进行其他验证,例如财产价值估计和有条件的承保决策。

第三种类型的验证与在文档提取阶段提取的数据的置信度分数有关。 Amazon Textract 和 Amazon Comprehend 返回检测到的表单、表格、文本数据和实体的置信度分数。 您可以配置置信度分数阈值以确保仅向下游发送正确的值。 这是通过 Amazon A2I 实现的,它将检测到的数据的置信度分数与预定义的置信度阈值进行比较。 如果未达到阈值,则文档和提取的输出将通过直观的 UI 发送给人工进行审查。 审阅者对数据采取纠正措施并将其保存以供进一步处理。 有关详细信息,请参阅 Amazon A2I 的核心概念.

结论

在这篇文章中,我们讨论了智能文档处理的各个阶段,因为它与抵押申请的各个阶段有关。 我们查看了可以在抵押申请包中找到的一些常见文件示例。 我们还讨论了从这些文档中提取和处理结构化、半结构化和非结构化内容的方法。 IDP 提供了一种自动化端到端抵押文档处理的方法,可以扩展到数百万个文档,从而提高应用决策的质量、降低成本并更快地为客户提供服务。

下一步,您可以试用我们的代码示例和笔记本 GitHub存储库. 要了解有关 IDP 如何帮助您处理文档工作负载的更多信息,请访问 自动处理文档中的数据.


关于作者

使用 Amazon Textract 和 Amazon Comprehend PlatoBlockchain Data Intelligence 通过智能文档处理来处理抵押文档。 垂直搜索。 哎。安扬·比斯瓦斯 是一名高级 AI 服务解决方案架构师,专注于 AI/ML 和数据分析。 Anjan 是全球 AI 服务团队的一员,与客户合作,帮助他们了解 AI 和 ML 的业务问题并开发解决方案。 Anjan 拥有超过 14 年与全球供应链、制造和零售组织合作的经验,并积极帮助客户开始使用 AWS AI 服务并进行扩展。

使用 Amazon Textract 和 Amazon Comprehend PlatoBlockchain Data Intelligence 通过智能文档处理来处理抵押文档。 垂直搜索。 哎。德维蒂·帕塔克 是圣地亚哥的高级技术客户经理。 她专注于帮助半导体行业参与 AWS。 业余时间,她喜欢阅读新技术和玩棋盘游戏。

使用 Amazon Textract 和 Amazon Comprehend PlatoBlockchain Data Intelligence 通过智能文档处理来处理抵押文档。 垂直搜索。 哎。巴拉吉普利 是加利福尼亚州湾区的一名解决方案架构师。 目前正在帮助选定的美国西北部医疗保健生命科学客户加速他们的 AWS 云采用。 巴拉吉喜欢旅行,喜欢探索不同的美食。

时间戳记:

更多来自 AWS机器学习