亚马逊AWS官方博客

利用 Amazon Textract 和 Amazon Comprehend 构建由 NLP 提供支持的搜索索引

Origianl URL :https://aws.amazon.com/blogs/machine-learning/building-an-nlp-powered-search-index-with-amazon-textract-and-amazon-comprehend/

所有行业的公司组织都拥有大量的物理文档。如果文档中包含表格、表单、段落和复选框之类的格式,则难以从扫描的文档中提取文本。这些公司已使用光学字符辨识 (OCR) 技术解决了这些问题,但是,它需要使用表单提取和自定义工作流模板。

提取和分析图像或 PDF 中的文本是一个典型的机器学习 (ML) 和自然语言处理 (NLP) 问题。从文档中提取内容时,您需要维持整体环境并以可读取和可搜索的格式存储信息。创建复杂的算法需要使用大量训练数据和计算资源。构建和训练完美的机器学习模型可能非常昂贵并且费时。

本博客将引导您使用 Amazon Textract 和 Amazon Comprehend 作为存储和分析扫描图像文档的自动化内容处理管道,以此创建由 NLP 提供支持的搜索索引。有关 PDF 文档的处理,请参阅 AWS 示例 Github 存储库,以使用文本提取器

本解决方案使用无服务器技术和托管服务来获得可扩展性和成本有效性。本解决方案中使用的服务包括:

架构

  1. 用户上传 OCR 图像,以便在 Amazon S3 上进行分析。
  2. Amazon S3 上传触发器 AWS Lambda。
  3. AWS Lambda 调用 Amazon Textract 以提取图像中的文本。
  4. AWS Lambda 向 Amazon Comprehend 发送从图像中提取的文本,以便进行实体和主要词提取。
  5. 此数据将被编制索引并加载到 Amazon Elasticsearch 中。
  6. Kibana 获取索引数据。
  7. 用户登录到 Amazon Cognito。
  8. Amazon Cognito 对至 Kibana 的访问进行身份验证,以搜索文档。

使用 AWS CloudFormation 部署架构

第一步是使用 AWS CloudFormation 模板预置必要的 IAM 角色和 AWS Lambda 函数,以便与 Amazon S3、AWS Lambda、Amazon Textract 和 Amazon Comprehend API 进行交互。

  1. 在 US-East-1(弗吉尼亚北部)区域启动 AWS CloudFormation 模板:
  2. 您将会在创建堆栈界面上看到以下信息:
    堆栈名称:document-search
    CognitoAdminEmail:abc@amazon.com
    域名:documentsearchapp。使用您的电子邮件地址编辑 CognitoAdminEmail。您将会收到一封包含临时 Kibana 凭据的电子邮件。
  3. 向下滚动至功能并选中两个复选框,以确认 AWS CloudFormation 将创建 IAM 资源。有关更多信息,请参阅 AWS IAM 资源
  4. 向下滚动至转换并选择创建更改集AWS CloudFormation 模板使用 AWS SAM,这简化了定义无服务器应用程序的函数和 API 以及环境变量之类的服务功能的流程。在 AWS CloudFormation 模板中部署 AWS SAM 模板时,您需要执行转换步骤以转换 AWS SAM 模板。
  5. 等待几秒,以便更改集完成计算更改。您的界面应如下所示,其中包括“操作”、“逻辑 ID”、“物理 ID”、“资源类型”和“替换”。最后,单击执行按钮,让 AWS CloudFormation 在后端启动资源。
  6. 在以下堆栈详细信息页面的屏幕截图中,CloudFormation 堆栈的状态显示为 CREATE_IN_PROGRESS。等待 20 分钟,以便状态更改为 CREATE_COMPLETE。在输出中,复制 S3KeyPhraseBucketKibanaLoginURL 的值。

将文档上传至 S3 存储桶

要将文档上传至您在上一步中新建的 S3 存储桶,请完成以下操作:

  1. 单击您从 CloudFormation 输出中复制的 Amazon S3 存储桶 URL。
  2. GitHub 存储库下载示例数据集 demo-data.zip。此数据集包含多个图像,这些图像中包含表单、含有段落的扫描图像和两栏式文档。
  3. 解压缩数据。
  4. 将演示数据文件夹中的文件上传至以 document-search-blog-s3-<Random string> 开头的 Amazon S3 存储桶。

有关更多信息,请参阅如何将文件和文件夹上传至 S3 存储桶?

上传完成之后,您可以在 S3 存储桶中看到以下四个图像文件:Employment_application.JPG、expense.png、simple-document-image.jpg 和 two-column-image.jpg。

将数据上传至 S3 存储桶将会触发调用 Lambda 函数的 Lambda S3 事件通知。您可以在高级设置 -> 事件下的 Amazon S3 存储桶属性中查找配置的事件触发器。您将会看到以 document-search-blog-ComprehendKeyPhraseAnalysis-<Random string> 开头的 Lambda 函数。此 Lambda 函数将执行以下操作:

  • 使用 Amazon Textract 从图像中提取文本。
  • 使用 Amazon Comprehend 执行关键词提取。
  • 使用 Amazon ES 搜索文本。

以下代码示例将使用 Amazon Textract 从图像中提取文本:

textract = boto3.client(

service_name='textract',

region_name=region)

#Main lambda handler
def lambda_handler(event, context):
    # Get the object from the lambda event and show its content type
       bucket = event['Records'][0]['s3']['bucket']['name']
       key = unquote_plus(event['Records'][0]['s3']['object']['key'])
       s3.Bucket(bucket).download_file(Key=key,Filename='/tmp/{}')
# Read document content and extract text using Textract
with open('/tmp/{}', 'rb') as document:
    imageBytes = bytearray(document.read())
response=textract.analyze_document(Document={'Bytes':imageBytes},FeatureTypes=["TABLES", "FORMS"])

以下代码示例将使用 Amazon Comprehend 提取关键词:

#Initializing comprehend
comprehend = boto3.client(service_name='comprehend', region_name=region)
#Detect Keyphrases and Entities
keyphrase_response = comprehend.detect_key_phrases(Text=text, LanguageCode='en')
detect_entity= comprehend.detect_entities(Text=text, LanguageCode='en')

您可以对从 Amazon Textract 和 Amazon Comprehend 接收到的响应编制索引,并将其加载到 Amazon ES 中,以创建由 NLP 提供支持的搜索索引。请参阅以下代码:

 #Connection to Elasticsearch
         
        es=connectES()
#Saving Index to Elastocsearch endpoint in primary lambda handler    

        es.index(index="document", doc_type="_doc", body=searchdata)

有关更多信息,请参阅 GitHub 存储库

使用 Kibana 可视化和搜索文档

要使用 Kibana 可视化和搜索文档,请执行以下步骤。

  1. 在您的收件箱中找到主题行为 “临时密码”的电子邮件。 如果您在收件箱中未看到此电子邮件,请检查垃圾邮件文件夹。
  2. 转至从 AWS CloudFormation 输出复制的 Kibana 登录 URL。
  3. 使用您的电子邮件地址作为用户名和确认电子邮件中的临时密码作为登录。 单击登录

    注意:如果在部署 AWS CloudFormation 时未收到电子邮件或者在丢失了该电子邮件,请选择登录
  4. 在下一个页面上,输入新密码。
  5. 在 Kibana 登陆页的菜单中,选择发现
  6. 管理/Kibana 页面上,您将看到步骤 1/2:定义索引模式,对于索引模式,输入 document*。此时将显示“成功! 您的索引模式匹配 1 个索引”。选择下一步。单击创建索引模式
    几秒之后,您可以看到文档索引页面。
  7. 再次从菜单中选择发现。在下面的屏幕截图中,您可以看到文档属性。
    s3link:s3 location of uploaded documents in S3,
    KeyPhrases: Key phrases from the documents uploaded in S3,
    Entity: it can be DATE, PERSON, ORGANIZATION etc,
    text: raw text from documents,
    table:tables extracted from documents, and forms:form extracted from documents 

  8. 要查看每个条目的特定字段,请将鼠标悬停在左侧栏中的字段上,然后单击添加

这会将字段移至选定字段菜单。Kibana 仪表板将以易读格式表示数据。以下屏幕截图所示为将 Entity.DATE、Entity.Location、Entity.PERSON、S3link 和文本添加到选定字段菜单之后的视图:

要查看原始文档,请选择 s3link

注意:此外,您还可以添加表单和表格,以查看和搜索表格和表单。

小结

本博文演示了如何提取和处理图像文档中的数据并将其可视化,以创建可指导行动的见解。

处理扫描图像文档可以帮助您获得大量数据,从而为您带来新的业务前景。借助诸如 Amazon Textract 和 Amazon Comprehend 之类的托管机器学习服务,您可以从先前未发现的数据中获得见解。例如,您可以构建自定义应用程序,以获取扫描的法律文档、购买收据和采购订单中的文本。

每一个行业内的数据均具有相关性。无论您是处理图像还是 PDF 中的数据,AWS 均可简化数据提取和分析,同时保持整体 IT 成本的可管理性。

衷心希望这篇博文能够为您提供帮助,或者让您获得解决问题的灵感! 您可以在 GitHub 存储库上找到本解决方案的代码,以便使用和扩展。欢迎投稿!

 


 

本篇作者

Saurabh Shrivastava

Saurabh Shrivastava 是合作伙伴解决方案架构师和大数据专家,与全球多家系统集成商开展合作。他与 AWS 合作伙伴和客户合作,为他们提供有关在混合和 AWS 环境中构建可扩展架构的指导意见。他喜欢与家人一起进行户外活动,以及去新的地方旅游,探索新的文化

 

Mona

Mona 是一位人工智能/机器学习专业解决方案架构师,与 AWS 公共部门团队开展合作.她与 AWS 客户携手合作,帮助他们大规模采用机器学习技术。闲暇时间,她喜欢画画和烹饪。