Press "Enter" to skip to content

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务

结构化数据被定义为遵循固定模式的数据,例如存储在数据库中的列信息,而非结构化数据则缺乏特定的形式或模式,如文本、图像或社交媒体帖子。这两种数据都在各个组织中持续产生和消耗。例如,根据国际数据公司(IDC)的数据,到2025年,全球数据量预计将增加十倍,其中非结构化数据占据相当大的比例。企业可能希望在摄取文档时添加自定义元数据,如文档类型(W-2表格或工资单)、各种实体类型(例如姓名、组织和地址),以及标准元数据如文件类型、创建日期或大小,来拓展智能搜索的范围。自定义元数据帮助组织和企业以他们偏好的方式对信息进行分类。例如,元数据可用于过滤和搜索。客户可以使用亚马逊理解(Amazon Comprehend),这是由亚马逊网络服务(AWS)管理的自然语言处理(NLP)服务,来提取关于文档内容的洞察,并将其与数据一起摄入亚马逊Kendra中进行索引。亚马逊Kendra是一种通过机器学习(AWS)提供的高度准确且易于使用的企业搜索服务。然后,可以使用自定义元数据来丰富内容,以实现更好的过滤和侧边栏功能。在亚马逊Kendra中,侧边栏是一组搜索结果的范围视图。例如,您可以为世界各地的城市提供搜索结果,其中文档经过特定城市的筛选。您还可以创建侧边栏以按照特定作者显示结果。

保险公司承担着越来越多的理赔任务。此外,由于涉及的保险文件类型多样且每个文件中都有自定义实体,理赔处理的复杂性也在增加。在本文中,我们描述了保险提供商自定义内容增强的用例。保险提供商接收来自受益人律师的不同保险类型(如房屋、汽车和人寿保险)的支付赔款申请。在此用例中,保险提供商收到的文档不包含任何允许根据特定实体和类别搜索内容的元数据。保险提供商希望根据与其业务领域相关的自定义实体和类别对Kendra内容进行过滤。本文演示了如何使用亚马逊理解的自定义模型来自动化和简化元数据生成过程。生成的元数据可以在摄入过程中使用亚马逊Kendra的自定义文档增强(CDE)自定义逻辑进行自定义。

下面是一些具有或不具有过滤和侧边栏功能的亚马逊Kendra搜索示例。

在下面的屏幕截图中,亚马逊Kendra提供了搜索结果,但没有任何选项可以通过使用任何过滤器进一步缩小搜索结果。

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第1张

下面的屏幕截图显示,可以通过使用不同的侧边栏(如法律事务所、保单号)来过滤亚马逊Kendra搜索结果,根据自定义元数据进一步缩小搜索结果。

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第2张

本文讨论的解决方案同样适用于其他业务/用例,如医疗保健、制造和研究。

解决方案概述

在这个提议的解决方案中,我们将 1) 将保险理赔提交分类为各种类别,并且 2) 从这些文档中提取与保险相关的实体。完成后,可以将文档路由到适当的部门或下游流程。

以下图表概述了提议的解决方案架构。

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第3张

亚马逊Comprehend自定义分类API用于将您的文档组织成您定义的类别(类)。自定义分类是一个两步过程。首先,您训练一个自定义分类模型(也称为分类器),用于识别您感兴趣的类别。然后,您可以使用模型对任意数量的文档集进行分类。

亚马逊Comprehend自定义实体识别功能用于识别超出默认通用实体类型的特定实体类型(保险公司名称,投保人姓名,保单号码)。构建自定义实体识别模型比使用字符串匹配或正则表达式从文档中提取实体更有效。自定义实体识别模型可以学习这些名称可能出现的上下文。此外,字符串匹配不能检测到拼写错误或遵循新的命名约定的实体,而使用自定义模型是可能的。

在深入讨论之前,让我们先来探索亚马逊Kendra。亚马逊Kendra是一个由机器学习驱动的高精度、易于使用的企业搜索服务。它允许用户在组织中分布的大量内容中找到所需的信息,包括网站、数据库和内部网站等。我们首先要创建一个亚马逊Kendra索引来获取文档。在摄取数据时,考虑到自定义数据增强(CDE)的概念是至关重要的。CDE允许您将外部知识纳入搜索索引,从而增强搜索能力。有关更多信息,请参阅摄入期间对文档进行增强。在本文中,CDE逻辑调用亚马逊Comprehend的自定义API,以识别类别和实体来增强文档。最后,我们使用亚马逊Kendra搜索页面展示了元数据如何通过添加分面和过滤能力来增强搜索功能。

实施此解决方案的高级步骤如下:

  1. 使用训练数据训练亚马逊Comprehend自定义分类器
  2. 使用训练数据训练亚马逊Comprehend自定义实体识别
  3. 创建亚马逊Comprehend自定义分类器和自定义实体识别终端节点
  4. 为提取后的增强创建和部署Lambda函数
  5. 创建和填充亚马逊Kendra索引
  6. 使用提取的实体在亚马逊Kendra中进行搜索筛选

我们还在GitHub repo中提供了一个示例应用供参考。

数据安全和IAM考虑

以安全为首要考虑,此解决方案遵循最少权限原则,用于所使用的服务和功能。亚马逊Comprehend自定义分类和自定义实体识别所使用的IAM角色只有权限访问测试存储桶中的数据集。亚马逊Kendra服务可以访问特定的S3存储桶和用于调用Comprehend API的Lambda函数。Lambda函数只有调用亚马逊Comprehend API的权限。有关更多信息,请参阅Notebook中的1.2和1.3节。

建议您在生产环境中实施解决方案之前,在非生产环境中执行以下操作。

使用训练数据训练Comprehend自定义分类器

亚马逊Comprehend自定义分类支持两种注释文件的数据格式类型:

由于我们的数据已经被标记并存储在CSV文件中,我们将以CSV文件格式作为注释文件的示例使用。我们必须将标记的训练数据以UTF-8编码的文本格式提供在CSV文件中。在CSV文件中不包括标题行。在文件中添加标题行可能会导致运行时错误。训练数据CSV文件的示例如下:

类别,文档1的文本内容 类别,文档2的文本内容

为了准备分类器训练数据,请参考准备分类器训练数据。在CSV文件中,每一行的第一列包含一个或多个类别标签。类别标签可以是任何有效的UTF-8字符串。我们建议使用清晰的类别名称,避免意义重叠。类别名称可以包含空格,并且可以由下划线或连字符连接的多个单词组成。在每一行中,不要在逗号之前或之后留下任何空格字符。

接下来,您将根据多类模式多标签模式来进行训练。具体来说,多类模式下,每个文档分配一个类别,而多标签模式下,各个类别表示不相互排斥的不同类别。在我们的情况下,我们将使用多类模式进行纯文本模型的训练。

您可以为Amazon Comprehend自定义分类器训练和模型评估准备单独的训练和测试数据集。或者,仅提供一个数据集用于训练和测试。Comprehend将自动选择您提供的数据集中的10%作为测试数据。在本示例中,我们提供了单独的训练和测试数据集。

以下示例显示了一个包含各种文档类别名称的CSV文件。

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第4张

文档格式 – 保险类型,文档1的内容

当训练定制分类模型时,它可以识别文档上的不同保险类别(家庭保险、汽车保险或人寿保险)。

使用训练数据训练Amazon Comprehend自定义实体识别器(NER)

Amazon Comprehend自定义实体识别(NER)的训练数据可以通过两种不同的方式准备:

  • 注释 – 提供一个包含模式训练的注释实体的数据集
  • 实体列表(仅限纯文本) – 提供一个实体名称列表及其标签类型(例如“保险公司名称”)和一组包含这些实体的未注释文档进行模型训练

了解更多信息,请参考准备实体识别器训练数据

使用实体列表进行模型训练时,我们需要提供两个信息:一份包含相关自定义实体类型的实体名称列表,以及一组包含这些实体的未注释文档。

自动训练需要有两种类型的信息:示例文档和实体列表或注释。一旦识别器训练完成,您可以在文档中检测自定义实体。您可以快速实时分析少量文本,也可以使用异步作业分析大量文档。

您可以为Amazon Comprehend自定义实体识别器训练和模型评估准备单独的训练和测试数据集。或者只提供一个数据集用于训练和测试。Amazon Comprehend将自动选择您提供的数据集中的10%作为测试数据。在下面的示例中,我们将训练数据集指定为Documents.S3Uri,位于InputDataConfig下。

以下示例显示了一个包含各种实体的CSV文件。

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第5张

一旦训练完成自定义实体(NER)模型,它将能够提取各种实体,如“PAYOUT”、“INSURANCE_COMPANY”、“LAW_FIRM”、“POLICY_HOLDER_NAME”、“POLICY_NUMBER”。

<!–

创建 Amazon Comprehend 自定义分类器和自定义实体(NER)终端节点

Amazon Comprehend 的终端节点可使您的自定义模型在实时分类中可用。创建终端节点后,您可以根据业务需求对其进行更改。例如,您可以监视终端节点利用率,并应用自动缩放以自动设置终端节点供给以适应您的容量需求。您可以从单个视图管理所有终端节点,并且当您不再需要终端节点时,可以删除它以节省成本。Amazon Comprehend 支持同步和异步选项,如果您的使用情况不需要实时分类,您可以将批处理作业提交给 Amazon Comprehend 进行异步数据分类。

对于这个使用情况,您可以创建一个终端节点,以供实时分析使用您的自定义模型。

为满足您的文本处理需求,您可为终端节点分配推理单元,每个单元允许每秒传输 100 个字符。您随后可以调整传输能力。

创建并部署一个 Lambda 函数以进行提取后的增强

提取后的 Lambda 函数允许您实现逻辑,以处理 Amazon Kendra 从摄取的文档中提取的文本。我们配置的提取后函数实现了调用 Amazon Comprehend 来检测自定义实体并对文本进行自定义分类的代码,并将其用于更新文档元数据,该元数据在 Amazon Kendra 搜索中显示为面页。函数代码嵌入在笔记本中。PostExtractionLambda 代码的工作原理如下:

  • 将页面文本拆分为不超过 comprehend detect_entities API 的最大字节长度限制的章节。(请参见 限制)。注意,该脚本使用简单的字符长度拆分算法以简化问题 – 产品实际使用情况应基于 UTF8 字节长度实现重叠或句子边界拆分。
  • 对于文本的每个章节,调用 Comprehend 实时终端节点以检测以下实体类型:[“PAYOUT”, “INSURANCE_COMPANY”, “LAW_FIRM”, “POLICY_HOLDER_NAME”, “POLICY_NUMBER”, “INSURANCE_TYPE”]。
  • 过滤掉低于置信度得分阈值的检测到的实体。我们使用 0.50 作为阈值,这意味着只有置信度为 50% 或更高的实体将被使用。根据使用情况和需求可以进行调整。
  • 跟踪每个实体的频率计数。
  • 基于出现频率,仅选择每个页面中前 N (10) 个唯一实体。
  • 对于文档分类,多类别分类器仅为每个文档分配一个类别。在此 Lambda 函数中,文档将被分类为车险、住宅保险或人寿保险。

# 使用 Comprehend 读取输入文本并检测其中的实体
def entity_detector(doc_text):
    # 存储实体的 JSON 对象列表
    entity_data = dict()
    # 被识别为类别的观察到的文本字符串列表
    category_text = dict()
    # 每个文本字符串的频率
    text_frequency = dict()
    for et in categories:
        entity_data[et] = []
        category_text[et] = []
        text_frequency[et] = dict()
        # 循环遍历以解决文本限制的 detect_entities_v2 调用
        for i in range(0, len(doc_text), compre_text_size):
            try:
                entities = compre.detect_entities(Text=doc_text[i:i+compre_text_size], LanguageCode='en', EndpointArn=endpoint_custom_entity)
            except Exception as e:
                logger.info("Exiting - detect_entities_v2 terminated with exception")
                return []
            for e in entities["Entities"]:
                # 对于每个被识别的实体,只保留那些具有高于 min_score 的置信度得分、可打印的,不含引号,并且以前未出现过的字符串
                if ((e["Score"] > min_score) and (e["Text"].isprintable()) and (not '\"' in e["Text"]) and (not e["Text"].upper() in category_text[e["Type"]])):
                    # 将文本附加到 entity_data 以用作 Kendra 自定义属性
                    entity_data[e["Type"]].append(e["Text"])
                    # 追踪文本的大写形式,以便我们不会将以不同大小写写的相同文本作为不同的文本处理
                    category_text[e["Type"]].append(e["Text"].upper())
                    # 追踪文本的频率,以便我们可以使用发生频率最高的文本
                    text_frequency[e["Type"]][e["Text"].upper()] = 1
                elif (e["Text"].upper() in category_text[e["Type"]]):
                    # 追踪文本的频率,以便我们可以使用发生频率最高的文本
                    text_frequency[e["Type"]][e["Text"].upper()] += 1
    # 要填充的 Kendra 属性元数据的 JSON 对象
    metadata = dict()
    for et in categories:
        metadata[et] = []
        # 获取具有最高发生频率的 elimit 数量的已识别文本字符串
        el = [pair[0] for pair in sorted(text_frequency[et].items(), key=lambda item: item[1], reverse=True)][0:elimit]
        for d in entity_data[et]:
            if (d.upper() in el):
                metadata[et].append(d)
    for md in metadata:
        metaUL.append({
            "name": md,
            "value": {
                "stringListValue": metadata[md]
            }
        })
    return metaUL

请注意,截至本文撰写时,CDE仅支持同步调用,或者如果需要异步调用,则需要使用显式等待循环。对于后期提取的Lambda,最长执行时间为1分钟。Lambda的自定义逻辑可以根据适合您的使用案例的要求进行更改。

创建和填充Amazon Kendra索引

在此步骤中,我们将数据传入Amazon Kendra索引,并使其可供用户进行搜索。在传入过程中,我们将使用在上一步骤中创建的Lambda函数作为后期提取步骤,Lambda函数将调用自定义分类和自定义实体识别(NER)端点以创建自定义元数据字段。

实施此解决方案的高级步骤如下:

  1. 创建Amazon Kendra索引
  2. 创建Amazon Kendra数据源 – 可以使用不同的数据源来导入数据集。在这篇文章中,我们使用的是S3存储桶。
  3. 创建Facets­ Law_Firm, Payout, Insurance_Company, Policy_Number, Policy_Holder_Name, Insurance_Type,其类型为‘STRING_LIST_VALUE’。
  4. 创建Kendra CDE并将其指向先前创建的后期提取Lambda函数。
  5. 执行同步过程以导入数据集。

完成后,您可以使用Kendra CDE和后期提取lambda填充索引并根据自定义实体类型和自定义分类进行搜索过滤。

使用提取的实体在Kendra中进行搜索过滤

现在索引已经填充完毕且可以使用。在Amazon Kendra控制台中,选择数据管理下的搜索索引内容并执行以下操作。

查询以下内容:保险由于递交迟滞而失败的列表?

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第6张

结果显示了来自策略类型的答案 – HOME INSURANCE,并将text_18text_14作为前几个结果。

选择左侧的“筛选搜索结果”。然后,您将看到使用Comprehend提取的所有实体类型和分类值,并针对每个实体值和分类值显示匹配文档的数量。

使用由Amazon Comprehend创建的自定义元数据,通过Amazon Kendra智能地处理保险理赔事务 四海 第7张

INSURANCE_TYPE下选择“Auto-Insurance”,然后您将从text_25文件获取答案。

请注意,您的结果可能会与屏幕截图中显示的结果略有不同。

尝试使用您自己的查询进行搜索,并观察Amazon Comprehend识别的实体和文档分类如何迅速让您:

  • 查看搜索结果在各个类别中的分布情况。
  • 通过过滤任何实体/分类值来缩小搜索范围。

清理

在尝试搜索并使用Github存储库中提供的笔记本之后,请删除在您的AWS账户中为该基础设施提供的资源,以避免任何不必要的费用。您可以在笔记本中运行清理单元格。或者,您也可以通过AWS控制台手动删除资源:

  • Amazon Kendra索引
  • Comprehend自定义分类器和自定义实体识别(NER)端点
  • Comprehend自定义分类器和自定义实体识别(NER)自定义模型
  • Lambda函数
  • S3存储桶
  • IAM角色和策略

结论

在本文章中,我们展示了亚马逊理解自定义实体和自定义分类器的功能,使亚马逊肯德拉搜索功能能够帮助最终用户在结构化/非结构化数据上进行更好的搜索。亚马逊理解的自定义实体和自定义分类器使其非常适用于不同的用例和各种特定领域的数据。有关如何使用亚马逊理解的更多信息,请参阅亚马逊理解开发资源,有关亚马逊肯德拉的信息,请参阅亚马逊肯德拉开发资源

针对您的用例尝试一下这个解决方案。我们邀请您在评论区留下您的反馈。

Leave a Reply

Your email address will not be published. Required fields are marked *