应用人工智能与自然语言处理研讨会-全-

应用人工智能与自然语言处理研讨会(全)

原文:zh.annas-archive.org/md5/937ade024ec74c99358abb3abc697822

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

关于本书

你是否对像Alexa和Siri这样的应用感兴趣,它们如何在几秒钟内准确处理信息并返回准确的结果?你是否在寻找一本实用的指南,教你如何构建能够改变人工智能世界的智能应用?《应用人工智能与自然语言处理工作坊》将带你进行一次实践之旅,在那里你将学习如何使用亚马逊网络服务AWS)构建人工智能AI)和自然语言处理NLP)应用。

从人工智能和机器学习的介绍开始,本书将解释Amazon S3,或称Amazon Simple Storage Service的工作原理。然后,你将集成AI与AWS来构建无服务器服务,并使用亚马逊的NLP服务Comprehend对文档进行文本分析。随着你的进步,本书将帮助你掌握主题建模,以从一组未知主题的文档中提取和分析共同主题。你还将与Amazon Lex合作,创建和定制用于任务自动化的聊天机器人,并使用Amazon Rekognition检测图像中的对象、场景和文本。

《应用人工智能与自然语言处理工作坊》结束时,你将具备构建具有AWS的可扩展智能应用所需的知识和技能。

听众

如果你是一位希望探索AWS人工智能和机器学习能力的机器学习爱好者、数据科学家或程序员,这本书适合你。虽然不是必需的,但基本了解AI和NLP将有助于快速掌握关键主题。

关于章节

第一章AWS简介,介绍了AWS界面。你将学习如何使用亚马逊的简单存储服务,以及使用亚马逊Comprehend API测试NLP接口。

第二章使用自然语言处理分析文档和文本,介绍了AWS AI服务集和新兴的计算范式——无服务器计算。然后,你将应用NLP和亚马逊Comprehend服务来分析文档。

第三章主题建模与主题提取,描述了主题建模分析的基础,你将学习如何使用Amazon Comprehend进行主题建模来提取和分析共同主题。

第四章对话式人工智能,讨论了设计对话式人工智能的最佳实践,然后继续展示如何使用Amazon Lex开发聊天机器人。

第五章在聊天机器人中使用语音,教你亚马逊Connect的基础知识。你将为语音交互编程聊天机器人,并使用亚马逊Connect和你的电话号码创建一个个人呼叫中心,以与你的机器人互动。

第6章计算机视觉和图像处理,向您介绍使用计算机视觉进行图像分析的Rekognition服务。您将学习如何分析人脸和识别图像中的名人。您还将能够比较不同图像中的面孔,以查看它们彼此之间有多接近。

习惯用法

文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter标签以如下方式显示:“在此,所选的存储桶名称为known-tm-analysis,但您需要创建一个唯一的名称。”

代码块设置如下:

filename = str(text_file_obj['s3']['object']['key'])
print("filename: ", filename)

您在屏幕上看到的单词,例如在菜单或对话框中,也以这种方式出现在文本中:“从屏幕左侧的菜单面板中选择路由菜单。”

新术语和重要单词以如下方式显示:“亚马逊Comprehend使用的机器学习算法来执行主题建模被称为潜在狄利克雷分配LDA)。”

代码展示

涵盖多行的代码行使用反斜杠(\)分隔。当代码执行时,Python将忽略反斜杠,并将下一行的代码视为当前行的直接延续。

例如:

history = model.fit(X, y, epochs=100, batch_size=5, verbose=1, \
                    validation_split=0.2, shuffle=False)

为了帮助解释特定的逻辑部分,代码中添加了注释。单行注释使用#符号表示,如下所示:

# Print the sizes of the dataset
print("Number of Examples in the Dataset = ", X.shape[0])
print("Number of Features for each example = ", X.shape[1])

多行注释由三个引号包围,如下所示:

"""
Define a seed for the random number generator to ensure the 
result will be reproducible
"""
seed = 1
np.random.seed(seed)
random.set_seed(seed)

设置您的环境

在我们详细探索这本书之前,我们需要设置特定的软件和工具。在以下部分,我们将看到如何做到这一点。

软件要求

您还需要提前安装以下软件:

  1. 操作系统:Windows 7 SP1 64位、Windows 8.1 64位或Windows 10 64位、macOS或Linux

  2. 浏览器:最新版本的Google Chrome

  3. AWS免费层账户

  4. Python 3.6或更高版本

  5. Jupyter Notebook

安装和设置

在您开始这本书之前,您需要一个AWS账户。您还需要设置AWS 命令行界面CLI),相关步骤如下。您还需要Python 3.6或更高版本、pip以及AWS Rekognition账户来完成这本书。

AWS账户

对于AWS免费层账户,您需要一个个人电子邮件地址、一张信用卡或借记卡,以及一部可以接收短信的手机,以便您验证您的账户。要创建新账户,请点击此链接:https://aws.amazon.com/free/.

关于AWS区域的说明

AWS服务器分布在全球AWS所说的区域中。自从AWS开始以来,区域数量已经增长,您可以在https://aws.amazon.com/about-aws/global-infrastructure/regions_az/找到所有区域的列表。当您创建AWS账户时,您还需要选择一个区域。您可以通过访问aws.amazon.com并选择AWS管理控制台来找到您的区域:

![图 0.1:我的账户下拉菜单

![img/B16061_00_01.jpg]

图 0.1:我的账户下拉菜单

在 AWS 管理控制台中,你的区域将显示在右上角。你可以点击它并更改区域:

![图 0.2:AWS 区域列表

![img/B16061_00_02.jpg]

图 0.2:AWS 区域列表

改变区域的一个原因是因为并非所有 AWS 服务都在所有区域可用。在 https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/ 的区域表中列出了每个区域当前可用的服务。因此,如果你想要访问的服务在你的区域不可用,你可以更改你的区域。但请注意区域之间(如果有)的收费差异。此外,你在一个区域创建的工件可能不在另一个区域可用,例如 S3 存储桶。如果你在想,亚马逊不自动使 S3 数据跨区域可用的一个原因是合规性和法规。你必须明确复制或重新创建 S3 存储桶和文件。虽然一开始管理 AWS 服务和区域可能看起来很繁琐,但很快就会习惯。正如我们提到的,亚马逊这样做有原因。

注意

根据你的位置,仅通过更改区域可能无法访问 AWS 服务。例如,Amazon Connect 并非在所有地方都可用,仅通过从下拉菜单更改区域并不能使用 Amazon Connect,因为这涉及到本地号码分配。为了使用 Amazon Connect,我们需要在注册 AWS 时指定 Amazon Connect 可用的地址。在撰写本书时(2020 年 4 月),Amazon Connect 可在美国、英国、澳大利亚、日本、德国和新加坡使用。但好消息是亚马逊正在不断扩展其服务。所以,当你阅读这本书的时候,Amazon Connect 可能会在你所在的地方可用。

AWS CLI 设置

按照此 URL 的说明安装 AWS CLI(版本 2):https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html。AWS 文档描述了如何在各种操作系统上安装 CLI。要验证安装是否成功,请打开命令提示符并输入 aws --version

AWS CLI 的配置和凭证文件

AWS CLI 文档清楚地描述了配置和凭证文件设置。更多信息,请访问 https://docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html

Amazon Rekognition 账户

您需要创建一个新的Amazon Rekognition免费层账户,客户可以使用该账户在前12个月内每月免费分析高达5,000张图片。要创建免费账户,请访问https://aws.amazon.com/rekognition/

注意

界面和结果可能与章节中显示的图片略有不同,因为亚马逊定期更新和简化其界面并重新训练模型。

安装Python和Anaconda

以下部分将帮助您在Windows、macOS和Linux系统上安装Python和Anaconda。

在Windows上安装Python和Anaconda

在Windows上安装Python的步骤如下:

  1. 在官方安装页面https://www.anaconda.com/distribution/#windows上找到您想要的Anaconda版本。

  2. 确保您从下载页面选择Python 3.7。

  3. 确保您安装了适合您计算机系统的正确架构;即32位或64位。您可以在操作系统的系统属性窗口中找到此信息。

  4. 下载安装程序后,只需双击文件并遵循屏幕上的用户友好提示。

在Linux上安装Python和Anaconda

要在Linux上安装Python,您有几个不错的选择:

  1. 打开命令提示符,通过运行python3 --version来验证Python 3是否已经安装。

  2. 要安装Python 3,请运行以下命令:

    sudo apt-get update
    sudo apt-get install python3.7
    
  3. 如果您遇到问题,网上有众多资源可以帮助您解决问题。

  4. 您也可以使用Anaconda安装Python。通过从https://www.anaconda.com/distribution/#linux下载安装程序并按照说明进行操作来安装Anaconda for Linux。

在macOS上安装Python和Anaconda

与Linux类似,您在Mac上安装Python有几个方法。要在macOS上安装Python,请按照以下步骤操作:

  1. 通过按CMD + Spacebar打开Mac的终端,在打开的搜索框中输入terminal,然后按Enter

  2. 通过在命令行中运行xcode-select --install来安装Xcode。

  3. 安装Python 3的最简单方法是使用Homebrew,通过在命令行中运行ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"来安装。

  4. 将Homebrew添加到您的$PATH环境变量中。通过在命令行中运行sudo nano ~/.profile并插入export PATH="/usr/local/opt/python/libexec/bin:$PATH"在底部来打开您的配置文件。

  5. 最后一步是安装Python。在命令行中,运行brew install python

  6. 同样,您也可以通过Anaconda安装程序安装Python,该安装程序可在https://www.anaconda.com/distribution/#macos找到。

Project Jupyter

Project Jupyter 是一个开源的免费软件,它允许你从特殊的笔记本中交互式地运行用 Python 编写的代码和一些其他语言,类似于浏览器界面。它于 2014 年从 IPython 项目中诞生,并已成为整个数据科学工作者的默认选择。

要安装 Jupyter Notebook,请访问:https://jupyter.org/install

https://jupyterlab.readthedocs.io/en/stable/getting_started/starting.html,你可以找到启动 Jupyter Notebook 服务器所需的所有详细信息。在这本书中,我们使用经典笔记本界面。

通常,我们使用 jupyter notebook 命令从命令行启动笔记本。

在以下 安装代码包 部分中,从你下载代码文件的目录启动笔记本。

例如,在我们的案例中,我们将文件安装在了以下目录 /Users/ksankar/Documents/aws_book/Artificial-Intelligence-and-Natural-Language-Processing-with-AWS.

在 CLI 中,输入 cd /Users/ksankar/Documents/aws_book/Artificial-Intelligence-and-Natural-Language-Processing-with-AWS 然后输入 jupyter notebook 命令。Jupyter 服务器将启动,你将看到 Jupyter 浏览器控制台:

![图 0.3:Jupyter 浏览器控制台

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_00_03.jpg)

图 0.3:Jupyter 浏览器控制台

一旦你启动了 Jupyter 服务器,点击 New 并选择 Python 3。一个新标签页将打开,一个新的空笔记本。重命名 Jupyter 文件:

![图 0.4:Jupyter 服务器界面

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_00_04.jpg)

图 0.4:Jupyter 服务器界面

Jupyter 笔记本的主要构建块是单元格。有两种类型的单元格:In(代表输入)和Out(代表输出)。你可以在 In 单元格中编写代码、普通文本和 Markdown,按 Shift + Enter(或 Shift + Return),该特定 In 单元格中编写的代码将被执行。结果将在一个 Out 单元格中显示,你将进入一个新的 In 单元格,准备编写下一块代码。一旦你习惯了这种界面,你将逐渐发现它提供的强大功能和灵活性。

当你开始一个新的单元格时,默认情况下,它假定你将在其中编写代码。然而,如果你想写文本,你必须更改类型。你可以使用以下键序列来完成:Esc | M | Enter:

![图 0.5:Jupyter Notebook

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_00_05.jpg)

图 0.5:Jupyter Notebook

当你写完一些文本后,使用 Shift + Enter 执行它。与代码单元格的情况不同,编译后的 Markdown 的结果将在与 In 单元格相同的位置显示。

要获取 Jupyter 中所有便捷的快捷键的“速查表”,请访问https://gist.github.com/kidpixo/f4318f8c8143adee5b40。有了这个基本介绍,我们就准备好开始一段激动人心且富有启发的旅程了。

安装库

pip 随 Anaconda 预先安装。一旦 Anaconda 在您的机器上安装,所有必需的库都可以使用 pip 安装,例如,pip install numpy。或者,您也可以使用 pip install –r requirements.txt 命令安装所有必需的库。您可以在https://packt.live/30ddspf找到 requirements.txt 文件。

练习和活动将在 Jupyter 笔记本中执行。Jupyter 是一个 Python 库,可以像其他 Python 库一样安装——即使用 pip install jupyter,但幸运的是,它随 Anaconda 预先安装。要打开笔记本,只需在终端或命令提示符中运行 jupyter notebook 命令即可。

访问代码文件

您可以在https://packt.live/2O67hxH找到这本书的完整代码文件。

如果您在安装过程中遇到任何问题或疑问,请通过电子邮件发送给我们workshops@packt.com

第一章:1. AWS 简介

概述

在本章中,我们将从云计算人工智能AI)和机器学习ML)的基本概念开始。这些是我们将在整本书中工作的基础元素。本章的指导说明将使你具备使用亚马逊简单存储服务(S3)存储和检索数据所需的技能,同时你将学习这项技术的核心概念。接下来,你将通过管理控制台和命令行界面CLI)导入和导出文本数据来应用你的S3知识。到本章结束时,你将能够自信地使用管理控制台和CLI,以便你可以测试AI和ML服务。

简介

我们正处于一个前所未有的计算能力时代——无服务器计算具有自主功能,可以在几秒钟内弹性地从零扩展到一百万用户,然后再回到零,创新的智能机器人框架可以存在于云端的接触中心中,我们可以通过少量的配置启动它,以及从图像、表格和扫描的文档(如病历、商业和税务文件)中提取文本的能力。

当然,我们谈论的是触手可及的云服务,具体来说是从亚马逊提供的。2004年,亚马逊首次将云计算作为一项服务推出,现在(据《福布斯》报道)云市场规模已超过300亿美元,年增长率为30-50%。越来越多的人更愿意在云端进行计算。

那么,什么是云计算呢?它是一组计算服务,你可以根据需要和支付能力按需使用和支付。因此,企业从自己的托管服务转向云端。除此之外,你不仅得到了一种成本效益的计算方式,而且还能获得越来越多样化的这些服务。

虽然亚马逊提供了大量的云服务,但在本书中,我们将使用亚马逊网络服务AWS)的人工智能AI)和机器学习ML)功能。在这个过程中,我们还将使用AWS Lambda进行无服务器计算,AWS简单存储服务(S3),以及AWS API网关进行网络和内容分发。

本章将向您介绍AWS界面,并教会您如何使用亚马逊简单存储服务(S3)存储和检索数据。然后,你将通过管理控制台和CLI导入和导出文本数据来应用你的S3知识。最后,你将学习如何定位和测试AI和ML服务。

在后面的章节中,你将有机会应用自然语言处理NLP)技术来分析文档,编写无服务器计算程序,使用AI/ML服务进行主题和主题提取,构建自己的完全有能力的客户服务中心,拥有自己的电话号码,开发在您的客户服务中心中接听电话的机器人,最后,使用机器学习编程图像分析以从图像(如街牌)中提取文本并执行面部识别。总的来说,这将是一次有趣的旅程,我们将最终掌握一个庞大的AI和ML基础设施。

AWS有何特别之处?

今天,有许多云服务提供商,市场份额分布如下:根据Canalys的分析(https://www.canalys.com/static/press_release/2020/Canalys---Cloud-market-share-Q4-2019-and-full-year-2019.pdf),截至2019年第四季度,AWS是领先的供应商,占据了近三分之一的整体公共云基础设施市场(32%),领先于微软(18%)、谷歌(6%)和阿里巴巴(5%)。

这些数字因来源而异,并且在未来可能会发生变化,但所有人都同意,目前亚马逊是最大的提供商。其中一个原因是亚马逊提供了一系列非常广泛的云服务。事实上,他们的竞争优势之一正是这一点:一个非常广泛和深入的云计算生态系统。例如,在机器学习领域,亚马逊有成千上万的用例,其宣称的目标是AWS上提供所有可想象到的机器学习服务。这解释了为什么我们专注于在AWS上做机器学习。

什么是机器学习?

机器学习和人工智能是相辅相成的。机器学习是基于对世界及其历史的了解来预测现实世界结果的艺术和科学。你构建一个模型,让你能够预测未来。该模型基于一个公式或一个制定这种预测的过程。模型是通过数据训练的。

人工智能是一个更广泛的科学领域,它包括机器学习(ML)以及模仿人类行为和能力的所有方式。然而,人们对这些术语的使用方式因人而异,这取决于你询问的对象。人们也倾向于使用当前最流行的术语,这主要是为了搜索引擎优化。在这本书中,我们将自由地交替使用这两个术语。

机器学习在当今世界是必不可少的,因为它是所有行业竞争和运营数据策略的一个组成部分。更具体地说,机器学习使NLP的洞察力能够驱动聊天机器人,机器学习的洞察力在金融行业中得到应用;而机器学习应用允许高效的在线推荐引擎,例如Facebook上的朋友建议,Netflix展示你可能喜欢的电影,以及亚马逊上更多的考虑事项。

什么是人工智能?

人工智能是机器展示的智能。更具体地说,它指的是任何感知其环境并采取行动以增加成功实现其目标机会的设备。当代的例子包括理解人类语言、在最高水平的战略游戏中竞争(如象棋和国际象棋),以及自动驾驶汽车。

人工智能很重要,因为它为现有产品增加了智能。目前使用的产品将随着人工智能功能得到进一步改进;例如,Siri 被添加到新一代的苹果产品中。会话聊天机器人可以与大量数据结合,以改善家庭和办公室的技术。

在本章中,我们将向您介绍 AWS 上的机器学习之旅的第一批 AWS 服务。只要可能,我们将坚持使用 AWS 的免费层。您将获得一年的免费层,并且可用的计算资源数量有限。愿意投资一些美元使用常规 AWS 账户进行学习的读者会发现这笔钱花得很值。另一个选择是使用打包的实验室,如 Qwiklabs,它允许您随意进行实验室,并且增加了关闭实验室的便利性,这样您在机器运行时离开时不会产生意外费用。

什么是 Amazon S3?

S3 是一个在线云对象存储和检索服务。数据不再与服务器相关联,S3 存储是服务器独立的,可以通过互联网访问。存储在 S3 中的数据使用可通过互联网(HTTPS)访问的 应用程序编程接口API)作为对象进行管理。

使用 S3 的好处如下:

  • Amazon S3 在最大的全球云基础设施上运行,以提供 99.99% 的耐用性。

  • 它提供了最广泛的数据传输选项。

  • 它允许您在不将数据移动到单独的分析系统的情况下运行大数据分析。

  • 它支持安全标准和合规性证书。

  • 它提供了一套灵活的存储管理和行政功能。

    注意

    更多信息,请访问 https://aws.amazon.com/s3/

为什么使用 S3?

S3 是一个存储和检索文件的场所。它适用于存储静态内容,如文本文件、图像、音频文件和视频文件。例如,如果网站仅由 HTML 和图像组成,S3 可以用作静态网页服务器。网站可以通过 FTP 客户端连接来提供静态文件。此外,S3 还可以用于存储用户生成的图像和文本文件。

然而,S3 最重要的两个应用如下:

  • 要存储来自网页或移动应用的静态数据

  • 要实现大数据分析

它可以很容易地与额外的 AWS ML 和基础设施服务一起使用。例如,导入到 Amazon S3 的文本文档可以通过在 AWS Lambda 函数中运行的代码进行总结,该函数使用 AWS Comprehend 进行分析。我们将在第 2 章“使用自然语言处理分析文档和文本”和第 3 章“主题建模和主题提取”中介绍 AWS Lambda 和 AWS Comprehend。

在 AWS 上使用 S3 的工作基础

访问 S3 的第一步是创建一个 AWS 免费层账户,该账户提供访问 AWS 管理控制台。AWS 管理控制台是一个网络应用程序,提供了一种访问所有 AWS 强大存储和 ML/AI 服务的途径。

第二步是了解访问级别。AWS 定义了身份和访问管理IAM)。相同的电子邮件/密码用于访问 IAM。

AWS 免费层账户

AWS 提供了一个免费层账户(在其各自的免费使用条款内),其中包括的存储服务之一是 S3。因此,在做出大额投资之前,通过测试服务来优化您的 ML 和 AI 工作流程,您可以最大限度地节约成本并减少错误。

AWS 账户设置和导航

通常,您需要一个与亚马逊关联的 AWS 账户。有关步骤的详细描述可在 https://support.sou.edu/kb/articles/amazon-web-services-account-creation 找到。步骤可能会有所不同,因为亚马逊可能会对其流程进行更改。

一般步骤如下:

  1. 创建一个个人账户(如果需要的话;你们中的许多人可能已经是亚马逊客户了),可能还需要进行安全检查。

  2. 创建一个 AWS 账户。AWS 账户创建还需要信用卡信息。但您也可以使用信用卡代码。

  3. AWS 免费层提供为期 1 年的有限功能。详细信息请参阅 https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc

下载本书的支持材料

在本书中,您将使用 Jupyter 笔记本编程 AWS API,上传图像用于 AI 服务和文本文件到 S3,甚至为 Lambda 函数编写简短代码。这些文件和程序位于 GitHub 仓库中,https://packt.live/2O67hxH。您可以使用“下载 ZIP”按钮下载文件,然后解压缩文件:

![图 1.1:从 GitHub 下载支持文件

图片 B16061_01_01.jpg

图 1.1:从 GitHub 下载支持文件

例如,我们将文件下载到了 Documents/aws-book/The-Applied-AI-and-Natural-Language-Processing-with-AWS 目录中:

![图 1.2:GitHub 支持文件在本地目录中

图片 B16061_01_02.jpg

图 1.2:GitHub 支持文件在本地目录中

关于 Jupyter 笔记本的一些说明

本书中的某些程序使用Jupyter笔记本运行。您可以通过.ipynb文件扩展名来识别它们。如果您还没有使用过Jupyter笔记本,请参考前言中的安装和设置

将数据导入和导出到S3

AWS处理大数据的方式是通过提供AWS导入/导出服务,这使得您可以将大量数据传输到AWS。

工作原理是您将存储设备邮寄到AWS,AWS将使用亚马逊的高速网络传输这些数据。您的数据将在到达后的下一个工作日加载到AWS。一旦数据加载完成,存储设备将归还给所有者。这是一种更经济高效的数据传输方式,比通过互联网传输要快得多。

如果您需要放入S3的数据量相对较小,您可以直接从您的计算机上传。今天,随着宽带网络容量的不断增加,“小”数据量变得越来越大。我们的指导原则是1 TB。一旦超过这个量,您可能需要考虑更快地将数据放入S3的方法。其中之一是AWS导入/导出磁盘服务https://aws.amazon.com/snowball/disk/details/),您可以在AWS提供的设备上打包您的数据,并将其邮寄给他们。大量数据可以在一天或几天内加载。

S3与文件系统的区别

S3用于存储几乎任何类型的文件,因此,由于这种相似性,它可能会与传统文件系统混淆。然而,S3在几个方面与传统文件系统不同。传统文件系统中的文件夹在S3中是桶;传统文件系统中的文件在S3中是对象。S3使用对象,因为您可以在桶中存储任何数据类型(即,不仅仅是文件)。

另一个区别是对象的可访问性。存储在桶中的对象可以通过网络服务端点(例如,例如,Chrome或Firefox浏览器)访问,因此每个对象都需要一个全局唯一的名称。对象的名称限制与创建新网站时选择URL的限制类似。您需要根据相同的逻辑选择一个唯一的URL,就像您的房子有一个唯一的地址一样。

例如,如果您创建了一个名为myBucket的桶(具有公共权限设置),然后上传了一个名为pos_sentiment__leaves_of_grass.txt的文本文件到该桶,那么对象可以通过相应的子域通过网络浏览器访问。

核心S3概念

S3层次结构包括以下概念:

  • 数据存储类型:S3是一个键值存储。您提供一个唯一的键,AWS将您的数据存储为值。您使用键检索数据。

  • :键是分配给对象的名称,用于在桶内唯一标识它。桶中的所有对象都关联着一个键。

  • 对象: 对象是你存储的内容。它们是不可更新的:如果你需要更改值中的一个字节,你必须重新上传整个对象。![图 1.3:使用唯一键和 myBucket 的对象存储

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_03.jpg)

图 1.3:使用唯一键和 myBucket 的对象存储

  • : 就像文件夹一样,桶是一个存储对象的容器。桶在根级别创建,没有文件系统层次结构。更具体地说,你可以有多个桶,但不能在桶内创建子桶。桶是对象的容器,你可以控制(在桶中创建、删除和列出对象)访问权限、查看访问日志,并选择亚马逊 S3 将存储桶的地理位置。

  • us-centralap-south,根据用户的偏好,S3 存储桶的位置。可以在创建桶时选择区域。位置应根据数据将最常访问的位置来确定。总的来说,如果 S3 用于存储仅在一个特定地理区域内访问的网站文件,则特定区域选择对 S3 的影响最大。

    桶中不同形式的对象存储如下:

    ![图 1.4:对象存储

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_04.jpg)

图 1.4:对象存储

S3 操作

S3 API 非常简单,它包括以下针对相关实体的操作:

  • : 在桶中创建、删除和列出键

  • 对象: 写入、读取和删除

这里有一个例子:

![图 1.5:存储在 myBucket 中的对象

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_05.jpg)

图 1.5:存储在 myBucket 中的对象

数据复制

亚马逊在多个位于亚马逊数据中心的服务器上跨区域复制数据。数据复制的优点包括高可用性和持久性。更具体地说,当你创建一个新的对象到 S3 时,数据被保存在 S3 中;然而,更改需要跨 S3 区域进行复制。总的来说,复制可能需要一些时间,你可能会注意到由于各种复制机制导致的延迟。

删除对象后,复制可能会造成延迟,使得删除的数据在完全复制之前仍然显示。由于复制延迟,创建对象并立即尝试在对象列表中显示它可能会延迟。

REST 接口

S3 的原生接口是 表示状态传输 (REST) API。建议始终使用 HTTPS 请求执行任何 S3 操作。我们将使用两个高级接口与 S3 交互,即 AWS 管理控制台和 AWS CLI。使用 API 访问对象非常简单,包括以下针对相关实体的操作:

  • : 在桶中创建、删除或列出键

  • 对象: 写入、读取或删除

练习 1.01:使用 AWS 管理控制台创建 S3 桶

在此练习中,我们将在 AWS 上准备一个存储 ML 数据的地方。要导入文件,您需要访问 Amazon S3 控制台:

  1. 您应该已经完成了本章前面详细说明的账户设置。前往 https://aws.amazon.com/ 并点击“我的账户”然后“AWS 管理控制台”以在新浏览器标签页中打开 AWS 管理控制台:![图 1.6:通过用户账户访问 AWS 管理控制台

    ![img/B16061_01_06.jpg]

    图 1.6:通过用户账户访问 AWS 管理控制台

  2. 如下所示,在“AWS 服务”下方的搜索栏中点击:![图 1.7:搜索 AWS 服务

    ![img/B16061_01_07.jpg]

    图 1.7:搜索 AWS 服务

  3. 在搜索栏中输入S3,将出现一个自动填充的列表。然后,点击“云中的可扩展 S3 存储服务”选项:![图 1.8:选择 S3 服务

    ![img/B16061_01_08.jpg]

    图 1.8:选择 S3 服务

  4. 现在我们需要创建一个 S3 存储桶。在 S3 仪表板中,点击“创建存储桶”按钮。如果您是第一次创建存储桶,您的屏幕将看起来像这样:![图 1.9:创建存储桶

    ![img/B16061_01_09.jpg]

    图 1.9:创建存储桶

    如果您已经创建了 S3 存储桶,您的仪表板将列出您创建的所有存储桶。输入一个唯一的存储桶名称:存储桶名称必须在 S3 中是唯一的。如果您遇到命名问题,请参阅 https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html

    区域:如果默认区域自动填充,则保持默认位置。如果没有自动填充,请选择靠近您当前位置的区域。

  5. 点击“下一步”按钮继续创建存储桶:![图 1.10:创建存储桶窗口

    ![img/B16061_01_10.jpg]

    图 1.10:创建存储桶窗口

  6. S3 存储桶提供了属性选项“版本控制”、“服务器访问日志”、“标签”、“对象级日志”和“默认加密”;然而,我们不会启用它们。

  7. 您的存储桶将显示在存储桶列表中,如图所示:![图 1.11:存储桶已创建

    ![img/B16061_01_11.jpg]

图 1.11:存储桶已创建

在此练习中,我们已经在云中为我们的文件存储创建了一个位置。在下一个练习中,我们将学习如何将文件存储在此位置,并从中检索它们。

练习 1.02:使用您的 S3 存储桶导入和导出文件

在此练习中,我们将向您展示如何在 Amazon S3 上放置您的数据,以及如何从那里检索它。

按照以下步骤完成此练习:

导入文件

  1. 点击存储桶的名称以导航到存储桶:![图 1.12:导航到存储桶

    ![img/B16061_01_12.jpg]

    图 1.12:导航到存储桶

  2. 您现在位于存储桶的主页。选择“上传”:![图 1.13:将文件上传到存储桶

    ![img/B16061_01_13.jpg]

    图1.13:将文件上传到存储桶

  3. 要选择要上传的文件,点击添加文件:![图1.14:向存储桶添加新文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_14.jpg)

    图1.14:向存储桶添加新文件

  4. 我们将从https://packt.live/3e9lwfR GitHub仓库上传pos_sentiment__leaves_of_grass.txt文件。最好的方法是将其下载到你的本地磁盘。然后你可以选择文件:![图1.15:选择要上传到S3存储桶的文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_15.jpg)

    图1.15:选择要上传到S3存储桶的文件

  5. 在选择要上传的文件后,选择下一步:![图1.16:选择要上传到存储桶的文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_16.jpg)

    图1.16:选择要上传到存储桶的文件

  6. 点击下一步按钮并保留默认选项:![图1.17:上传文件时的权限页面

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_17.jpg)

    图1.17:上传文件时的权限页面

  7. 你可以为你的对象设置属性设置,例如存储类别加密元数据。然而,保留默认值,然后点击下一步按钮:![图1.18:设置属性

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_18.jpg)

    图1.18:设置属性

  8. 点击上传按钮上传文件:![图1.19:上传文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_19.jpg)

    图1.19:上传文件

  9. 你将被引导到存储桶主屏幕上的你的对象:![图1.20:上传到存储桶的文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_20.jpg)

图1.20:上传到存储桶的文件

导出文件:

  1. 选择要导出文件旁边的复选框(红色标记#1 – 请参阅以下截图)。这将填充文件信息显示屏幕。点击下载红色标记#2 – 请参阅以下截图)以检索文本文件:![图1.21:导出文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_21.jpg)

图1.21:导出文件

文件将下载,如屏幕左下角所示:

![图1.22:导出文件下载

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_22.jpg)

图1.22:导出文件下载

在这个练习中,你学习了如何将文件导入到你的Amazon S3存储桶以及从存储桶导出文件。正如你所见,由于用户界面简单,这个过程相当容易。

AWS CLI

CLI是一个基于Python(Boto)AWS SDK构建的开源工具,用于执行设置、确定调用是否按预期工作、验证状态信息等。CLI为所有AWS服务提供了另一个访问工具,包括S3。与控制台不同,CLI可以通过脚本进行自动化。

要将你的AWS账户认证到CLI,你必须创建一个配置文件以获取你的公钥和秘密密钥。接下来,你将安装并配置AWS CLI。

练习1.03:配置CLI

在这个练习中,我们将使用我们的AWS访问密钥ID和AWS秘密访问密钥配置CLI。按照以下步骤完成练习:

  1. 首先,转到 AWS 管理控制台 然后是 IAM。您可能需要登录到账户。然后,点击 用户:![图 1.23:带有突出显示用户选项的管理控制台主页

    图 B16061_01_23.jpg

    图 1.23:带有突出显示用户选项的管理控制台主页

  2. 在已登录的 AWS 管理控制台右上角,点击 我的安全凭证:![图 1.24:我的安全凭证

    图 B16061_01_24.jpg

    图 1.24:我的安全凭证

  3. 接下来,点击 继续到安全凭证:![图 1.25:安全凭证

    图 B16061_01_25.jpg

    图 1.25:安全凭证

  4. 点击 访问密钥(访问密钥 ID 和秘密访问密钥) 选项:![图 1.26:访问密钥生成

    图 B16061_01_26.jpg

    图 1.26:访问密钥生成

  5. 然后,点击 创建新访问密钥:![图 1.27:创建新的访问密钥

    图 B16061_01_27.jpg

    图 1.27:创建新的访问密钥

  6. 点击 下载密钥文件 下载密钥文件:![图 1.28:下载密钥文件

    图 B16061_01_28.jpg

    图 1.28:下载密钥文件

    包含密钥的 rootkey.csv 文件将被下载。您可以通过打开文件来查看详细信息。

    注意

    将密钥存储在安全的位置。保护您的 AWS 账户,切勿在非安全位置共享、通过电子邮件或存储密钥。AWS 代表永远不会请求您的密钥,因此在处理潜在的钓鱼诈骗时要保持警惕。

  7. 打开命令提示符并输入 aws configure

  8. 您将提示输入四个输入变量。输入您的信息,然后在每个输入后按 Enter

    AWS Access Key ID
    AWS Secret Access Key 
    Default region 
    Default output format (json)
    
  9. 名称是在您的控制台中获得的(这里显示为 Oregon,但您的名称由您独特的位置决定):![图 1.29:位置搜索

    图 B16061_01_29.jpg

    图 1.29:位置搜索

  10. 区域代码从以下 可用区域 列表中获得:![图 1.30:可用区域列表

    图 B16061_01_30.jpg

    图 1.30:可用区域列表

  11. 命令提示符的最后一个输入变量将如下所示。然后,按 Enter:![图 1.31:命令提示符中 AWS CLI 配置的最后一步

    图 B16061_01_31.jpg

图 1.31:命令提示符中 AWS CLI 配置的最后一步

您可以通过输入 aws configure 命令随时更改配置。

在这个练习中,您已配置了 AWS 账户的安全凭证。我们将使用这些凭证在本书的其余部分访问 AWS API。

CLI 使用

当使用命令时,至少指定一个路径参数。两个路径参数是 LocalPathS3Uri

  • 本地路径:这表示本地文件或目录的路径,可以写成绝对路径或相对路径。

  • s3://myBucketName/myKey。路径参数必须以 s3:// 开头,以指示路径参数指的是 S3 对象。

总体命令结构是 aws s3 <Command> [<Arg> …]。以下表格显示了不同的命令及其描述和示例:

![图 1.32:命令列表

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_32.jpg)

图 1.32:命令列表

递归和参数

逐个导入文件很耗时,尤其是当你有一个文件夹中有很多文件需要导入时。一个简单的解决方案是使用递归过程。递归过程是一种可以调用自身并节省用户输入相同导入命令的命令。

执行递归 CLI 命令需要向 API 传递一个参数。这听起来很复杂,但实际上非常简单。首先,参数只是一个传递给程序以影响接收程序操作的名字或选项。在我们的例子中,参数是 递归,执行递归命令的整个命令如下:

aws s3 cp s3://myBucket . --recursive

使用此命令,将存储桶中的所有 S3 对象复制到指定的目录:

![图 1.33:参数列表

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_33.jpg)

图 1.33:参数列表

活动 1.01:使用 CLI 将数据放入 S3

让我们先来谈谈在这个活动中使用的术语。将数据放入 S3 也可以称为 上传。从那里获取它被称为 下载。有时,它也被称为导入和导出。请不要与 AWS Import/Export 混淆,AWS Import/Export 是一个特定的 AWS 服务,用于将大量数据发送到 AWS 或从 AWS 获取数据。

在这个活动中,我们将使用 CLI 在 S3 中创建一个存储桶并导入第二个文本文件。假设你正在创建一个聊天机器人。你已经确定了包含将使你的聊天机器人更有效地与客户互动的内容的文本文件。在文本文件可以被解析之前,它们需要被上传到 S3 存储桶。一旦它们在 S3 中,就可以进行进一步的分析。为了确保这已经正确完成,你需要安装 Python、设置 Amazon CLI 工具,并使用 CLI 进行用户认证:

  1. 配置 CLI 并验证它是否可以成功连接到您的 AWS 环境。

  2. 创建一个新的 S3 存储桶。

  3. 将你的文本文件导入到存储桶中。

  4. 从存储桶中导出文件并验证导出的对象。

    注意

    这个活动的解决方案可以在第 276 页找到。

使用 AWS 控制台识别 ML 服务

AWS 控制台提供了一个基于网页的界面,用于导航、发现和利用 AWS 的人工智能和机器学习服务。在本主题中,我们将探讨两种使用控制台搜索 ML 服务的方法。此外,我们还将测试一个使用从网站检索的文本数据检索的 ML API。

练习 1.04:在 AWS 管理控制台中导航

在这个练习中,我们将导航AWS管理控制台以定位ML服务。从控制台开始,https://console.aws.amazon.com/console/,并且仅使用控制台搜索功能,让我们导航到Amazon Lex(https://console.aws.amazon.com/lex/)服务信息页面:

  1. 点击https://console.aws.amazon.com/console/导航到AWS控制台。您可能需要登录您的AWS账户。然后,点击服务:![图1.34:AWS控制台

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_34.jpg)

    图1.34:AWS控制台

  2. 滚动页面以查看所有ML服务。然后,点击Amazon Lex。如果Lex在您所在的位置不可用,您可以考虑切换到另一个服务。![图1.35:ML选项

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_35.jpg)

    图1.35:ML选项

  3. 您将被重定向到Amazon Lex的主屏幕:![图1.36:Amazon Lex主屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_36.jpg)

图1.36:Amazon Lex主屏幕

您将在第5章“使用语音与聊天机器人”中有机会使用Amazon Lex。现在,您可以点击不同的了解更多链接以更好地了解Lex的功能。如果您迫不及待想要尝试,您可以点击开始使用

定位新的AWS服务是发现更多工具以解决您的数据项目解决方案的关键技能。现在,让我们测试Amazon Comprehend的API功能。

练习1.05:测试Amazon Comprehend API功能

现在您已经掌握了S3,让我们进行一个快速练习,这个练习不仅限于存储文件,而且为您准备后续章节的内容。在这个练习中,我们将使用API探索器中的部分文本文件输入来显示文本分析输出。探索API是一种节省开发时间的技能,它确保输出符合您项目的所需格式。在这里,我们将测试AWS Comprehend文本分析功能。

注意

您将在第4章“对话式人工智能”中更详细地了解Comprehend。我们还将介绍各种AWS AI服务以及如何使用它们。在这里,我们进行练习是为了让您熟悉以多种方式与AWS交互。

这里是用户故事:假设您正在创建一个聊天机器人。在采取任何步骤之前,我们首先需要了解商业目标或陈述或目标。然后我们需要选择相关的AWS服务。例如,如果我们的商业目标与存储相关,我们将选择存储领域。

您已经确定了一个商业主题以及相应的文本文档,这些文档包含的内容将使聊天机器人使您的商业成功。您的下一步是确定/验证一个AWS服务来解析文本文档以获取情感、语言、关键词和实体。亚马逊的AI服务包括AWS Comprehend,它在这方面做得非常好。

在编写完整的程序之前,您需要通过 AWS 管理控制台的界面测试 AWS 服务的功能。为了确保这一点,您需要在网络上搜索一篇文章(用英语或西班牙语撰写),其中包含您感兴趣的主题内容。您知道探索 API 是一种可以节省开发时间的技能,因为它可以确保输出符合您项目的期望格式。

现在我们有了用户故事,让我们执行这个任务:

类似于 练习 1.01使用 AWS 管理控制台创建 S3 存储桶,您应该已经按照本章前面详细说明的方式完成了账户设置。

  1. 前往 https://aws.amazon.com/ 并点击 我的账户,然后 AWS 管理控制台 以在新浏览器标签页中打开 AWS 管理控制台:![图 1.37:通过用户账户访问 AWS 管理控制台

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_37.jpg)

    图 1.37:通过用户账户访问 AWS 管理控制台

  2. 在 AWS 管理控制台中点击搜索栏(位于 查找服务 下方)以搜索 Amazon Comprehend,您将被引导到以下所示的 Amazon Comprehend 控制台 屏幕:![图 1.38:搜索 AWS 服务

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_38.jpg)

    图 1.38:搜索 AWS 服务

  3. 输入 amazon comp。随着您输入,Amazon 将自动完成并显示与搜索框中输入的名称匹配的服务:![图 1.39:选择 AWS 服务

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_39.jpg)

    图 1.39:选择 AWS 服务

  4. 您将看到 Amazon Comprehend 登录页面:![图 1.40:Amazon Comprehend 页面

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_40.jpg)

    图 1.40:Amazon Comprehend 页面

  5. 点击 启动 Amazon Comprehend,您将被引导到 实时分析 页面。您可以使用他们的内置模型,或者提供自定义模型。我们将使用他们的内置模型:![图 1.41:实时分析

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_41.jpg)

    图 1.41:实时分析

    您可以输入文本并点击 分析。让我们复制一首沃尔特·惠特曼的诗从 http://www.gutenberg.org/cache/epub/1322/pg1322.txt 并进行分析。导航到 主题建模和文档。有一个用于探索 API 的 GUI,右侧提供文本输入的实时输出。

  6. 点击 清除文本 以清除所有默认服务。导航到新标签页中打开以下 URL:http://www.gutenberg.org/cache/epub/1322/pg1322.txt

  7. 复制第一首诗并将其粘贴到 输入文本 框中:![图 1.42:Amazon Comprehend 实时分析屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_42.jpg)

    图 1.42:Amazon Comprehend 实时分析屏幕

  8. 点击 分析 以查看输出:![图 1.43:分析输出

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_43.jpg)

    图 1.43:分析输出

  9. 查看实体、“关键词”和“语言”标签页,然后点击“情感”标签页以查看情感分析:![图1.44:情感标签页结果

    图片

    图1.44:情感标签页结果

  10. 您可以尝试其他标签页。语言将显示为99%的置信度,并且“语法”标签页很有趣,信息量很大。“关键词”标签页会下划线显示关键词并将它们列出:![图1.45:关键词标签页结果

    图片

图1.45:关键词标签页结果

尝试一些其他文本——可能是IMDb的电影评论或亚马逊产品评论的评论——并查看Amazon Comprehend如何处理情感。一个有趣的事情是尝试讽刺或甚至是在最后一刻改变其极性的评论,例如,“这本书真的很棒,但电影很糟糕”或“剧本和导演是由那些无法理解小说好在哪里的人完成的,”以获得有趣的结果。

AWS控制台界面在AI服务中的实用性

Comprehend控制台界面对于测试想法非常有用。正如您将在后面的章节中看到的那样,我们可以使用与Amazon Textract类似的界面来查看我们是否可以从表格、公司报表(如损益表或资产负债表)、医疗表格等表格中提取表格和其他信息。

虽然我们需要编程和开发来开发机器人流程自动化应用程序,但控制台界面帮助我们快速测试我们的业务假设。例如,可能您想自动化一个贷款处理流程,您需要手动从不同的文档中输入信息。为了查看是否有任何AWS AI服务符合需求,您可以使用AWS Textract控制台扫描所有相关文档并进行测试。在后面的第5章“计算机视觉和图像处理”中,您将处理扫描的文档和Amazon Textract。

您还可以检查AWS内置模型提取所需信息的准确性。可能您需要定制模型,可能文档对机器来说不易理解,但您可以更早地找到它们并相应地规划。可能您的应用程序涉及病历处理,这可能需要更复杂的定制模型。实际上,您可以在控制台中上传定制模型并进行测试。

摘要

在本章中,我们从了解云计算、AWS、机器学习和人工智能的基础知识开始。然后我们探索了S3,创建了存储桶,并将数据从S3导入和导出。同时,我们探讨了AWS命令行及其用途。最后,我们以AWS Comprehend的控制台界面为例,测试了与分析文本和文档相关的各种想法。

在下一章中,你将了解更多关于 AWS 人工智能服务、无服务器计算以及如何使用 自然语言处理NLP)分析文本文档。研究新的 AWS 服务对于发现解决你正在工作的许多机器学习问题的额外解决方案至关重要。此外,正如你所见,AWS 有多种与其服务交互的方式,以帮助测试商业想法、评估 AI/ML 模型以及快速原型设计。

第二章:2. 使用自然语言处理分析文档和文本

概述

本章介绍了如何使用 Amazon Comprehend 来总结文本文档并创建 Lambda 函数来分析文本。您将学习如何通过应用无服务器计算范式来开发服务,并使用 Amazon Comprehend 来检查文本以确定其主要语言。您将从一系列文档中提取信息,例如实体(人物或地点)、关键词(指示内容的名词短语)、情感倾向和主题。

到本章结束时,您将能够设置一个 Lambda 函数,使用 Comprehend 处理和分析导入的文本,并使用 Amazon Textract 从扫描的纸质文档中提取结构化信息。

简介

自 2005 年亚马逊正式推出其 弹性计算云EC2)网络服务以来,云计算已经从开发者服务发展到至关重要的基础设施。应用范围广泛——大多数高度可扩展的消费者平台,如 Netflix,都是基于 AWS 构建的,许多制药和基因组学,以及 BBC 和 The Weather Channel、宝马和佳能等组织也是如此。截至 2020 年 1 月,大约有 143 个不同的 AWS 服务,涵盖 25 个类别,从计算和存储到量子技术、机器人和机器学习。本书将介绍其中的一些,如下面的图表所示:

图 2.1:涵盖的 Amazon AI 服务

图片 B16061_02_01.jpg

图 2.1:涵盖的 Amazon AI 服务

图片 a

S3 是一种多功能的对象存储,我们用它来存储人工智能服务的输入以及这些服务的输出。您从 第一章AWS 简介 开始就已经在使用 S3 了。

图片 b

Lambda 是使无服务器计算成为可能的中介服务。您将在本章后面使用 Lambda 通过 Comprehend 分析文本。

图片 c

API Gateway 是一种交付服务,可以使您创建可以通过各种客户端访问的微服务,例如通过 HTTP、WebSocket 和 REST 等互联网协议访问的 Web、移动和服务器应用程序。API Gateway 使您能够以安全且可扩展的方式公开您的微服务。在微服务和“API 首选”方法的时代,最大的挑战是 API 端点的创建、发布、监控和维护。几乎所有的 AWS 服务都是 API,并使用 API Gateway 基础设施。

亚马逊的机器学习服务,本书的主要焦点,截至 2020 年 1 月共有 16 个服务。它们也被称为 AI 服务,目前这两个术语可以互换使用。让我们快速了解一下我们感兴趣的服务。

图片 d

Comprehend,本章的主题,是一个非常通用的文本分析服务。它执行各种任务——关键词提取、情感分析(正面、负面、中性或混合)、句法分析、实体识别、医疗命名实体识别NER)、语言检测和主题建模。您将在本章后面的内容中看到它的实际应用。

e

Lex是一个用于构建对话式AI、机器人或智能助手的平台。对话式AI功能,如自动语音识别ASR)和自然语言理解NLU),已集成到Lex框架中。Lex提供了一个非常直观的对象模型,包括机器人、话语、槽位和会话,以及与Amazon Lambda的集成,从而让您能够在无服务器环境中开发有趣、智能的机器人。我们将在第4章“对话式人工智能”中看到Lex的更多应用。

f

个性化是一个非常实用的服务,它允许您个性化您的机器人。例如,可以整合个性化的推荐/内容投递,基于先前交互的个性化搜索,甚至基于用户行为的个性化通知和营销!虽然我们在这本书中不会使用亚马逊个性化服务,但我们想将您的注意力引向与本书中涵盖的服务密切相关的一些服务。这样,您就可以在扩展您的机器人和NLP服务功能的同时,添加极其丰富的功能。

g

Polly是一个使用神经文本到语音NTTS)技术的文本到语音服务。它非常灵活且功能强大,提供两种风格:新闻播报风格和正常对话风格。声音不必单调——亚马逊Polly支持语音合成标记语言SSML),这使您能够调整说话风格、音量、语速、音调、语调、强调、语调和其他特性。

h

Textract,正如其名所示,从文档中提取文本。它是一个适合流程自动化的光学字符识别OCR)解决方案。它可以从税务表格、法律文件、医疗表格、银行表格、专利注册等文档中提取键值对或表格。

i

Transcribe是一个语音到文本的自动语音识别ASR)服务,并且非常灵活;例如,它可以识别多个说话者,并且您可以过滤掉单词。它在医疗转录、时间戳字幕生成和客户交互转录中非常有用。

j

Translate是另一个非常实用的服务,它能够以可扩展、实时的方式翻译超过50种语言。

k

当然,Rekognition 是一种视觉分析和图像检测服务,能够执行各种任务,如面部识别、视频分析、物体检测和识别图像中的文本。第6章计算机视觉与图像处理专门介绍了Amazon Rekognition。

l

与本章迄今为止我们探讨的AI服务不同,Amazon Connect 是一个功能丰富的联系中心应用。它由一个全渠道云联系中心组成,具有高质量的音频、Web/移动安全聊天和基于Web的联系控制面板。Amazon Connect的接触镜是一套联系中心分析服务,它增加了全文搜索和情感分析等功能,未来还将包括主题检测和自定义词汇等功能。与Amazon Lex的集成为聊天机器人提供了一个有趣的功能,我们可以利用Lex的灵活性来创建智能且有用的机器人。

m

当然,Amazon Alexa 是一个对话接口的平台,以及一系列利用Alexa服务成为智能助手的硬件设备,如智能扬声器。

包含客户参与平台如Connect和Alexa的原因是为了展示我们在本书中所做工作的更广泛可能性。虽然我们不会直接展示如何为基于Amazon Connect或Amazon Alexa的机器人语音用户界面VUI)开发,但我们希望打开您的思路,了解在不同集成点——Web、移动、智能扬声器等等——实现全渠道客户体验的可能性。

如您所见,服务覆盖了广泛的层次,从存储和基础设施层到AI服务层,最终扩展到用户体验层。

无服务器计算

无服务器计算是一种相对较新的架构,它对云应用架构进行了不同的诠释。让我们从传统的本地服务器架构开始。

通常,传统的应用架构从一组计算机硬件、主机操作系统、虚拟化、容器以及由网络和存储连接起来的库和框架的应用堆栈开始。在这所有之上,我们编写业务逻辑。本质上,为了维护业务能力,我们必须维护服务器硬件、操作系统补丁、更新、库更新等等。我们至少还要担心可伸缩性、容错性和安全性。

使用云计算,应用架构不再依赖于计算机硬件,同时也具有弹性。我们仍然需要维护操作系统、库、补丁等等。这就是无服务器计算发挥作用的地方——用亚马逊的话说,无服务器计算“将更多的运营责任转移到AWS”。

无服务器计算在云计算的基础上进行了改进,消除了基础设施管理,从配置到根据负载进行扩展和缩减,以及整个运行时堆栈的修补和维护。正如亚马逊所描述的,无服务器计算确实“降低了成本,增加了敏捷性和创新”,并且如果设计得当,还可以实现自动高可用性。

O'Reilly 的报告将无服务器计算定义为“一种软件解决方案的架构方法,它依赖于在弹性运行时环境中运行的小型独立函数在短暂服务器上运行。”因此,存在服务器——无服务器并不是一个恰当的术语,但在某种程度上,服务器是透明的,由亚马逊在 Lambda 函数执行期间管理,这通常在毫秒级别。

Amazon Lambda 和 Function as a Service

从本质上讲,无服务器计算是由函数驱动的,更准确地说,是由 Function as a Service (FaaS) 驱动的。Amazon Lambda 是无服务器计算的一个主要启用平台示例。

您将业务逻辑编写为一系列事件驱动的 Lambda 函数,这些函数是无状态的、容错的、自动扩展的。Lambda 函数有一个上游和一个下游——它响应上游事件;运行时处理器执行嵌入的代码,并将结果发送到下游目的地。上游事件可能是由放入队列中的某些内容或掉入 S3 存储桶或 简单通知服务 (SNS) 消息中的某些内容生成的。下游可以是 S3 存储桶、队列、DynamoDB 等等。运行时支持多种语言,例如 Python、Go、Java、Ruby、Node.js 和 .NET。

Lambda 函数比微服务更细粒度——您可以将其视为一个纳米服务。它按 100 毫秒计费,并在 15 分钟后超时。有效负载大小为 6 MB。这为您提供了 Lambda 函数大小的估计。此外,正如您所注意到的,当 Lambda 函数空闲时没有费用——这意味着我们可以缩减到零。您还可以轻松实现数据并行化——为每行数据触发一个 Lambda 函数。由于一个 Lambda 函数可以触发另一个 Lambda 函数,您甚至可以进行任务并行化。当然,所有这些都要求仔细的架构设计,但这是值得的。

亚马逊的无服务器平台涵盖了计算、存储、网络、编排、API 代理、分析和开发者工具。我们将探讨其中的一些组件——Lambda 用于计算,S3 用于存储,API Gateway 用于网络。

无服务器计算作为一种方法

行业分析师和技术人员将无服务器计算视为一种方法和一套原则。Amazon Lambda 不是无服务器计算,而是该方法的推动者。无服务器计算架构确实减少了您需要构建的内容——我们现在编写的一些传统代码现在表现为函数链式管道、事件配置、触发器和 Lambda 函数的属性。基本业务逻辑确实需要编写,并将位于 Lambda 函数内部。因此,平台和业务代码之间有一个非常明确的分离,这就是无服务器计算的价值。

Amazon Comprehend

Amazon Comprehend 是一种文本分析服务。它具有广泛的功能。Amazon Comprehend 可以提取关键短语和实体。它可以进行语言检测和主题建模。它还可以执行情感分析和语法分析。Amazon Comprehend 支持多语言。Amazon Comprehend 的应用包括:

  • 理解各种非结构化文本项(如支持票、社交媒体帖子、客户反馈、客户投诉以及合同和医疗记录等业务文档)的主要主题和话题。

  • 通过对内部程序、白皮书、笔记和描述、媒体帖子以及电子邮件等业务文档进行分类来管理知识。

  • 品牌监控——有效地响应来自各种渠道的社交媒体帖子、评论和其他用户生成内容。通过优先处理内容并将内容路由到适当的人员或流程来加快响应速度。为了优先处理和更快地响应,企业需要分析内容中的语言、主题和媒体中提到的实体——所有这些都是 Amazon Comprehend 的功能。

  • Comprehend 的一项重要功能是,在底层,它通过监控错误并使用新的和改进的数据训练人工智能模型来改进模型。

  • 此外,您还可以使用您特定领域的数据进行模型微调,从而提高准确性以适应您的应用程序,同时利用人工智能模型的一般能力。

  • Comprehend 的一项有趣的应用是从业务文档(如合同编号、合同条款、各种代码甚至药物剂量)中提取信息。

一个有趣的端到端用例是使用 Amazon Comprehend 分析一组文本文档,按主题组织文章,识别最常提到的特征,并按主题分组文章,以便为网站访客提供个性化推荐。

![图 2.2:Amazon Comprehend 搜索流程

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_02.jpg)

图 2.2:Amazon Comprehend 搜索流程

Amazon Comprehend Medical 是一个功能丰富的服务,用于分析患者健康记录、医生笔记和临床试验报告,以及医学本体学的链接。它甚至可以确定用于分析的药物剂量、测试结果和治疗信息:

![图 2.3:Amazon Comprehend Medical 流程

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_03.jpg)

图 2.3:Amazon Comprehend Medical 流程

Amazon Comprehend 服务不断从 Amazon 产品描述和消费者评论的新数据中学习,因此,它不断改进其理解来自政府、健康、媒体、教育、广告等各种主题的能力。

第一章AWS 简介 中,你学习了如何使用 Amazon Comprehend 通过文档内容中的 自然语言处理 (NLP) 提取洞察。在本章中,我们将深入探讨,你将学习如何使用 Amazon Comprehend API 通过识别文档中的语言、实体、关键词、情感和主题来产生洞察。这将使你能够理解基于深度学习的 NLP,以构建更复杂的应用程序,我们将在后续内容中介绍。

在本章的第二部分,你将了解 AWS Lambda,以及如何将此服务与 Amazon Comprehend 集成。你还将集成数据库,为构建可扩展的 NLP 处理应用程序提供基础。

什么是 NLP 服务?

Amazon Comprehend 是一个 NLP 服务。NLP 服务的总体目标是使机器理解我们的口语和书面语言。虚拟助手,如 Alexa 或 Siri,使用 NLP 从输入数据中产生洞察。输入数据由一种语言结构化,该语言具有独特的语法、句法和词汇。因此,处理文本数据需要首先识别语言,然后应用后续规则来识别文档的信息。NLP 的通用任务是捕获这些信息作为数值表示。这个通用任务被分解为具体任务,例如识别语言、实体、关键词、情感和主题。

![图 2.4:Amazon Comprehend 数据流

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_04.jpg)

图 2.4:Amazon Comprehend 数据流

如我们之前讨论的,Amazon Comprehend 使用预训练的模型来执行文档分析任务。这非常好,因为它使企业能够在不进行耗时的 AI 模型训练努力的情况下开发能力。而且 Amazon 不断跟进 ML 和 AI 的最新发展,不断重新训练模型——因此,模型在没有用户任何工作的情况下变得更好。此外,还有通过使用你的特定领域内容来微调模型的能力。

使用 Amazon Comprehend 检查文本并确定主要语言

Amazon Comprehend用于搜索和检查文本,然后从各种主题(健康、媒体、电信、教育、政府等)和文本数据格式中的语言中收集见解。因此,分析文本数据并利用更复杂的功能(如主题、实体和情感分析)的第一步是确定主导语言。确定主导语言确保了更深入分析的正确性。为了检查文本以确定主要语言,有两种操作(DetectDominantLanguageBatchDetectDominantLanguage)。

这两个操作都期望文本以UTF-8格式,长度至少为20个字符,最大为5,000字节。如果你发送一个列表,它不应包含超过25个项目。

响应包括使用两位字母代码识别出的语言。以下表格显示了不同语言的代码:

注意

查看有关支持语言更新的列表:https://docs.aws.amazon.com/comprehend/latest/dg/how-languages.html

![图2.5:Amazon Comprehend的编程语言支持

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_05.jpg)

图2.5:Amazon Comprehend支持的编程语言

有三种方式可以调用主导语言检测。结果是内容中的主导语言代码和由Comprehend算法确定的置信度分数:

  • DetectDominantLanguage将返回单个文档中的主导语言。

  • BatchDetectDominantLanguage在文档集上工作,并将返回每个文档中的主导语言列表。

  • 虽然前面的两个API都在同步模式下工作,即你将内容发送到API,它将返回结果,但StartDominantLanguageDetectionJob在异步模式下处理作业集合。此API非常适合需要更多时间的长作业。

![图2.6:主导语言分数置信度输出

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_06.jpg)

图2.6:主导语言分数置信度输出

练习2.01:使用命令行界面检测文本文档中的主导语言

在这个练习中,你将学习如何使用Comprehend的DetectDominantLanguage函数检测文本中的主导语言。以下步骤描述了如何检测主导语言:

注意

Jupyter笔记本的源代码可通过GitHub在以下存储库中获取:https://packt.live/2O4cw0V

本章的文件位于GitHub存储库的Chapter02文件夹中:https://packt.live/31TIzbU。正如我们在第1章AWS简介中提到的,你应该已经将GitHub文件下载到本地子目录中。

例如,我们已经下载了Documents/aws-book/The-Applied-AI-and-Natural-Language-Processing-with-AWS目录中的文件。

  1. 打开一个新的Jupyter Notebook。

    注意

    对于配置说明,请参阅 GitHub 上的 预检查 部分标题:https://packt.live/2O4cw0V

  2. 在我们开始之前,必须安装 boto3 库。在一个新的 Jupyter Notebook 单元格中,输入以下命令来安装它:

    !pip install boto3  
    
  3. 现在,让我们继续导入 Boto3。Boto3 仅仅是 AWS SDK for Python。https://boto3.amazonaws.com/v1/documentation/api/latest/index.html):

    import boto3
    
  4. 然后,导入 JSON 模块以序列化 JSON(https://docs.python.org/3.6/library/json.html):

    import json
    
  5. 实例化一个新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend')
    
  6. 接下来,我们将英语和西班牙语字符串分配给 Comprehend 进行分析:

    english_string = 'Machine Learning is fascinating.'
    spanish_string = 'El aprendizaje automático es fascinante.'
    
  7. 接下来,我们打印一个字符串来指示我们的脚本即将执行的相应变量:

    print('Calling DetectDominantLanguage')
    print('english_string result:')
    
  8. 最后,使用 english_stringspanish_string 变量调用 Comprehend 的 detect_dominant_language 方法(https://docs.aws.amazon.com/comprehend/latest/dg/API_DetectDominantLanguage.html)。

    json.dumps() 将 JSON 数据写入终端中的 Python 字符串:

    print('\n English string result:')
    print(json.dumps(comprehend.detect_dominant_language\
                    (Text = english_string), sort_keys=True, \
                    indent=4))
    print('\n spanish_string result:')
    print(json.dumps(comprehend.detect_dominant_language\
                    (Text = spanish_string), sort_keys=True, \
                    indent=4))
    print('End of DetectDominantLanguage\n')
    \ ) to split the logic across multiple lines. When the code is executed, Python will ignore the backslash, and treat the code on the next line as a direct continuation of the current line.
    
  9. 保存笔记本。

  10. 按下 Shift + Enter 来运行两个笔记本单元格。执行单元格将产生以下输出(见以下截图):图 2.7:检测主要语言输出 – 英语和西班牙语

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_07.jpg)

图 2.7:检测主要语言输出 – 英语和西班牙语

如预期,english_text 字符串被识别为英语(使用 en 语言代码),置信度分数约为 ~0.99。

如预期,spanish_text 字符串被识别为西班牙语(使用 es 语言代码),置信度分数约为 ~0.99。

练习 2.02:使用 CLI 检测多个文档中的主要语言

在这个练习中,你将学习如何使用 Comprehend 的 DetectDominantLanguage 操作来处理多个文档。以下步骤描述了如何检测主要语言:

注意

预检查说明 和本练习的源代码可通过 GitHub 上的仓库获取:https://packt.live/2Z8Vbu4

  1. 打开一个新的 Jupyter Notebook。

  2. 在一个全新的空单元格中,导入 AWS SDK for Python(boto3:https://boto3.amazonaws.com/v1/documentation/api/latest/index.html):

    import boto3
    
  3. 然后,再次导入 JSON 模块以序列化 JSON(https://docs.python.org/3.6/library/json.html):

    import json
    
  4. 实例化一个新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend')
    
  5. 接下来,将一组英语和西班牙语字符串分配给 Comprehend 进行分析:

    english_string_list = \
    ['Machine Learning is fascinating.', \
     'Studying Artificial Intelligence is my passion.']
    spanish_string_list = \
    ['El aprendizaje automático es fascinante.', \
     'Estudiar Inteligencia Artificial es mi pasión.']
    
  6. 最后,我们使用english_string_listspanish_string_list变量调用Comprehend的batch_detect_dominant_language方法(https://docs.aws.amazon.com/comprehend/latest/dg/API_DetectDominantLanguage.html)。然后,json.dumps()将JSON数据写入Python字符串到终端:

    print('Calling BatchDetectDominantLanguage')
    print('english_string_list results:')
    print(json.dumps(comprehend.batch_detect_dominant_language\
                    (TextList=english_string_list), \
                    sort_keys=True, indent=4))
    print('\nspanish_string_list results:')
    print(json.dumps(comprehend.batch_detect_dominant_language\
                    (TextList=spanish_string_list), \
                    sort_keys=True, indent=4))
    print('End of BatchDetectDominantLanguage\n')
    
  7. 保存笔记本。

  8. Shift + Enter 运行两个笔记本单元格。执行单元格将产生以下输出(见以下部分截图——输出太长无法全部显示;您可以在笔记本中查看完整输出):![图 2.8:检测主要语言(多文档)输出——英语

    img/B16061_02_08.jpg

图 2.8:检测主要语言(多文档)输出——英语

要记住的重要概念是Comprehend具有检测不同语言的能力,并且可以接受单个字符串或字符串列表的批量格式作为文本输入。

在这个主题中,我们回顾了Comprehend的DetectDominantLanguage方法的架构,以及如何传入字符串和字符串列表。接下来,我们将从一组文档中提取实体、短语和情感。

从一组文档中提取信息

在业务层面,了解客户在联系虚拟助手时是否愤怒或高兴以及原因,对于保留客户至关重要。在NLP层面,这需要提取更多信息并使用更复杂的算法。需要提取和量化的附加信息是实体关键短语情感倾向主题

检测命名实体——AWS SDK for Python (boto3)

实体是一个更广泛的概念——它是有自己身份的东西。实体可以是人、地点、公司名称或组织;它也可以是数字(例如数量、价格、天数)或日期、标题、政策编号或医疗代码。例如,在文本“Martin住在27 Broadway St.”中,Martin可能被检测为人物,而27 Broadway St可能被检测为地点

实体还有一个分数来表示检测到的实体类型是否正确被检测到的置信水平。以下表格显示了完整的实体类型和描述列表:

![图 2.9:AWS Comprehend实体类型和描述

img/B16061_02_09.jpg

图 2.9:AWS Comprehend实体类型和描述

有三种方式来调用实体检测:

  • DetectEntities将返回单个文档中的实体。

  • BatchDetectEntities在文档集上工作,并将返回每个文档中的实体列表。

  • 虽然前面的两个API都工作在同步模式下,即您将内容发送到API,它将返回结果,但StartEntitiesDetectionJob在异步模式下对一系列作业进行处理。此API非常适合需要更多时间的长作业。

DetectEntities – 输入和输出

DetectEntities 接收一个 LanguageCode 和一个文本字符串作为输入,然后提供关于输入文本中每个实体的以下信息:BeginOffsetEndOffsetScoreTextType。以下表格显示了 AWS Comprehend DetectEntities、类型和描述的完整列表:

![图 2.10:AWS Comprehend 实体类型和描述

![img/B16061_02_10.jpg]

图 2.10:AWS Comprehend 实体类型和描述

练习 2.03:确定文档中的命名实体(DetectEntities 方法)

在这个练习中,我们将确定文档中的命名实体。为此,我们将使用 Amazon Comprehend 的 DetectEntities 操作。以下是检测命名实体的步骤:

注意

该练习的 预检查说明 和源代码可通过 GitHub 在以下存储库中获取:https://packt.live/2ADssUI

  1. 打开一个新的 Jupyter Notebook。

  2. 使用以下命令导入 AWS SDK for Python (boto3: https://boto3.amazonaws.com/v1/documentation/api/latest/index.html):

    import boto3
    
  3. 现在,导入 JSON 模块以使用以下命令序列化来自 https://docs.python.org/3.6/library/json.htmlJSON

    import json
    
  4. 现在,实例化一个新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend')
    
  5. 现在,在实例化一个新的 Comprehend 客户端后,提供要分析的分析文本:

    english_string = "I study Machine Learning in "\
                     "Seattle on Thursday."
    print('Calling DetectEntities')
    
  6. 现在,json.dumps() 将 JSON 数据写入 Python 字符串:

    print(json.dumps(comprehend.detect_entities\
                    (Text = english_string, LanguageCode='en'), \
                    sort_keys=True, indent=4))
    print('End of DetectEntities\n')
    
  7. Shift + Enter 运行两个笔记本单元。前面代码的输出如下所示:![图 2.11:AWS Comprehend DetectEntities 输出

    ![img/B16061_02_11.jpg]

图 2.11:AWS Comprehend DetectEntities 输出

置信度得分均为 ~0.99,因为输入是简单的示例。正如预期的那样,Seattle 被检测为 LOCATION,而 Thursday 被检测为 DATE

![图 2.12:AWS Comprehend BeginOffset 和 EndOffset 检查

![img/B16061_02_12.jpg]

图 2.12:AWS Comprehend BeginOffset 和 EndOffset 检查

练习 2.04:在文档集中检测实体(文本文件)

在这个练习中,我们将确定多份文档中的命名实体。为此,我们将使用 Amazon Comprehend 的 DetectEntities 操作。以下是检测一组文档中命名实体的步骤:

注意

该练习的 预检查说明 和源代码可通过 GitHub 在以下存储库中获取:https://packt.live/31UCuMs

  1. 打开一个新的 Jupyter Notebook。

  2. 使用以下命令导入 AWS SDK for Python (boto3: https://boto3.amazonaws.com/v1/documentation/api/latest/index.html):

    import boto3
    
  3. 现在,导入 JSON 模块以使用以下命令序列化来自 https://docs.python.org/3.6/library/json.htmlJSON

    import json
    
  4. 我们还需要进行一些文件操作来遍历文档。导入 glob 模块,使用以下命令从 https://docs.python.org/3.6/library/glob.html 查找以 .txt 结尾的文本文件:

    import glob
    
  5. 我们还需要 os 库。使用以下命令从 https://docs.python.org/3.6/library/os.html 导入 os 模块:

    import os
    
  6. 现在,实例化一个新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend')
    

    让我们获取所有文档的列表(假设在 Jupyter 笔记本中您已导航到 Chapter02/Exercise02.04/ 目录并打开了 Exercise2.04.ipynb 笔记本):

    data_dir = 'review_pos directory. Depending on where you have downloaded and stored the .txt files on your system, the highlighted path must be modified in the code. 
    
  7. 现在,我们可以遍历文档并检测文档中的实体。我们将对每个文档调用 detect_entities。和之前一样,我们也将使用 json.dumps() 将 JSON 数据写入 Python 字符串:

    for file in file_list:
      with open(file, 'r', encoding="utf-8") as f:
        file_as_str = f.read()
        # python string formatting to print the text file name
        print('Calling detect_entities_from_documents.py on file: %s' \
              % file[-15:])
        # json.dumps() writes JSON data to a Python string
        print(json.dumps(comprehend.detect_entities\
                        (Text = file_as_str, LanguageCode='en'), \
                        sort_keys=True, indent=4))
        print('End of detect_entities\n')
    
  8. Shift + Enter 运行两个笔记本单元。前面代码的输出如下所示。这是一个长输出——我们只显示了单个文件的输出。您将看到 /reviews__pos/*.txt 子目录中所有文件的实体列表:![图 2.13:DetectEntities 输出

    图片 B16061_02_13.jpg

图 2.13:DetectEntities 输出

在这个练习中,我们将实体检测扩展到一组文档中,通过递归调用 Amazon Comprehend 的 DetectEntities 方法。

检测关键短语

AWS 的关键短语与名词短语类似,代表一个实际事物。在英语中,当我们把代表一个具体想法的不同单词组合在一起时,我们称之为名词短语。

例如,一台快速机器是一个名词短语,因为它由一台(冠词)、快速(形容词)和机器(名词)组成。AWS 会寻找合适的词组组合,并给出分数,以表示字符串是名词短语的置信度。

练习 2.05:检测关键短语

在这个练习中,我们将检测关键短语。为此,我们将使用 Amazon Comprehend 的 DetectKeyPhrase 操作。以下是检测关键短语的操作步骤:

注意

该练习的预检查说明和源代码可通过 GitHub 上的存储库获取,地址为 https://packt.live/2Z75cI4

  1. 使用以下命令导入 AWS SDK for Python (boto3: http://boto3.readthedocs.io/en/latest/):

    import boto3
    
  2. 现在,导入 JSON 模块以序列化来自 https://docs.python.org/3.6/library/json.html 的 JSON,使用以下命令:

    import json
    
  3. 现在,使用以下代码实例化一个新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend')
    
  4. 现在,提供以下代码以分析使用的 English 文本:

    english_string = 'robert redfords a river runs through '\
                     'is not a film i watch often. it is a '\
                     'masterpiece, one of the better films of '\
                     'recent years. The acting and direction is '\
                     'top-notch never sappy , always touching.'
    print('Calling DetectKeyPhrases')
    # json.dumps() writes JSON data to a Python string
    print(json.dumps(comprehend.detect_key_phrases\
         (Text = english_string, LanguageCode='en'), \
         sort_keys=True, indent=4))
    print('End of DetectKeyPhrases\n')
    
  5. 通过执行带有 Shift + Enter 的单元格来运行代码。您将看到以下输出:![图 2.14:AWS Comprehend DetectKeyPhrase 输出

    图片 B16061_02_14.jpg

图 2.14:AWS Comprehend DetectKeyPhrase 输出

检测情感

Amazon Comprehend 有检测情感的能力,通常用于社交媒体帖子、博客文章、评论、电子邮件和其他用户生成内容。Amazon Comprehend 可以确定四种情感极性:积极、消极、中立和混合。混合情感很有趣,因为它可以区分不同的方面;例如,一个用户可能喜欢你的网站,但可能对产品的价格不感兴趣。

练习 2.06:进行情感分析

在这个练习中,我们将执行情感分析。为此,我们将使用 Amazon Comprehend 的 DetectSentiment 操作。以下是检测情感的步骤:

注意

预检查说明 和此练习的源代码可通过 GitHub 在以下存储库中获取:https://packt.live/3ebVNU1

  1. 打开一个新的 Jupyter Notebook。

  2. 使用以下命令从 http://boto3.readthedocs.io/en/latest/ 导入 Python 的 AWS SDK (boto3):

    import boto3
    
  3. 现在,使用以下命令导入 JSON 模块以序列化 JSON,来自 https://docs.python.org/3.6/library/json.html

    import json
    
  4. 现在,使用以下代码创建一个新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend')
    
  5. 然后,提供要分析的文字字符串,使用以下代码:

    english_string = 'Today is my birthday, I am so happy.'
    print('Calling DetectSentiment')
    # json.dumps() #writes JSON data to a Python string
    print('english_string results:')
    print(json.dumps(comprehend.detect_sentiment\
         (Text = english_string, LanguageCode='en'), \
         sort_keys=True, indent=4))
    print('End of DetectSentiment\n')
    
  6. 通过按 Shift + Enter 执行单元格来运行代码。输出如下:![图 2.15:AWS Comprehend—DetectSentiment 输出

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_15.jpg)

图 2.15:AWS Comprehend—DetectSentiment 输出

在这个练习中,我们看到了使用 AWS Comprehend 进行情感分析是多么容易。DetectSentiment 准确地预测了语句 Today is my birthday, I am so happy 的情感为积极。

设置 Lambda 函数并使用 Comprehend 分析导入的文本

我们已经使用 Amazon Comprehend 来执行各种 NLP 任务,例如检测实体和关键词以及进行情感分析。

集成 Comprehend 和 AWS Lambda 以实现响应式 NLP

在这个主题中,我们将集成 AWS Lambda 函数与 Comprehend,这提供了一个更强大、可扩展的基础设施。您可以使用 AWS Lambda 来响应事件运行您的代码,例如 Amazon S3 存储桶中数据的更改。

通过执行代码来响应事件,为开发可扩展的软件架构提供了一个现实世界的解决方案。总体而言,这增加了我们的数据管道,并提供了处理更复杂的大数据量和 NLP 操作的能力。

什么是 AWS Lambda?

AWS Lambda是一种无需配置或管理服务器的计算服务。AWS Lambda仅在需要时执行代码,并自动扩展。AWS Lambda在高度可用的计算基础设施上运行你的代码,该基础设施执行计算服务的管理。更具体地说,AWS Lambda执行以下操作:服务器和操作系统维护、容量配置和自动扩展、代码监控和日志记录。

总体而言,AWS Lambda的目标是创建短小、简单、模块化的代码段,你可以将它们组合成更大的处理基础设施。

AWS Lambda是做什么的?

Lambda允许用户运行小段代码(Java、Node或Python)以完成特定任务。这些特定任务可以是存储并执行对AWS设置的更改,或者响应S3中的事件(我们将在本主题的后续部分探讨)。在Lambda之前,你通常需要一个单独的EC2服务器来运行整个代码;然而,Lambda允许小段代码在没有EC2的情况下运行。

Lambda函数解剖

AWS Lambda提供了两种实现Python代码的选项。首先,你可以上传一个完整的Python代码文件。其次,你可以完全内联使用Lambda函数编辑器,这意味着你可以直接输入和修改代码,无需将任何文件上传到AWS。你输入的代码将在Lambda函数被调用时执行。第二种选项将允许更容易的测试,因此我们将使用它。

让我们检查Lambda函数的结构:

  • 当你创建一个函数(例如,s3_trigger)时,AWS会创建一个同名的文件夹,并在文件夹内创建一个名为Lambda_function.py的Python文件。此文件包含Lambda_handler函数的占位符,这是我们的Lambda函数的入口点。入口点接受两个参数作为参数:event参数和context参数。

  • event参数提供了从调用进程发送到函数的有效负载值。它通常采用Python dict类型的格式,尽管它也可能是liststrintfloatNoneType之一。

  • context参数的类型是LambdaContext,包含运行时信息。你将在后续章节的练习中使用这个参数。函数的返回值可以是任何可JSON序列化的类型。这个值在序列化后返回给调用应用程序。

我们将结合Lambda、S3和Amazon Comprehend,在文本文档上传到S3时自动执行文档分析。Lambda函数的架构如下:

![图2.16:架构图

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_16.jpg)

图2.16:架构图

练习2.07:为S3设置Lambda函数

在这个练习中,我们将集成以下AWS服务:S3、Lambda和Amazon Comprehend。为了执行此练习,应回顾架构。将文件(test_s3trigger_configured.txt)上传到S3并查看Comprehend分析的结果。以下是为设置Lambda函数的步骤:

创建S3存储桶

  1. 您应该拥有一个AWS账户,并且已经完成了第1章AWS简介中的练习和活动。

  2. 首先,导航到Amazon S3服务,https://console.aws.amazon.com/s3/,并点击创建存储桶:![图2.17:为Lambda触发器创建S3存储桶

    图片B16061_02_17.jpg

    图2.17:为Lambda触发器创建S3存储桶

    对于存储桶名称,键入aws-ml-s3-trigger,然后点击创建

    注意

    AWS中的存储桶名称必须是唯一的,否则您将收到错误"存储桶名称已存在"。一种简单的方法是将日期和时间附加到存储桶名称上,例如,YYYYMMDDHHMM。在编写本章时,我创建了存储桶aws-ml-s3-trigger-202001181023

    ![图2.18:创建S3存储桶

    图片B16061_02_18.jpg

    图2.18:创建S3存储桶

  3. 您的存储桶将被创建,并且您将被重定向到S3存储桶屏幕中的存储桶列表,如图所示:![图2.19:S3存储桶列表屏幕

    图片B16061_02_19.jpg

    图2.19:S3存储桶列表屏幕

  4. 接下来,导航到Amazon Lambda,在服务下,然后点击计算下的Lambda:![图2.20:服务 | 计算 | Lambda

    图片B16061_02_20.jpg

    图2.20:服务 | 计算 | Lambda

  5. 您将看到Lambda控制台,如图所示:![图2.21:Lambda控制台

    图片B16061_02_21.jpg

    图2.21:Lambda控制台

  6. 在Lambda控制台中,点击创建函数:![图2.22:AWS Lambda创建函数按钮

    图片B16061_02_22.jpg

    图2.22:AWS Lambda创建函数按钮

  7. 从选项中选择从头开始创建作者。对于名称,键入s3_trigger:![图2.23:AWS Lambda—使用从头开始创建作者选项创建函数

    图片B16061_02_23.jpg

    图2.23:AWS Lambda—使用从头开始创建作者选项创建函数

  8. 对于运行时选项,从列表中选择Python 3.6:![图2.24:AWS Lambda—Python 3.6选择

    图片B16061_02_24.jpg

    图2.24:AWS Lambda—Python 3.6选择

  9. 点击选择或创建执行角色,并选择从AWS策略模板创建新角色,在角色名称字段中输入s3TriggerRole:![图2.25:AWS Lambda创建角色模板

    图片B16061_02_25.jpg

    图2.25:AWS Lambda创建角色模板

  10. 点击策略模板下拉菜单,并选择Amazon S3对象只读权限。您将看到AWS Lambda策略模板下拉框,如图所示:![图2.26:AWS Lambda策略模板下拉框

    图片B16061_02_26.jpg

    图2.26:AWS Lambda策略模板下拉框

  11. 然后,点击 创建函数 按钮以在 AWS 中创建 Lambda 函数。最终的 AWS Lambda 创建函数屏幕如下所示:![图 2.27: AWS Lambda—创建函数屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_27.jpg)

    图 2.27: AWS Lambda—创建函数屏幕

  12. 您将看到 Lambda 函数设计器。显示了很多信息。让我们专注于这次练习的要点:![图 2.28: AWS Lambda—函数设计器

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_28.jpg)

    图 2.28: AWS Lambda—函数设计器

  13. 点击 添加触发器,然后从下拉菜单中选择 S3:![图 2.29: 触发器配置下拉菜单

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_29.jpg)

    图 2.29: 触发器配置下拉菜单

  14. 快速浏览一下选项,然后选择 添加

    存储桶名称应该是您创建的 S3 触发器存储桶(在我的情况下,它是 aws-ml-s3-trigger-202001181023);在 事件类型 部分,必须在下拉菜单中选择 所有对象创建事件,并勾选 启用触发器,如图所示:

    注意

    您可能会遇到错误 "创建触发器时发生错误:配置冲突。同一存储桶上的配置不能共享相同的事件类型。" 这可能发生在您创建了一个函数然后删除了它的情况下。最简单的方法是通过 服务 | 存储/S3 | 点击存储桶 | 属性 | 事件 删除事件,并确保在删除事件后点击 保存 按钮。

    ![图 2.30: Amazon S3 触发器配置

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_30.jpg)

    图 2.30: Amazon S3 触发器配置

    您将在 Lambda 设计器 屏幕上看到 S3:

    ![图 2.31: 带有 S3 的 Lambda 函数设计器

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_31.jpg)

    图 2.31: 带有 S3 的 Lambda 函数设计器

  15. 再次,选择 添加触发器 并选择 CloudWatch/Events/EventBridge:![图 2.32: 添加触发器配置

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_32.jpg)

    图 2.32: 添加触发器配置

  16. 然后点击 规则 旁边的框:![图 2.33: 添加触发器 – 创建新规则

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_33.jpg)

    图 2.33: 添加触发器 – 创建新规则

  17. 选择 创建新规则。将显示以下屏幕。将规则名称输入为 s3_trigger_CWRule。![图 2.34: 添加触发器—新规则配置

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_34.jpg)

    图 2.34: 添加触发器—新规则配置

  18. 规则类型 中选择 事件模式。然后从下拉菜单中选择 简单存储服务 (S3)所有事件,然后点击 添加:![图 2.35: 添加 S3 规则类型

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_35.jpg)

    图 2.35: 添加 S3 规则类型

  19. 让我们更深入地探索一下界面,以便您能够熟悉在不同页面间导航。点击左上角的 函数:![图 2.36: 顶部导航栏返回函数

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_36.jpg)

    图 2.36: 顶部导航栏返回函数

  20. 点击 s3_trigger 返回您正在工作的函数:![图 2.37: 选择要工作的 lambda 函数

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_37.jpg)

    图2.37:选择要工作的lambda函数

  21. 接下来,将屏幕向下滚动到函数代码部分。默认代码将与以下内容相同或类似:![图2.38:AWS Lambda——默认的lambda_function屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_38.jpg)

    图2.38:AWS Lambda——默认的lambda_function屏幕

    在这里,我们可以在lambda_function屏幕中完全输入和编辑我们的代码(只要代码输入类型设置为编辑内联代码,这是下拉菜单中的默认值)。

    注意

    对于这一步,你可以选择跟随操作并输入代码,或者从源代码文件夹中获取它,源代码文件夹位于https://packt.live/2O6WsLW

  22. 首先,我们导入Python的AWS SDK(boto3: http://boto3.readthedocs.io/en/latest/)):

    import boto3
    
  23. 然后,导入JSON模块以序列化JSON (https://docs.python.org/3.6/library/json.html):

    import json
    
  24. 接下来,创建一个接受两个参数——eventcontext的函数:

    def Lambda_handler(event, context):
    
  25. 接下来,创建s3客户端对象:

    s3 = boto3.client("s3")
    
  26. 添加一个if事件来检查是否发生事件。

  27. 接下来,将<输入存储桶名称>替换为你创建的存储桶(在我们的例子中是aws-ml-s3-trigger-202001181023):

    bucket = "<input Bucket name>"
    
  28. 接下来,访问Records事件的第一个索引以获取文本文件对象:

    text_file_obj = event["Records"][0]
    
  29. 接下来,将filename文本分配给一个变量并打印文件名:

    filename = str(text_file_obj['s3']['object']['key'])
    print("filename: ", filename)
    
  30. 接下来,通过获取存储桶和键来创建文件对象:

    file_obj = s3.get_object(Bucket = Bucket, Key = filename)
    
  31. 将文本分配给body_str_obj变量:

    body_str_obj = str(file_obj['Body'].read())
    
  32. 创建comprehend变量:

    comprehend = boto3.client(service_name="comprehend")
    
  33. 下三条代码调用相应的Comprehend函数,从文本文档中检测情感、实体和关键短语。然后,输出将打印到控制台:

    sentiment_response = comprehend.detect_sentiment\
                         (Text = body_str_obj, \
                         LanguageCode = "en")
    print(«sentiment_response: \n», sentiment_response)
    entity_response = comprehend.detect_entities\
                      (Text = body_str_obj, LanguageCode = "en")
    print("\n\nentity_response: \n", entity_response)
    key_phases_response = comprehend.detect_key_phrases\
                          (Text = body_str_obj, \
                          LanguageCode = "en") 
    print("\n\nkey_phases_response: \n", key_phases_response)
    
  34. 最后一条语句返回'Hello from Lambda'字符串,如下所示:

    return {
          'statusCode' :200,
          'body' : json.dumps('Hello from Lambda')
        }
    
  35. 现在,点击保存按钮:![图2.39:AWS Lambda – 保存屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_39.jpg)

图2.39:AWS Lambda – 保存屏幕

从这个练习中,s3_trigger函数可以访问S3,但不能访问Amazon Comprehend。我们需要将策略附加到s3_trigger函数,以便它能够访问Amazon Comprehend以执行文本分析函数(detect_sentimentdetect_entitiesdetect_key_phrases)。

练习2.08:将策略分配给S3_trigger以访问Comprehend

在这个练习中,我们将策略附加到S3_trigger函数,以便它能够访问Comprehend。分配策略的完成步骤如下:

  1. 在Amazon管理控制台中,点击左上角的服务:![图2.40:AWS Management Console中的AWS服务

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_40.jpg)

    图2.40:AWS Management Console中的AWS服务

  2. 导航到安全、身份和合规性部分中的身份和访问管理仪表板。您也可以输入IAM并从下拉菜单中选择它:![图2.41:IAM仪表板

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_41.jpg)

    图2.41:IAM仪表板

  3. 现在,一旦你进入 IAM 控制台,点击 Roles:![图 2.42:IAM 控制台的左侧

    ![图片 B16061_02_42.jpg]

    ![图 2.42:IAM 控制台的左侧

  4. 现在,屏幕将填充角色列表。在角色列表中点击 s3TriggerRole:![图 2.43:选择 s3TriggerRole 的角色列表

    ![图片 B16061_02_43.jpg]

    ![图 2.43:选择 s3TriggerRole 的角色列表

  5. s3TriggerRole 选项将被启用。然后,点击 Attach policies:![图 2.44:s3TriggerRole 的权限选项卡

    ![图片 B16061_02_44.jpg]

    ![图 2.44:s3TriggerRole 的权限选项卡

  6. 输入 Comprehend 以过滤策略。然后,点击 ComprehendFullAccess 旁边的复选框:![图 2.45:选择 ComprehendFullAccess 策略

    ![图片 B16061_02_45.jpg]

    ![图 2.45:选择 ComprehendFullAccess 策略

  7. 一旦你选中了复选框,点击屏幕右下角的 Attach policy:![图 2.46:附加所选策略

    ![图片 B16061_02_46.jpg]

    ![图 2.46:附加所选策略

  8. 你将被重定向到 s3TriggerRole 屏幕,你将收到以下消息:![图 2.47:成功附加策略的消息

    ![图片 B16061_02_47.jpg]

![图 2.47:成功附加策略的消息

通过这种方式,我们已经成功将策略附加到 S3_trigger 函数,从而允许它访问 Comprehend。

活动 2.01:将 Lambda 与 Amazon Comprehend 集成以执行文本分析

在这个活动中,我们将集成 Lambda 函数与 Comprehend,以便在文档上传到 S3 时执行文本分析(detect_sentimentdetect_entitiesdetect_key_phrases)。

假设你正在创建一个聊天机器人。你已经确定了一个商业主题和相应的文本文档,其中包含的内容可以使聊天机器人使你的业务成功。你的下一步是将 Lambda 函数与 Comprehend 集成,用于情感分析、关键词和实体。为了确保这一点正确执行,你需要拥有 test_s3trigger_configured.txt 文件。

注意

test_s3trigger_configured.txt 文件可以在 GitHub 上找到,链接为 https://packt.live/3gAxqku

在执行 s3_trigger 之前,请考虑以下文本的以下方面:情感(正面、负面或中性)、实体(数量、人物、地点等)和关键词:

  1. 首先,导航到 S3_trigger Lambda 函数。

  2. test_s3trigger_configured.txt 文件添加到 S3 存储桶中,以验证 Lambda S3_trigger 函数。

  3. 现在,将文件上传到存储桶并监控文件。

  4. 接下来,使用日志流在 CloudWatch 中点击 View logs

  5. 现在,以文本格式展开输出。

    下面的输出将是:

    Sentiment_response -> 被分类为 60.0% 可能是正面的

    Sentiment_response

    {'Sentiment': 'POSITIVE',
    'SentimentScore':{'Positive': 0.6005121469497681,
                      'Negative': 0.029164031147956848, 
                      'Neutral': 0.3588017225265503, 
                      'Mixed': 0.01152205839753151}, 
    

    entity_response -> 被分类为 70.5% 可能是数量

    entity_response

    {Entities':[{'Score':0.7053232192993164, 
                 'Type': 'QUANTITY','Text': '3 trigger', 
                 'BeginOffset': 35, 'EndOffset': 44}], 
    

    key_phases_response -> 被归类为89.9%可能“测试文件”和98.5%可能“s3触发”的关键短语:

    key_phases_response

    {'KeyPhrases': [{'Score': 0.8986637592315674, 
                     'Text': 'a test file', 
                     'BeginOffset': 8, 'EndOffset': 19}, 
                    {'Score': 0.9852105975151062, 
                     'Text': 'the s3 trigger', 'BeginOffset': 30, 
                     'EndOffset': 44}],
    

    注意

    本活动的解决方案可在第279页找到。

亚马逊Textract

另一个有趣的NLP亚马逊服务是Textract。本质上,Textract可以从文档中提取信息,通常是商业文档,如税务表格、法律文件、医疗表格、银行表格、专利注册等。它是一种用于扫描结构化文档的光学字符识别(OCR)解决方案,适用于机器人流程自动化(RPA)。Textract是一项相对较新的服务——于2018年11月预览,并于2019年5月正式推出。

Textract的优势在于它理解文档,可以提取适合下游处理的表格和/或键值对。许多业务流程,如健康保险处理、税务准备、贷款申请处理、现有贷款的监控和评估、合规评估和工程评估,都需要这些文档,通常手动处理以提取信息,然后开始数字化流程。使用Amazon Textract,可以自动化各种文档的手动接收,从而在批准贷款、加速健康索赔处理或快速批准工程设计时实现更快的周转,从而实现良好的商业价值。

练习2.09:使用亚马逊Textract提取税务信息

在这个练习中,你将从一个来自documentcloud.org(https://www.documentcloud.org/documents/3462212-Sample-2016-Tax-Return.html)的样本税务申报文件中提取一页,看看Textract可以提取多少信息:

注意

样本文件(美国税表1040的第一页)可在https://packt.live/2O5e1Mn找到。

  1. 对于这个练习,我们将直接使用Textract界面。这非常有用,可以尝试并了解文档是否适合OCR。

  2. 首先,通过选择服务 | 机器学习 | 亚马逊Textract进入Textract仪表板。该页面上有很多有趣的细节。花时间阅读材料:![图2.48:亚马逊Textract仪表板

    图片

    图2.48:亚马逊Textract仪表板

  3. 点击尝试亚马逊Textract。出现一个非常简单的实用页面:![图2.49:亚马逊Textract分析文档

    图片

    图2.49:亚马逊Textract分析文档

  4. 点击上传文档并上传Sample-2016-Tax-Return.jpeg文件。服务思考一分钟,并显示非常信息丰富的标签页和它提取的信息:![图2.50:带有示例税务表格的亚马逊Textract分析文档屏幕

    图片

    图2.50:带有示例税务表格的亚马逊Textract分析文档屏幕

    原始文本很有趣,但我们正在寻找为我们的自动化流程带来更多价值。

  5. 点击“表格”标签,您将看到一个非常有意思的页面——它可以获取键和值。例如,第7行提取为7 Wages, salaries, tips, etc. Attach Form(s) W-2 7,值为93,500。现在,下游的贷款处理应用程序可以获取值以及上下文并据此采取行动。

    您可以点击左侧图像上的其他字段,并在右侧看到提取的条目。

    您可以将结果下载为JSON、CSV、表格和文本格式。正如预期的那样,keyvalues.csv具有我们之前看到的第7行作为键,93,500作为值:

    ![图2.51:显示示例税表文档形式的 Amazon Textract 分析文档屏幕

    图片

    图2.51:显示示例税表文档形式的 Amazon Textract 分析文档屏幕

  6. 您可以看到以下表格格式中提取的字段(键作为标题,值在标题下的灰色框中):![图2.52:Amazon Textract 分析文档屏幕,显示示例税表文档“表格”标签中的键值

    图片

    图2.52:Amazon Textract 分析文档屏幕,显示示例税表文档“表格”标签中的键值

  7. “表格”标签也很有趣。Textract能够提取两个表格——顶部和底部部分,但不能提取中间部分:![图2.53:Amazon Textract 分析文档屏幕

    显示表格(表格)

    图片

    图2.53:显示表格(表格)的示例税表分析文档屏幕

  8. 您可以通过点击“表格”标签来以表格格式查看提取的字段:![图2.54:Amazon Textract 分析文档屏幕

    显示表格(提取)

    图片

图2.54:显示表格(提取)的示例税表分析文档屏幕

现在您已经对Textract的功能有了了解,另一个有用的练习是开发一个使用Lambda的贷款处理管道。当美国税表1040的第1页作为JPEG文件被投入S3桶中时,触发一个Lambda函数,该函数接收文件并调用Textract,并将键值文件作为CSV存储在另一个桶中。如果您愿意冒险,您还可以开发一个位于Textract下游的Lambda函数,当输出文件创建时被触发,并且它可以通过短信或队列甚至移动应用警报通知贷款官员。

摘要

在本章中,我们从Amazon AI服务和无服务器计算的高级概念开始。在概念层面上,您了解了无服务器计算以及AWS平台上可用的各种AI服务。

总体而言,这些独立功能的综合为构建基于复杂机器学习的NLP应用(例如,Siri、Alexa等)奠定了基础。了解每个函数如何以及为什么工作将允许您构建自己的基于AWS的NLP应用。

然后,我们深入探讨了 Amazon Comprehend 的细节——Comprehend 的 DetectDominantLanguage 方法是如何构建的,以及如何传入字符串和字符串列表。你学习了如何提取实体、情感、关键词和主题,这些为复杂的 NLP 提供了数据。这使得 Amazon Comprehend 通过在已上传到 S3 的文本文档上自动进行文本分析而变得更加高效。

你还学习了如何使用 Amazon Textract 从扫描的文档中提取结构化信息(表格和键值对),作为处理自动化的前奏。

在下一章中,我们将探讨主题建模并执行主题提取。

第三章:3. 主题建模和主题提取

概述

本章描述了使用Amazon Comprehend分析文档来理解文档集中共同主题的使用。你将学习用于主题建模的算法的基本原理,潜在狄利克雷分配LDA)。学习LDA将使你能够将主题建模应用于各种独特的业务案例。然后,你将对具有已知主题结构的两个文档执行主题建模。到本章结束时,你将能够通过Amazon Comprehend进行主题建模来提取和分析共同主题,并描述主题建模分析的基本原理。你还将能够对一组文档执行主题建模并分析结果。

简介

主题建模是企业系统理解非结构化信息的重要能力,范围从支持票到客户反馈和投诉,再到商业文件。主题建模有助于自动化处理客户反馈和邮件;它使企业能够对来自各种渠道的社会媒体帖子、评论和其他用户生成内容进行分类,并有效地响应。它使企业能够通过理解传入的多渠道交互中的主题和主题,以及通过将材料路由到最合适的团队来最有效地响应关键事项。主题建模帮助的两个其他领域是知识管理和品牌监控。

使用潜在狄利克雷分配(LDA)进行主题建模

一组文档的主题或常见主题可以使用Amazon Comprehend来确定。例如,你有一个电影评论网站,有两个论坛,你想要确定哪个论坛正在讨论两部新上映的电影(一部关于体育,另一部关于政治话题)。你可以提供论坛的文本数据给Amazon Comprehend,以发现每个论坛上讨论的最突出主题。

Amazon Comprehend用于执行主题建模的机器学习算法称为潜在狄利克雷分配LDA)。LDA是一个基于学习的模型,用于确定文档集合中最重要的主题。

LDA的工作原理是,它将每个文档视为主题的组合,文档中的每个单词都与这些主题之一相关联。

例如,如果一份文档的第一段包含诸如鸡肉餐厅烹饪等词语,那么你可以得出结论,该主题可以概括为食物。同样,如果文档的第二段包含诸如火车公里假期等词语,那么你可以得出结论,该主题是旅行

基本LDA示例

LDA 后面有很多数学原理——例如 期望最大化、吉布斯抽样、先验和“词袋”上的概率分布。如果你想了解数学基础,可以从 Amazon 的 SageMaker 文档(https://docs.aws.amazon.com/sagemaker/latest/dg/lda-how-it-works.html)开始。让我们更实际地看看 LDA,并通过一个例子来实证地理解它。

假设你有一篇包含六个句子的文档,你想推断出两个共同的主题。

句子如下:

  • 他们彼此深爱着。

  • 大多数人体验爱情时并没有意识到它有什么特别之处。

  • 部分原因是战争;其余的是革命所造成的。

  • 战争是生活中的一种人为的断裂,好像生活可以被推迟一段时间。多么荒谬!

  • 我说的是生活,但我指的是你在伟大画作中看到的生活,被天才所改变,创造性地丰富。

  • 只有现在人们才决定在自身中体验它,而不是在书籍和图片中,不是作为一种抽象,而是在实践中。

当你将这些句子输入到 LDA 算法中,指定主题数量为两个时,它将发现以下内容:

句子-主题

句子 1:主题 0

句子 2:主题 0

句子 3:主题 1

句子 4:主题 1

句子 5:主题 0

句子 6:主题 0

主题术语

主题 0:生活 12%,人们 8%,体验 8%,爱情 5%,等等

主题 1:62% 革命,23% 战争,其余 15%

当然,知道这些句子来自著名俄罗斯作家鲍里斯·帕斯捷尔纳克所著的《日瓦戈医生》一书,主题战争和生命/爱情似乎是有道理的。

尽管这个例子是对一个复杂算法的简单描述,但它给你一个想法。正如本章所讨论的,在各种商业场景中,一个文档或电子邮件或社交媒体帖子所涉及内容的指示对于下游系统来说非常有价值——能够自动执行这种分类的能力是无价的。

为什么使用 LDA?

当你想根据共同的主题对一组文档进行分组,而不考虑文档本身时,LDA 非常有用。LDA 可以通过分析文档中的单词来推断一般主题,从而创建主题。这通常用于建议框架、报告安排和记录摘要。总之,LDA 有很多用途。例如,你有 30,000 用户的电子邮件,并想确定最常见的主题,以便根据最普遍的主题提供针对特定群体的推荐内容。手动阅读,或者外包手动阅读,30,000 封电子邮件将需要大量的时间和金钱投入,而且准确性难以确认。然而,Amazon Comprehend 可以在几个步骤内无缝地以惊人的准确性提供 30,000 封电子邮件中最常见的主题。首先,将电子邮件转换为文本文件,上传到 S3 桶中,然后使用 Amazon Comprehend 模拟一个主题建模作业。输出是包含相应主题和术语的两个 CSV 文件。

Amazon Comprehend—主题建模指南

如果你向 Comprehend 提供尽可能大的语料库,可以获得最准确的结果。更具体地说:

  • 每个主题中应使用不少于 1,000 条记录。

  • 每个文档应该像三句话那么长。

  • 如果一个文档大部分是数字信息,你应该将其从语料库中排除。

目前,主题建模仅限于两种文档语言:英语西班牙语

主题建模作业允许两种输入数据格式类型(参见图 3.1)。这使用户能够处理大型文档集合(例如,报纸文章或科学期刊),以及短文档(例如,推文或社交媒体帖子)。

输入格式选项:

图 3.1:AWS Comprehend—主题建模输入格式选项

img/B16061_03_01.jpg

图 3.1:AWS Comprehend—主题建模输入格式选项

输出格式选项:

图 3.2:AWS Comprehend—主题建模输出文件描述

img/B16061_03_02.jpg

图 3.2:AWS Comprehend—主题建模输出文件描述

在 Amazon Comprehend 处理完你的文档集合后,建模输出两个 CSV 文件:topic-terms.csv(参见图 3.2)和 doc-topics.csv

topic-terms.csv 文件提供了文档集合中主题的列表,包括术语、相应的主题及其权重。例如,如果你向 Amazon Comprehend 提供了两篇假设文档,学习园艺投资策略,它可能会返回以下内容来描述集合中的两个主题:

图 3.3:两个文档输入的示例主题建模输出(topic-terms.csv)

img/B16061_03_03.jpg

图 3.3:两个文档输入的示例主题建模输出(topic-terms.csv)

doc-topics.csv文件提供了为主题建模作业提供的文档列表,以及每个文档中相应的主题及其比例。对于两个假设文档learning_to_garden.txtinvestment_strategies.txt,你可以期待以下输出:

![图3.4:两个文档输入的样本主题建模输出(doc-topics.csv)

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_04.jpg)

图3.4:两个文档输入的样本主题建模输出(doc-topics.csv)

练习3.01:使用Amazon Comprehend对具有已知主题的两个文档进行主题建模

在这个练习中,我们将使用两份文档(罗密欧与朱丽叶世界大战)来更好地理解LDA。我们将使用Amazon Comprehend来发现这两份文档中的主要主题。在开始练习之前,只需查看数据管道架构的概述。文本文件存储在S3中,然后我们指导Comprehend在输入存储桶中查找文件。Comprehend分析文档,并将结果放回S3的输出存储桶中:

![图3.5:数据管道架构概述

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_05.jpg)

图3.5:数据管道架构概述

完成已知主题结构的主题建模:

  1. 首先,你需要进入S3控制台。请参阅第一章AWS简介,以获取账户设置说明。访问https://aws.amazon.com/,点击我的账户然后点击AWS管理控制台。点击服务,然后在新的浏览器标签页中搜索或选择S3。你将看到以下截图所示的S3控制台:![图3.6:Amazon S3控制台

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_06.jpg)

    图3.6:Amazon S3控制台

  2. 我们需要一个输入和输出S3存储桶。让我们创建这两个存储桶。现在,点击创建存储桶按钮来创建一个存储桶:![图3.7:创建存储桶

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_07.jpg)

    图3.7:创建存储桶

  3. 对于存储桶名称,输入一个描述功能的唯一名称。在这里,使用名称aws-ml-input-for-topic-modeling。点击创建按钮:

    注意

    AWS中的存储桶名称必须唯一。因此,你可能会收到一个错误信息,说“存储桶名称已存在”。获取一个唯一名称的一个简单方法是将今天的日期(如果需要,加上时间)附加到存储桶名称上;例如,YYYYMMDDHHMM。在编写这一章时,我们创建了一个存储桶,名为aws-ml-input-for-topic-modeling-20200301

    在以下窗口中点击创建将使用所有默认设置属性和权限,而点击下一步允许你根据需要调整这些设置。

    ![图3.8:创建存储桶名称输入

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_08.jpg)

    图3.8:创建存储桶名称输入

  4. 点击下一步,然后再次点击下一步以转到配置选项,再点击一次下一步以转到设置权限,最后在审阅选项卡中点击创建存储桶

  5. 现在,点击桶,然后点击创建文件夹按钮来创建一个文件夹:![图3.9:在S3中为主题建模输入创建文件夹

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_09.jpg)

    图3.9:在S3中为主题建模输入创建文件夹

  6. 现在,将文件夹名称输入为known_structure,然后点击保存按钮:![图3.10:保存known_structure文件夹名称

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_10.jpg)

    图3.10:保存known_structure文件夹名称

  7. 点击保存按钮后,你的文件夹将被生成。现在,点击known_structure文件夹:![图3.11:输入桶屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_11.jpg)

    图3.11:输入桶屏幕

  8. 现在,点击上传按钮:![图3.12:上传按钮

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_12.jpg)

    图3.12:上传按钮

  9. 现在,你将被提示向文件夹中添加文件。点击添加文件,或将文件拖放到屏幕上:![图3.13:添加文件按钮

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_13.jpg)

    图3.13:添加文件按钮

  10. 本章的文件位于GitHub仓库的Chapter03文件夹中,网址为https://packt.live/3eba6rM。正如我们在第一章AWS简介中提到的,你应该已经将GitHub文件下载到本地子目录中。

    通过一个例子,我们已经将文件下载到Documents/aws-book/The-Applied-AI-and-Natural-Language-Processing-with-AWS目录。导航到上传,从你的本地磁盘选择以下两个文本文件。正如你可能猜到的,这个练习的文件位于Exercise3.01子目录中:

    文件选择完毕后,点击打开按钮上传文件:

    ![图3.14:从本地目录选择要上传的文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_14.jpg)

    图3.14:从本地目录选择要上传的文件

    下面的图显示了文本文件的上传过程:

    ![图3.15:上传两个known_structure文本文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_15.jpg)

    图3.15:上传两个known_structure文本文件

  11. 设置权限设置属性选项卡中点击下一步。在审查选项卡中选择上传:![图3.16:Amazon S3上传文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_16.jpg)

    图3.16:Amazon S3上传文件

  12. 导航到Amazon S3主屏幕:![图3.17:Amazon S3

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_17.jpg)

    图3.17:Amazon S3

  13. 接下来,创建一个输出S3桶。使用相同的S3桶创建过程。为此,点击创建桶按钮:![图3.18:创建桶

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_18.jpg)

    图3.18:创建桶

  14. 现在,命名桶,然后点击创建按钮:![图3.19:为主题建模创建桶输出

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_19.jpg)

    图3.19:为主题建模创建桶输出

  15. 配置选项下点击下一步,在设置权限下点击下一步,在审查窗口中点击创建桶

    现在,你有了两个桶,一个用于输入,包含两个文本文件,另一个输出桶为空。现在让我们继续使用Amazon Comprehend。

  16. 导航到Amazon Comprehend:https://console.aws.amazon.com/comprehend/. 如果您看到以下屏幕,请点击启动Amazon Comprehend:![图3.20:Amazon Comprehend主页

    图片

    图3.20:Amazon Comprehend主页

  17. 现在,在左侧工具栏中点击第一个分析作业选项(不是Amazon Comprehend Medical下的那个):![图3.21:Amazon Comprehend组织屏幕

    图片

    图3.21:Amazon Comprehend组织屏幕

  18. 现在,点击创建作业按钮:![图3.22:Amazon Comprehend创建作业按钮

    图片

    图3.22:Amazon Comprehend创建作业按钮

  19. 名称字段中输入known_structure_topic_modeling_job:![图3.23:主题建模作业名称

    图片

    图3.23:主题建模作业名称

  20. 分析类型下拉框中选择主题建模:![图3.24:选择分析类型(主题建模)

    图片

    图3.24:选择分析类型(主题建模)

  21. 现在,滚动到输入数据选项卡,然后点击浏览S3:![图3.25:点击搜索以定位主题建模输入数据源

    图片

    图3.25:点击搜索以定位主题建模输入数据源

  22. 将显示S3存储桶列表:![图3.26:选择输入存储桶

    图片

    图3.26:选择输入存储桶

  23. 选择输入存储桶(在我的情况下,它是aws-ml-input-for-topic-modeling-20200301),然后点击存储桶。然后,文件夹将显示:![图3.27:选择输入文件夹

    图片

    图3.27:选择输入文件夹

  24. 点击known_structure旁边的单选按钮,然后点击Choose按钮,这将带您到以下屏幕:![图3.28:输入数据部分,已填写S3位置

    图片

    图3.28:输入数据部分,已填写S3位置

  25. 现在,从下拉菜单中选择每个文件一个文档:![图3.29:选择每个文件一个文档

    图片

    图3.29:选择每个文件一个文档

  26. 现在,为所需的主题数量输入2:![图3.30:输入2以执行主题建模

    图片

    图3.30:输入2以执行主题建模

  27. 接下来,在输出数据选项卡中点击浏览S3:![图3.31:输出数据选项卡和用于主题建模S3输出位置的浏览S3按钮

    图片

    图3.31:输出数据选项卡和用于主题建模S3输出位置的浏览S3按钮

  28. 选择输出存储桶(在我们的情况下,它是aws-ml-output-for-topic-modeling-20200301),然后点击Choose:![图3.32:选择输出S3存储桶

    图片

    图3.32:选择输出S3存储桶

  29. 确保输出数据标签页看起来与以下截图类似:![图3.33:带有输出存储桶名称的输出数据标签页

    图片

    图3.33:带有输出存储桶名称的输出数据标签页

  30. 滚动到“访问权限”标签页,然后选择“创建IAM角色”选项:![图3.34:选择创建IAM角色并提供访问权限

    输入和输出S3存储桶

    图片

    图3.34:选择创建IAM角色并为输入和输出S3存储桶提供权限

    确认“输入和输出S3存储桶”列在“访问权限”下:

  31. 在“名称后缀”字段中输入myTopicModelingRole,然后点击“创建作业”按钮:![图3.35:点击创建作业按钮

    图片

    图3.35:点击创建作业按钮

  32. 创建作业可能需要几分钟,您可能会看到消息“传播IAM角色,请留在页面上。”一旦创建完成,您将被重定向到Comprehend主屏幕,如下所示:![图3.36:Comprehend主屏幕

    图片

    图3.36:Comprehend主屏幕

    注意

    请记住,点击“创建作业”也会启动作业。没有单独的“启动作业”按钮。此外,如果您想重新做作业,您将不得不使用“复制”按钮。

  33. 在作业处理过程中,显示的状态将是“进行中”:![图3.37:显示进行中状态

    图片

    图3.37:显示进行中状态

  34. 在我们的账户上,完成这项工作大约需要4分钟。当状态变为“完成”时,点击主题建模作业名称:![图3.38:显示完成状态

    图片

    图3.38:显示完成状态

  35. 现在,滚动到“输出”部分:![图3.39:主题建模输出显示主屏幕

    图片

    图3.39:主题建模输出显示主屏幕

  36. 点击“数据位置”下的超链接:![图3.40:主题建模数据输出超链接位置

    图片

    图3.40:主题建模数据输出超链接位置

    这将直接带您到S3存储桶:

    ![图3.41:S3中的主题建模输出文件

    图片

    图3.41:S3中的主题建模输出文件

  37. 点击“下载”并将文件保存在您的本地磁盘上。通常,“下载”文件夹是一个理想的位置:![图3.42:将主题建模输出文件下载到本地磁盘

    图片

    图3.42:将主题建模输出文件下载到本地磁盘

  38. 解压output.tar.gz,通常它将出现在output目录中:![图3.43:主题建模的输出文件

    图片

    图3.43:主题建模的输出文件

  39. 现在检查两个文件:topic-terms.xlsxdoc-topics.xlsx

    注意

    你的 topic-terms.csvdoc-topics.csv 结果应与以下结果相同。如果你的结果不同,请使用本章剩余部分提供的输出文件,这些文件位于 Chapter03/Exercise3.01/topic-terms.csv https://packt.live/3iHlH5yChapter03/Exercise3.01/doc-topics.csv https://packt.live/2ZMTaTw

    以下为生成的输出。正如我们之前所指示的,我们希望有主题,Comprehend 已经将相关词汇分成了两个组/主题以及权重。它不知道这些主题是什么,但已经推断出词汇与两个主题中的一个的相似性:

    ![图 3.44:topic-terms.csv 结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_44.jpg)

图 3.44:topic-terms.csv 结果

doc-topics.csv 显示文档与主题的亲和力。在这种情况下,它是非常确定的,但如果我们有更多主题,比例将显示每个文档中主题的强度:

![图 3.45:doc-topics.csv 结果

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_45.jpg)

图 3.45:doc-topics.csv 结果

在这个练习中,我们使用了 Amazon Comprehend 来推断一组文档中嵌入的主题。虽然对于两个文档来说这更容易做到;当有数百个文档,且我们想要进行流程自动化时,Amazon Comprehend 非常有效。

练习 3.02:以编程方式执行已知结构分析

当我们查看一个或两个输出时,很容易;当我们想要扩展并分析具有不同主题的数百个文档时,我们需要使用 Comprehend 进行编程。这正是我们将在这个练习中做的。

在这个练习中,我们将以编程方式上传 CSV 文件(doc-topics.csvTopic-terms.csv),在 S3 上合并主题列的 CSV 文件,并将输出打印到控制台。以下是执行已知结构分析的步骤:

注意

对于这一步,你将使用 Jupyter Notebook。你可以跟随练习并输入代码,或者从源代码文件夹 local_csv_to_s3_for_analysis.ipynb 中获取它,并将其粘贴到编辑器中。源代码可在以下 GitHub 仓库中找到:https://packt.live/2BOqjWT。正如 第 1 章 中所解释的,AWS 简介,你应该已经将仓库下载到本地磁盘。

  1. 首先,我们将使用以下命令导入 boto3

    import boto3
    
  2. 接下来,我们将使用以下命令导入 pandas

    import pandas as pd
    
  3. 现在,我们将使用以下命令创建 S3 客户端对象:

    # Setup a region
    region = 'us-west-2'
    # Create an S3 client
    s3 = boto3.client('s3',region_name = region)
    
  4. 接下来,我们将创建一个具有唯一存储桶名称的变量。在这里,选定的存储桶名称是 known-tm-analysis,但你需要创建一个唯一的名称:

    # Creates a variable with the bucket name
    #'<insert a unique bucket name>'
    bucket_name = 'known-tm-analysis-20200302'
    
  5. 接下来,创建一个新的存储桶:

    # Create a location Constraint
    location = {'LocationConstraint': region}
    # Creates a new bucket 
    s3.create_bucket(Bucket=bucket_name,\
                     CreateBucketConfiguration=location)
    
  6. 创建要导入的 CSV 文件名列表:

    filenames_list = ['doc-topics.csv', 'topic-terms.csv']
    

    注意

    确保上述步骤中提到的两个CSV文件(突出显示)存储在与您运行Jupyter Notebook代码相同的同一位置。另一种选择是指定在您的本地系统上存在的确切路径。

  7. 现在,使用以下代码行迭代每个文件以上传到S3:

    for filename in filenames_list:
        s3.upload_file(filename, bucket_name, filename)
    

    注意

    还不要执行步骤7步骤8。我们将在步骤9中展示整个for块的代码。

  8. 接下来,检查文件名是否为doc-topics.csv:并获取doc-topics.csv文件对象,将其分配给obj变量。

        if filename == 'doc-topics.csv':
            obj = s3.get_object(Bucket=bucket_name, Key=filename)
    
  9. 接下来,读取csv对象并将其分配给doc_topics变量。您可以看到包括以下步骤7步骤8在内的整个代码块:

    for filename in filenames_list:
        # Uploads each CSV to the created bucket
        s3.upload_file(filename, bucket_name, filename)
        # checks if the filename is 'doc-topics.csv'
        if filename == 'doc-topics.csv':
            # gets the 'doc-topics.csv' file as an object
            obj = s3.get_object(Bucket=bucket_name, Key=filename)
            # reads the csv and assigns to doc_topics 
            doc_topics = pd.read_csv(obj['Body'])
        else:
            obj = s3.get_object(Bucket=bucket_name, Key=filename)
            topic_terms = pd.read_csv(obj['Body'])
    
  10. 现在,使用以下命令将主题列上的文件合并,以获取每份文档中最常见的术语:

    merged_df = pd.merge(doc_topics, topic_terms, on='topic')
    # print the merged_df to the console
    print(merged_df)
    
  11. 接下来,使用Shift + Enter键执行笔记本单元格:

  12. 控制台输出是一个合并的DataFrame,它提供了具有相应术语的docnames以及术语的权重(参见图以下):![图3.46:s3.create_bucket调用的输出

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_46.jpg)

    图3.46:s3.create_bucket调用的输出

    ![图3.47:已知的结构主题建模合并结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_47.jpg)

    图3.47:已知的结构主题建模合并结果

  13. 为了验证CSV文件,导航到S3(如果新存储桶没有出现,请重新加载页面),新的存储桶已在S3中创建。点击存储桶以验证成功导入:![图3.48:已知的tm-analysis S3存储桶

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_48.jpg)

图3.48:已知的tm-analysis S3存储桶

存储桶中将有两个CSV文件 - doc-topics.csvtopic-terms.csv

![图3.49:上传到S3的主题建模结果

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_49.jpg)

图3.49:上传到S3的主题建模结果

在这个练习中,我们学习了如何使用Comprehend进行编程。我们编程上传了两个CSV文件到S3,在列上合并它们,并将输出打印到控制台。

活动3.01:对一组未知主题的文档执行主题建模

在这个活动中,我们将对一组未知主题的文档执行主题建模。假设您的雇主希望您构建一个数据管道来分析存储在具有唯一ID文件名的单个文本文件中的负面电影评论。因此,您需要执行主题建模以确定哪些文件代表相应的主题。总的来说,负面评论对公司来说是一种损失,所以他们优先考虑负面评论而不是正面评论。公司的最终目标是将这些数据整合到反馈聊天机器人应用程序中。为了确保这一点,您需要一个包含负面评论的文件。这个活动的预期结果将是负面电影评论文件的主题建模结果。

执行主题建模:

  1. 导航到以下链接(或您已下载GitHub文件的本地目录)以获取包含负面评论的文本数据文件:https://packt.live/38Nw4jT

  2. 使用唯一名称为主题建模创建一个存储桶。

  3. 为主题建模创建一个文件夹。

  4. 导入Python库的依赖项,例如osboto3

  5. 提及您的唯一存储桶名称。

  6. 收集所有本地路径的工作目录并将它们转换为文本文件。

  7. 为所有文本文件创建一个列表。

  8. 遍历文件并将它们上传到S3。

  9. 使用Amazon Comprehend在组织中创建一个作业。

  10. 根据要求选择输入数据。这可能是指我的文档示例文档

  11. 从数据源中选择文件。

  12. 应用输入格式。

  13. 提供要执行建模的主题数量。

  14. 选择一个IAM角色并创建一个作业。

  15. 下载输出文件并提取文件。

  16. 生成的输出将包括两个CSV文件。

    未知主题分析:

  17. 导入Python库的依赖项,例如boto3pandas

  18. 创建一个S3客户端。

  19. 使用唯一名称创建一个新的存储桶。

  20. 创建一个CSV文件名列表以导入。

  21. 检查文件名并将其分配给obj变量。

  22. 读取obj变量。

  23. 合并主题列上的文件。

  24. 将合并的文件打印到控制台。

这是一个漫长的活动。然而,你能够管理1,000个文件,将它们上传到S3,使用Amazon Comprehend进行主题建模,然后将结果合并到一个包含超过40,000行的表中。在现实世界的情况下,你将处理数千份文档,而不仅仅是几份。这就是我们为什么使用Jupyter Notebook和Python来完成这个活动的原因。

然而,这只是一个多步骤自动化过程的第一步——对非结构化文档进行推理的重要且基本步骤。虽然Comprehend分析了文档并给出了主题列表,但确定如何处理这些主题仍然是我们的工作。

注意

该活动的解决方案可以在第291页找到。

摘要

在本章中,我们学习了如何分析AWS Comprehend的主题建模结果。你现在能够将S3用于存储数据并用于分析。我们还学习了如何在执行主题建模之前分析已知主题的文档以及主题未知文档的方法。我们知道后者需要额外的分析来确定相关主题。

我们没有构建分析主题列表并适当路由文档的下游系统。例如,你可能有一个将主题映射到用于知识管理的SharePoint文件夹的映射,或者一个根据检测到的主题通过电子邮件将文件路由到适当人员的流程。虽然更广泛的机器人流程自动化(RPA)主题超出了本书的范围,但你已经学会了如何使用Amazon Comprehend来实现流程自动化的主题和主题检测步骤。

本章所学知识的另一个应用是用于知识管理的文档聚类。在这种情况下,我们将主题数量限制为10个,然后根据主要主题对文档进行分类。例如,如果这些文档是新闻文章,这个过程将文章分为10个主题,这有助于在下游系统(如新的推荐引擎)中处理。

如你所见,主题建模可以应用于各种应用和系统。现在你已经拥有了使用Amazon Comprehend进行主题建模所需的技能。

在下一章中,我们将深入探讨聊天机器人的概念及其在自然语言处理中的应用。

第四章:4. 对话式人工智能

概述

本章教你如何使用Amazon Lex设计聊天机器人。你将从学习对话式人工智能的基础以及使用该技术设计定制聊天机器人的最佳实践开始。然后,你将使用Amazon Lex创建一个自定义聊天机器人,通过识别文本中的意图来获取最新的股市报价。到本章结束时,你将熟练掌握聊天机器人的基础知识以及设计它们的过程。利用这些知识,你将能够创建自己的聊天机器人来解决各种商业挑战。

对话式人工智能简介

与本书中的其他章节一样,本章涵盖了概念方面以及实用的动手构建——这次,领域是对话式人工智能。从许多报告中可以看出,对话式人工智能市场将每年增长超过30%,并且大多数客户以及员工都将与数字助手进行互动。

创建响应性、智能和交互式机器人的挑战在于,对于机器来说,对话是非常难以实现的。让我们看看为什么这是这种情况的前三个原因:

  • 对话只传达必要的信息——从对话中得出的大多数信息甚至不在对话中。这是因为人类拥有常识、推理、共享的上下文、知识和假设。我们还通过语气、面部表情甚至非言语交流(即肢体语言)赋予对话丰富的含义。这些因素使得对话难以理解,尽管交换的词汇较少。因此,只关注交换的词汇的对话式人工智能可能错过了90%的嵌入信息。

  • 这不仅仅是一系列计算机算法——计算机理论观点只是对话交换的一部分。我们还需要结合语言学、对话含义和其他领域。再次强调,这对计算机来说是一个非常困难的任务——它们在神经网络方面做得很好,但在语法方面就不那么擅长了。

  • 消费者被极好的对话交互所宠坏。虽然对话领域非常复杂,但像Alexa、Siri和Google Assistant这样的产品在对话式人工智能方面取得了巨大的进步。这给基于对话式人工智能开发交互业务的企业带来了一定的高期望。即使是围绕对话交互的最普通任务,消费者也期望达到Alexa、Siri或Google Assistant的复杂程度。因此,你的对话系统必须跨越这个障碍。

这很自然地引出了本章的开始:Amazon Lex 使用与 Alexa 相同的技术,而 Amazon Contact Center 使用 Amazon Connect,这意味着我们可以部署他们的最佳实践。实际上,Amazon Connect 是为了满足他们客户服务部门的严格要求而开发的。所以,我们很幸运——我们可以利用我们的客户在日常生活中习惯的尖端交互。

交互类型

当我们谈论对话人工智能时,主要有两种类型——面向任务型和开放式对话。正如其名所示,面向任务型的对话旨在完成任务(例如,查询账户余额、订购商品、查看天气、查看股票价格、了解剩余的假期天数等)。开放式一般对话更广泛,因为它们涵盖了各种主题——这可能是天气、电影、财务状况、投资等等。在本章中,我们将专注于面向任务型的对话。

全渠道

另一个需要记住的是对话的全渠道方面——可以通过聊天机器人的文本界面或语音用户界面(VUI)进行对话;它们可以从一个跳转到另一个,而且随着新的视觉 IVR 概念的出现,它们甚至可能是并行的。这就是为什么我们将在本章中先介绍聊天机器人,然后介绍语音。多模态是对话人工智能的一个重要组成部分。

简而言之,在本章中,你将学习如何使用 Amazon Lex 构建聊天机器人。我们还将涵盖对话人工智能的设计。然后,我们将深入研究 Amazon Connect 并探索为我们的机器人添加语音。首先,我们将讨论如何设计聊天机器人。然后,我们将通过创建一个示例聊天机器人来深入了解 Amazon Lex 服务。

什么是聊天机器人?

聊天机器人是面向任务型对话人工智能的一个具体实例——目标是能够与用户进行对话,达到解决客户查询、执行客户请求的任务或建议从他们那里前进的方式所需的程度。

正如正常对话一样,我们与机器人互动的方式可以是书面文字或语音。通常,聊天机器人会集成到消息平台中,如 Slack、Facebook、Kik 和微信。这也可以集成到自定义的网页或移动界面中。

当然,在现有的消息平台中集成更容易,因为用户可能熟悉该界面。此外,这些平台为聊天机器人开发者提供基础设施和开发工具的支持。

聊天机器人的例子包括产品订购系统、报告、内部沟通和调度。

什么是自然语言理解?

自然语言处理(NLP)是一组处理自然语言技术的通用术语。自然语言理解(NLU)是 NLP 的一个专注于实际对话输入的子集。

NLU能够处理非结构化输入并将它们转换成结构化、机器可理解的格式。用户输入的词语会被转换成意图和实体,或者称为slots。NLU聊天机器人还能够从用户输入中推断意图和slots,这些可能与——但并不一定与——它所训练的例子相同。

核心概念概述

在我们开始构建聊天机器人之前,你首先需要了解一些概念。让我们来看看术语chatbot的技术含义以及构成聊天机器人并协同工作以向用户提供对话体验的各个组件的名称。

Chatbot

聊天机器人,也称为bot或人工对话实体,是一种能够使用自然语言与用户进行对话的软件。目标是让用户相信他们可以与机器人自由自然地互动,几乎就像与另一个人交谈一样。

Utterances

用户对机器人说的话被称为utterances。机器人将用户的utterances视为输入,并能够将其解析成机器可识别的格式。以下是一些utterances的例子:

  • 我想去看看牙医。

  • 你能告诉我今天的天气怎么样吗?

Intent

intent是指用户根据其utterances的内容想要做的事情。意图可以是一个单一步骤(例如,获取余额)或一个多步骤过程(例如,预订包括订票、订酒店、订交通等在内的旅行)。机器人从用户的utterances以及上下文中推断出意图,并根据其内部业务规则或应用程序流程支持它们,结果可能是其内部状态的变化或执行某个动作。这些通常也会导致向用户提供反馈或信息的响应。

因此,从先前的utterance例子中,机器人可能会推断出以下意图:

  • 我想去看看牙医 => SeeDentist。

  • 你能告诉我今天的天气怎么样吗? => GetWeather。

推断意图是NLU平台(如Lex)在幕后执行的重要部分。一系列训练示例,以用户可能提供的句子形式,被输入到平台中,并从这些例子中构建一个概率模型。这意味着在实践中,平台应该能够从输入中推断出正确的意图,这可能与——但不一定是——系统所训练的例子的一部分。

Prompts

当机器人需要从用户那里获取更多信息或对意图不清楚时,它可以询问用户后续问题,以便收集更多信息。这些被称为prompts。Prompts通常填充所需的slot值,尽管如果你的应用程序逻辑需要,也可以尝试填充可选值。

Slot

槽位是与意图相关联的信息或参数。信息可以包含在初始用户请求中,Lex 将能够解析出信息并将其正确分配给相应的槽位。如果此信息不是作为请求的一部分提供,那么机器人应该能够单独提示用户提供信息。槽位可以是可选的或必需的。

槽位所表示的信息类型称为槽位类型。Lex 中内置了许多槽位类型,代表常见的信息类型,例如城市或州。以下是一些常见的槽位类型示例,它们被纳入 Lex 中:

![图 4.1:Lex 内置的槽位类型表

图片 B16061_04_01.jpg

图 4.1:Lex 内置的槽位类型表

当然,这只是一个非常有限的示例子集。还有许多其他内置类型,以及不同语言的类型。

注意

您可以参考以下链接以获取内置意图和槽位的完整列表:https://docs.aws.amazon.com/lex/latest/dg/howitworks-builtins.html.

大多数内置的意图和槽位都作为 Alexa 技能套件文档的一部分进行了文档记录,Lex 中有一些差异,这些差异在先前的链接中有记录。请确保将链接添加到书签并定期参考该页面,因为亚马逊会不断更新服务,事情可能会发生变化。

如果您希望您的机器人处理的信息类型不是这些内置类型之一,您可以定义自己的类型,以及槽位允许的实际值。

满足

注意,机器人只有在填写了所有必需的槽位值后才能继续进行下一步。当然,这并不适用于可选的槽位值。

当一个意图的所有必需槽位都已填写时,槽位就准备好进行满足了。在这个阶段,机器人准备好执行满足意图所需的企业逻辑。企业逻辑可能是以下任何一种操作:

  • 内部状态的变化

  • 在内部运行代码

  • 调用一个内部或外部服务以从中获取信息

  • 调用一个内部或外部服务以向其发布信息

完成操作可以带有或没有对用户的反馈,但作为最佳实践,总是更好地偏向于提供更多的反馈给用户,而不是更少。

设计对话式人工智能的最佳实践

在我们深入探讨一些最佳实践之前,我们将简要介绍两个要点。我们只涵盖最重要的内容,并且有大量优秀的资料和书籍可供深入研究。其次,你可能会遇到需要忽略这些提示的情况——这可能包括交付压力和资源限制,但它们可能只是由于技术进步而错误。然而,我们需要意识到可能产生的潜在技术债务,并在某处记录下来以供未来参考。以下是一些最佳实践:

  1. 当思考机器人时,要考虑搜索,而不是单一的问题-答案会话。这需要一点思考——机器人应该想要理解用户的需求,并参与迭代协作互动,以促进用户寻找的内容。例如,用户可能会问“我有多少钱?”你可以将其解决到支票账户的余额,并给出答案。然而,用户可能基于股票提示想要投资,或者可能在考虑一笔大额购买。因此,一个后续问题,如“这合理吗?你在想什么?”可能是一个好的策略。一个典型的例子是问题“最近的餐厅在哪里?”对于这个问题,你可以基于距离给出一个临床正确的答案,但餐厅可能已经关闭。因此,自愿提供更多信息,如“最近的餐厅距离x分钟,但现在已关闭。你现在是否在寻找一家可以去的开放餐厅?”可能是一个好的回应。

  2. 对话是一个从简单的命令和通知到深层嵌套对话的连续体,如下面的图表所示:![图4.2:对话式AI的层次]

    图片

    图4.2:对话式AI的层次

    在当前技术的成熟度下,我们处于第3级——通过上下文机器人进行对话,这处于非常初级的阶段。理解这些层次并将你的机器人服务定位在连续统一体中对于估计可能性和所需努力非常重要,尤其是在用户期望方面。

  3. 将对话式AI——聊天机器人、语音助手或两者的结合,视为可用、智能和自主的交互。

  4. 一个机器人(聊天机器人、语音机器人,甚至是可视IVR)是一种体验。这意味着你需要开发一个最小令人喜爱的产品——它不应该过于雄心勃勃和复杂,拥有众多功能;同时,它也不应该过于狭隘,以至于不能完全发挥其作用。保持步骤简单,在确保它们完成所需任务的同时展示价值。

  5. 有一种误解认为机器人没有视觉品牌。对话式用户体验作为一种“透明”的用户体验,仍然提供了足够多的视觉元素,这些元素会影响你机器人的品牌形象。

  6. 监控、适应和改进 —— 话语监控日志是你的朋友。广泛使用分析来询问关于用户学习曲线的问题——用户需要多长时间才能理解机器人的功能范围?

  7. 视觉设计师在美学上花费时间,就像他们一样,对话设计师在编写适合你的机器人范围和受众的内容和功能上花费大量时间。我们说话的方式与我们写作的方式不同,所以你不能字面地将你的网站变成一个机器人。

  8. 考虑到参与三要素,即 吸引-参与-愉悦。对你的机器人目的和核心功能要有非常清晰和明确的认识。用 敏锐和意外 来惊喜你的用户。

  9. 机器人非常 迭代 —— 你必须随着你的学习和用户的进步不断改进它们。慢慢建立用户的信任和信心。持续向用户展示新功能;一个关于新功能的话题欢迎区是个好主意。或者,为原始问题建议新的上下文功能。

  10. 将机器人视为 门户 —— 服务的界面。你仍然需要后端来满足服务——查询等。

  11. 计划从真实用户那里学习并改进你的机器人。一旦你的助手能够处理几个愉快的路径故事,就是让它进入现实世界以引导开发方向的时候了。

  12. 遵循 格赖斯准则,即质量准则、数量准则(如所需的信息量,不要更多)、关系准则(或相关性——保持相关性)、方式准则(简短有序)和智慧准则。

创建自定义聊天机器人

在本节中,我们将创建一个自定义聊天机器人,使用 GetQuote 获取股票市场报价。这向机器人表明,例如,我们必须为给定的股票代码获取股票市场报价,该报价将驻留在名为 ticker 的槽位中。然后机器人将从名为 IEX 的免费金融API中查找该股票代码的报价,并通过对话响应将信息返回给用户:

注意

股票代码是表示在交易所(如纽约证券交易所或纳斯达克)交易的股票的标准方式。一系列字母代表正在交易的公司的股票。

![图 4.3:聊天机器人工作流程

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_03.jpg)

图 4.3:聊天机器人工作流程

我们可以为这个过程创建一个流程图,如下所示。让我们进一步详细地讨论它:

![图 4.4:聊天机器人工作流程流程图

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_04.jpg)

图 4.4:聊天机器人工作流程流程图

识别意图和填充槽位值

作为第一步,机器人等待用户的输入以识别一个有效的意图。当它从用户发布的言语中提取GetQuote意图作为意图时,它将尝试填充所需的槽位。在我们的例子中,我们只有一个StockTicker类型的槽位(这是一个自定义槽位类型)。机器人将发出提示,要求用户提供槽位的值,并解析用户响应的言语,以填充槽位值。

有效的槽位是系统可以识别的槽位。如果槽位值不是允许值列表的一部分,或者如果系统无法识别输入的槽位值,则称其为无效非有效

如果槽位值无效,它将回退到尝试填充槽位(至少尝试到我们指定的次数,然后放弃并返回开始)。一旦机器人用有效值填充了槽位,它就会继续满足意图。

使用Lambda函数满足意图

当默认的满足动作是将意图和槽值返回给用户,以便他们可以在自己的应用程序中继续处理时,我们选择在AWS上设置一个Lambda函数来处理意图并运行满足该意图所需的企业逻辑。

在这一点上,Lex中运行的机器人流程将继续调用我们编写并指定的Lambda函数:

Lambda_function.Lambda_handler

当Lex调用函数以满足需求时,它发送一个包含有关发送者、意图和槽位值的各种信息的JSON有效负载。Lambda_handler()方法从JSON有效负载中解析意图和槽位参数值,然后调度另一个函数调用,从外部API获取我们正在寻找的市场报价值。

最后,Lambda函数还将响应打包为另一个JSON字符串,并将其返回给Lex。Lex在幕后解析JSON响应,并将响应消息呈现给用户。

我们将在接下来的两个练习中更深入地探讨所有这些元素。在第一个练习中,我们将设置新的聊天机器人,在第二个练习中,我们将实现我们的Lambda处理程序函数,以便它返回用户请求的股票代码的实际市场价格。

识别意图并填充槽位的机器人

在下一个练习中,你将创建一个自定义聊天机器人,该机器人可以识别名为GetQuote的意图,以便为给定的股票代码获取市场价格报价。机器人将提示用户输入他们感兴趣的股票代码的值,直到槽位被填充。你还将学习如何在同一句话中声明意图和填充槽位。这个聊天机器人可以通过对话界面进行测试。

练习4.01:创建一个能够识别意图并填充槽位的bot

在这个练习中,我们将创建并测试一个基于Amazon Lex的自定义意图和槽位的bot。创建具有自定义意图和槽位的bot必须执行的步骤如下:

  1. 第一步是从亚马逊管理控制台导航到Amazon Lex服务。通常,这需要访问aws.amazon.com,然后是我的账户,然后点击AWS管理控制台

  2. 您可以通过在机器学习下的Amazon Lex处点击来选择服务

  3. 下一步是选择创建按钮。这将带您进入bot创建屏幕:![图4.5:Amazon Lex控制台

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_05.jpg)

    图4.5:Amazon Lex控制台

  4. 在这一点上,您可以通过点击自定义bot选项按钮来创建一个自定义bot。这将揭示bot的详细信息,可以填写,如下面的截图所示:![图4.6:自定义bot选项

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_06.jpg)

    图4.6:自定义bot选项

  5. bot名称字段可以设置为MarketNanny。这是仅基于文本的应用程序,因为我们在这个部分只会用文本与bot交互,而不会使用语音。

    会话超时可以设置为默认的5分钟。IAM角色字段显示IAM角色的名称,Lex会自动创建该角色以供bot应用程序使用。让我们将情感分析设置为

  6. 最后,COPPA字段与相关。然而,如果您是13岁以下的在校学生或打算让13岁以下的某人使用您的聊天机器人,那么您应该点击选项。

    注意

    1998年通过了一项法律来保护13岁以下的儿童隐私。它规定,在线网站在没有父母同意的情况下,不得收集13岁以下用户的个人信息,以及其他规定。您可以在https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule了解更多关于COPPA法案的信息。

  7. 最后,点击槽类型

  8. 点击创建意图按钮以弹出添加意图对话框:![图4.7:MarketNanny bot编辑器

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_07.jpg)

    图4.7:MarketNanny bot编辑器

  9. 相反,如果您已经定义了意图,您可以通过点击屏幕左侧列中意图标题旁边的+号来创建一个新的意图。

  10. 创建意图窗口提供了一些选项,我们可以使用这些选项将意图添加到bot中。包含一个或多个Lex格式意图的JSON文件的ZIP文件。

  11. 搜索现有意图允许您重用您可能之前定义或导入的意图,以及由Amazon Lex定义的内置意图。

  12. 点击创建意图链接以进入以下步骤中显示的对话框。

  13. 创建意图对话框中,将您的新意图命名为GetQuote。当您告诉机器人您对市场报价感兴趣时,机器人将识别此意图。点击添加按钮以完成此步骤:![图4.8:创建意图屏幕

    图片

    图4.8:创建意图屏幕

  14. 此时,您应该回到编辑器屏幕,您应该看到屏幕左侧工具栏部分的GetQuote意图,如以下截图所示。编辑器屏幕还包含一些用于定义和自定义新意图的字段。

  15. 首先要做的是填写一些样本语句来训练Lex背后的NLU系统,以便识别您提供给机器人的语句作为GetQuote意图的信号:![图4.9:创建意图

    图片

    图4.9:创建意图

  16. 在输入一些样本语句后,点击页面顶部附近的构建按钮以启动机器人的训练过程:![图4.10:构建机器人

    图片

    图4.10:构建机器人

  17. 将会出现一个后续的对话框,其中还有一个构建按钮,您也应该点击:![图4.11:构建确认

    图片

    图4.11:构建确认

  18. 之后,您应该等待,直到您看到MarketNanny构建成功的消息框。这可能需要几秒钟到几分钟的时间:![图4.12:机器人构建成功

    图片

    图4.12:机器人构建成功

    您可以在屏幕右上角的测试机器人面板中测试您的新意图。

    注意

    如果测试机器人面板不可见,您可能需要点击一个箭头按钮来展开它并使其可见。

  19. 在面板中输入语句以验证机器人能否从语句中识别出正确的意图:![图4.13:测试机器人

    图片

    图4.13:测试机器人

  20. 当它返回以下响应时,你知道它已经正确识别了意图:Intent GetQuote is ReadyForFulfillment。请随意根据您的样本语句进行实验,以验证GetQuote意图及其已准备好执行的状态。这是因为我们尚未为此意图添加任何槽位。

  21. 您的下一步将是添加一个槽位,以及为该槽位添加一个自定义槽位类型:![图4.14:添加槽位

    图片

    图4.14:添加槽位

  22. 添加槽位类型。这可以通过在编辑器屏幕左侧工具栏部分旁边按下+按钮来完成。这会弹出一个添加槽位类型对话框,我们也可以选择像之前使用意图一样使用Lex的JSON结构来导入槽位类型。然而,在我们这样做之前,我们将点击创建槽位类型链接来创建一个新的槽位类型:![图4.15:创建槽位类型

    图片

    图4.15:创建槽位类型

  23. 在弹出的添加槽位类型对话框中,输入槽位类型名称为StockTicker。这是我们正在定义的槽位类型的名称。可选地,你可以在描述字段中输入描述,并将槽位解析选项保留为展开值

  24. 字段下,输入一些股票代码符号,如图所示,以提供StockTicker槽位类型的示例值。如果你愿意,也可以添加一些自己的:![图 4.16:添加槽位类型

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_16.jpg)

    图 4.16:添加槽位类型

  25. 最后,点击添加 槽位到意图按钮,以将槽位类型添加到意图中,并关闭对话框。

  26. 我们也可以点击保存槽位类型按钮,并在单独的步骤中将槽位添加到意图中,但使用按钮是完成这两个动作的单步快捷方式。

  27. 当你关闭对话框时,你会在槽位部分找到Lex添加的新槽位条目,它有用地预先填充了StockTicker槽位类型,你应该在条目的名称字段中将槽位名称更改为ticker

  28. 点击提示字段下的轮盘,将其展开到一个新的对话框:![图 4.17:编辑对话框

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_17.jpg)

    图 4.17:编辑对话框

  29. 提示编辑对话框(命名为股票代码提示或股票代码设置)允许我们为槽位输入提示,机器人将使用这些提示来存储用户的输入以及用户在机器人试图通过提示从用户那里获取信息时通常会提供给机器人的示例言语

  30. 槽位值在相应言语中的位置由花括号 {} 和括号内的槽位名称表示。在这种情况下,由于槽位名称为ticker,在示例言语中用 {ticker} 表示。

  31. 提示部分填写提示(一个提示就足够了——如果你添加更多提示,机器人将随机使用它们,以增加多样性)。

  32. 然后,在相应的言语部分添加一些言语,在每个示例语句中使用占位符令牌 {ticker} 表示槽位值。

  33. 最大重试次数字段保留为默认值2。这意味着它将尝试获取槽位值两次,然后才会发出错误信号:![图 4.18:股票代码提示屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_18.jpg)

    图 4.18:股票代码提示屏幕

  34. 接下来,点击保存按钮以保存槽位提示和相应的言语定义。

  35. 最后,点击屏幕底部的保存 意图按钮,然后点击屏幕顶部的构建按钮,以启动使用我们定义的新槽位和槽位类型的训练过程。等待训练完成后显示完成对话框:![图 4.19:保存意图

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_19.jpg)

    图 4.19:保存意图

  36. 您更新的意图现在可以在“测试机器人”面板中进行测试:![图4.20:更新后的意图测试机器人

    ![img/B16061_04_20.jpg]

    图4.20:更新后的意图测试机器人

  37. 在机器人流程结束时,当所有需要的信息都已填写完毕,它将以之前相同的格式返回意图。然而,它随后又跟了一条包含槽位参数名称和值的行:

    ticker:GOOG
    
  38. 这表明股票槽位已被填充为GOOG值。所以,太好了;我们的带槽位意图正在工作。

  39. 当你在与机器人玩耍以验证意图和槽位是否按预期工作的时候,为什么不尝试点不同的事情呢?输入一些不是你之前输入以训练机器人的样本语句的语句。

  40. 以“我能得到一个市场报价吗?”作为你的初始语句,看看机器人是否能识别出意图。记住,尽管这个句子与样本语句相似,但它并不是那些语句之一:![图4.21:测试机器人屏幕

    ![img/B16061_04_21.jpg]

    图4.21:测试机器人屏幕

    如前一个屏幕截图所示,Lex不仅能够从它没有训练过的语句中识别出正确的意图,而且还能正确地将它之前没有见过的符号(ADP)识别为股票槽位的值。

  41. 现在,让我们尝试通过在句子中插入一个随机的插入语作为句子的一部分,来为槽位提示尝试一种对应的对话形式,再次使用一个新股票代码符号(VZ),这个符号是机器人之前没有训练过的。再次,它被正确处理和识别:![图4.22:测试机器人屏幕

    ![img/B16061_04_22.jpg]

图4.22:测试机器人屏幕

显然,在训练和真实世界的对话输入之间,使用NLU引擎有很大的灵活性。

自然语言理解引擎

NLU展示了使用在大量对话句子上训练并形成大型推理模型的NLU引擎的优势。

它能够连接与它专门训练的句子不同的句子。事实上,它们可以非常不同,但模型足够大,可以推断出语义含义是相似的。

你可以使用一个技巧来让用户更容易与你的机器人互动。你可以用建立意图的相同语句填充槽位值。这可以通过简单地包括槽位占位符令牌(在这个例子中是{ticker})在你的样本语句中来实现。执行以下步骤:

  1. 按照以下方式向您的GetQuote意图添加一个新的样本语句:![图4.23:GetQuote屏幕

    ![img/B16061_04_23.jpg]

    图4.23:GetQuote屏幕

  2. ticker占位符标记表示该槽位可以直接在初始话语中填充,并且在这种情况下,不需要生成提示:![图4.24:机器人的构建屏幕

    图片

    ![图4.24:机器人的构建屏幕

  3. 点击“构建”按钮,像以前一样训练您的更新意图,然后在“测试机器人”面板中测试它,如下所示:![图4.25:测试机器人屏幕

    图片

![图4.25:测试机器人屏幕

您可以看到意图已准备好满足,并且槽位值已适当填充,只需一步即可。

我们现在已经完成了在Amazon Lex中定义自定义聊天机器人的过程,包括自定义意图、槽位类型和槽位。此外,我们还训练并测试了机器人,以验证它能够以高度准确度对正确的意图进行分类,并从会话输入中正确推断槽位值。

最后,我们添加了一种快捷方法,通过在训练NLU引擎的示例话语中插入槽位值的占位符标记,直接在初始话语中填充槽位值。

Lambda函数 - 实现业务逻辑

您可以创建AWS Lambda函数,这些函数可以从您的Amazon Lex机器人触发。正如我们在第2章中讨论的,使用自然语言处理分析文档和文本,无服务器计算和Lambda函数非常适合在Lex机器人中实现满足和验证功能。Lambda函数与返回到后端应用程序的每个步骤(如验证)相比,集成更好、更快,并且扩展性更好。一旦验证了意图并且您对参数满意,您就可以调用后端API来满足请求。您可以将简单的满足请求实现为Lambda函数,从而使您的机器人响应迅速且可扩展。

在下一个练习中,您将学习如何在AWS中将机器人的业务逻辑作为Lambda函数实现,并调用一个真实的REST API以获取您可以从外部服务返回给用户的信息。

练习4.02:创建处理聊天机器人满足的Lambda函数

在这个练习中,我们将使用在AWS上创建和部署的Lambda函数来处理聊天机器人满足业务逻辑。在前一个练习中,我们创建了一个具有GetQuote意图和ticker槽位的聊天机器人。执行以下步骤以实现业务逻辑:

  1. 通过AWS管理控制台 - 服务导航到计算下的AWS Lambda屏幕。

  2. 如果您以前从未使用过Lambda,您应该会看到一个欢迎屏幕:![图4.26:AWS Lambda启动屏幕

    图片

    图4.26:AWS Lambda启动屏幕

  3. 点击“创建函数”按钮开始。

  4. 在下一页选择“从零开始创建作者”选项:![图4.27:选择作者

    图片

    ![图4.27:选择作者

  5. 对于运行时,从下拉菜单中选择 Python 3.6,因为你将在这个练习中使用 Python 语言实现处理程序。在 Name 字段中填写 marketNannyHandler:![图 4.28:填写值

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_28.jpg)

    图 4.28:填写值

  6. 点击 Choose or create an execution role 并选择角色字段。然后,选择 Create a new role from AWS policy templates 单选按钮:![图 4.29:角色选择屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_29.jpg)

    图 4.29:角色选择屏幕

  7. Role name 字段中输入名称 marketNannyProcessorRole。然后,点击 Create function 按钮在 AWS 中创建 Lambda 函数。你应该会看到一个确认屏幕,如下所示:![图 4.30:确认屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_30.jpg)

图 4.30:确认屏幕

在这个练习中,你学习了如何使用在 AWS 上创建和部署的 Lambda 函数处理聊天机器人满足业务逻辑。

实现Lambda函数

在这里,你将完全在行内使用 Lambda 函数编辑器,这意味着你可以直接输入和修改代码,而无需将任何文件上传到 AWS。你输入的代码将在 Lambda 函数被调用时执行:

![图 4.31:函数代码屏幕

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_04_31.jpg)

图 4.31:函数代码屏幕

首先,让我们看看 Lambda 函数的结构。

当你创建 marketNannyHandler 函数时,AWS 创建了一个具有相同名称的文件夹,文件夹中包含一个名为 Lambda_function.py 的 Python 文件。这个文件包含 Lambda_handler 函数的占位符,这是我们的 Lambda 函数的入口点。入口点接受两个参数作为参数:

  • 事件参数提供了从调用进程发送到函数的负载值。它通常以 Python dict 类型的形式出现,尽管它也可能是 liststrintfloatNoneType 之一。

  • 上下文参数是 LambdaContext 类型,包含运行时信息。在这个练习中你将不会使用此参数。

函数的返回值可以是 JSON 可序列化的任何类型。这个值在序列化后返回给调用应用程序。

输入参数结构

现在,让我们更仔细地看看传递给 Lambda_handler 函数的事件参数的结构。如果我们请求一个具有 GOOG 标记值的股票报价,参数中意图部分的 JSON 值将如下所示:

{
    …
    "currentIntent": 
    {
        "name": "GetQuote", 
        "slots": 
        {
            "ticker": "GOOG"
        },
    …
    }
}

我们在处理过程中感兴趣的相关值是 namecurrentIntent 下的 slots 部分中的单个 ticker 值。

由于我们的 JSON 输入被转换为 Python 字典,我们可以在 Lambda 函数中如下获取这些值:

event['currentIntent']['name']
event['currentIntent']['slots']['ticker']

实现高级处理函数

注意

lambda_function.py 文件包含完整的源代码。它可在 GitHub 上找到,网址为 https://packt.live/2O8TUwA。你可以在 Lambda 编辑器中输入代码时参考它。我们在本例的末尾包含了调试技巧。在开始实现之前,先阅读示例以及技巧可能是个好主意。

实现我们处理器的第一步是识别意图名称并调用实现它的相应函数。这个伪代码看起来如下所示:

import json
def get_quote(request):
    return "Quote handling logic goes here."
def lambda_handler(event, context):
    # TODO implement
    print(event)
    intent = event['currentIntent']['name']
    if intent == 'GetQuote':
        return get_quote(event)
    return {
        'statusCode': 200,
        'body': \
        json.dumps("Sorry, I'm not sure what you have in mind. "\
                   "Please try again.")
    }

到目前为止,这已经足够完整,可以实际测试你的聊天机器人,如果你愿意的话,但让我们继续进行实现。

为了测试,你应该添加一个测试事件,如下面的说明所示:

前往“配置测试事件”:

图 4.32:配置测试事件下拉框

图片 B16061_04_32.jpg

图 4.32:配置测试事件下拉框

按照此处所示进行编辑。Lambda 函数需要如所示 JSON 结构:

图 4.33:编辑 Lambda 测试事件

图片 B16061_04_33.jpg

图 4.33:编辑 Lambda 测试事件

实现获取市场报价的函数

下一步将是实现 get_quote 函数,该函数负责获取市场报价信息并将其返回给调用处理函数:

def get_quote(request):
    Slots = request['currentIntent']['slots']
    ticker = Slots['ticker']
    price = call_quote_api(ticker)

注意,我们已将参数命名为 request,因此我们发送给函数的 object 事件在此函数中被称为请求。它包含相同的值和结构,只是重命名了。因此,我们可以通过获取具有 ticker 键的项的值来获取之前提到的股票槽的值,如下面的代码所示:

request['currentIntent']['Slots']

然后,我们调用 call_quote_api() 函数来检索股票项目的市场报价值。我们尚未实现 call_quote_api(),所以让我们接下来做这个。

我们将按照以下方式实现 call_quote_api 函数:

def call_quote_api(ticker):
    response = \
      urlopen('https://www.alphavantage.co/query?'\
              'function=GLOBAL_QUOTE&symbol={}'\
              '&apikey=3WIN88G0AVG7RZPX'.format(ticker))
    response = json.load(response)
    ''' Sample Response: \
        {'Global Quote': {'01\. symbol': 'AAPL', \
                          '02\. open': '316.2700', \
                          '03\. high': '318.7400', \
                          '04\. low': '315.0000', \
                          '05\. price': '318.7300', \
                          '06\. volume': '33454635', \
                          '07\. latest trading day': '2020-01-17', \
                          '08\. previous close': '315.2400', \
                          '09\. change': '3.4900', \
                          '10\. change percent': '1.1071%'}} '''
    return response['Global Quote']["05\. price"]

在这里,股票代码是股票参数的值(在这个特定示例中,它将是 GOOG)。我们使用 Alpha Vantage,它在网上提供了一个静态端点 https://www.alphavantage.co/ 来获取报价。我们还捕获了一个示例响应。你应该获取自己的 API 密钥。

由于它被实现为一个简单的 GET 请求,其中股票参数嵌入在 URL 中,包含 API 密钥,我们可以简单地使用 urllib.request 模块中内置的 urlopen 方法(我们记得要导入它)来接收包含股票嵌入其中的 URL 的响应。

由于响应也是 JSON 格式,我们需要导入 json 模块 并使用 json.load 函数加载响应。我们感兴趣的响应中的唯一字段是 05. price,因此我们将其作为函数的返回值返回。

将信息返回给调用应用程序(聊天机器人)

现在我们已经得到了市场报价值,我们可以将其返回到我们的调用应用程序,即我们实现的聊天机器人。然而,我们还需要做一些小事情来返回这个值。首先,我们需要将其格式化为对话响应,如下面的字符串所示:

message = 'The last price (delayed) of ticker {} was {}'\
          .format(ticker, price)

这应该让聊天机器人显示以下消息:

The last price (delayed) of ticker GOOG was 1107.32

最后一步是构建一个包含我们的消息和其他一些信息的Amazon Lex JSON返回格式。我们将使用close辅助函数来完成此操作:

return close(message)

我们的close函数接受一个参数,即我们希望返回给聊天机器人的字符串(在这种情况下,这是消息变量的值)。它生成一个围绕内容的JSON包装器,符合我们的基于Lex的机器人所期望的结构,并从中提取内容并将其交付给用户。包装器的结构在此阶段并不重要,但如果你想了解,可以查看close函数的实现。如我们之前提到的,lambda-function.py文件包含Lambda函数的完整源代码。它可在GitHub上找到,网址为https://packt.live/2O8TUwA

代码窗口应如下所示:

![图4.34:代码窗口

图片

图4.34:代码窗口

连接到聊天机器人

到目前为止,唯一剩下的任务是将Lambda函数连接到聊天机器人并测试它。执行以下步骤来完成此操作:

  1. 返回到Amazon Lex仪表板并选择MarketNanny机器人:![图4.35:连接到机器人

    图片

    图4.35:连接到机器人

  2. 然后,向下滚动到Fulfillment部分并选择AWS Lambda函数选项。接下来,从Lambda函数下拉菜单中选择marketNannyHandler函数,并将版本或别名保留为默认值最新:![图4.36:确认提示

    图片

    图4.36:确认提示

  3. 通过点击构建按钮重建意图,并在测试聊天机器人面板中与Lambda处理程序一起测试聊天机器人:![图4.37:聊天机器人更新

    图片

    图4.37:聊天机器人更新

  4. 以下截图显示了与机器人交互以查找AAPL当前价格的过程:![图4.38:聊天机器人更新

    图片

图4.38:聊天机器人更新

调试技巧

这里有一些调试技巧可以帮助你:

  1. Lambda面板上的监控标签页的日志非常有用:![图4.39:CloudWatch指标

    图片

    图4.39:CloudWatch指标

  2. 日志收集在CloudWatch日志洞察中:![图4.40:CloudWatch日志洞察

    图片

    图4.40:CloudWatch日志洞察

  3. 如你所见,这需要我们进行多次尝试。我们在Lambda中使用了print语句来打印内容。以下屏幕截图显示了几个示例日志,以及Lex机器人的请求JSON的打印输出,以及来自股票报价API的http响应。这使得很容易看到各种信息片段是如何嵌套的:![图4.41:CloudWatch日志显示print语句的输出

    图片

    ![图4.41:CloudWatch日志显示print语句的输出

  4. 你可以在下面的屏幕截图看到我遇到的一个错误。股票API以嵌套JSON的形式返回值,因此你必须使用response ['Global Quote']["05\. price"],而不是仅仅使用response ["05\. price"]:![图4.42:CloudWatch日志显示KeyError

    图片

    ![图4.42:CloudWatch日志显示KeyError

  5. Lambda日志非常实用,能够捕捉错误。逐步开发并测试每一个变更。如果变动部分太多或变化频繁,调试将会变得困难。

  6. 适应AWS生态系统中的各种控制台、理解权限等需要一点时间,但如果你坚持不懈,你将收获好处。

摘要

我们本章从对话式人工智能的介绍开始,学习了该技术的不同方面如何帮助我们构建一个良好、有用的聊天机器人。我们还学习了一些核心概念,如话语、意图、情节等,这些是构建聊天机器人的基础。随后,在我们构建第一个聊天机器人之前,我们讨论了一些在设计对话式人工智能时非常有用的最佳实践。有了这些知识,我们进行了一次练习,创建了一个能够识别意图并填充槽位以检索股票价格的机器人。然后我们在AWS中创建了一个Lambda函数,帮助我们实现机器人的业务逻辑。在下一章中,我们将学习如何使用语音与聊天机器人交互。

第五章:5. 使用语音与聊天机器人

概述

在本章中,我们将学习 Amazon Connect 的基础知识。我们将探讨如何使用 Amazon Connect、Lex 和 Lambda 通过语音与聊天机器人进行交互。我们还将演示如何使用 Amazon Connect 创建个人呼叫中心。我们将学习如何为个人呼叫中心获取免费电话号码。我们还将了解如何使用 Amazon Connect 与 Amazon Lex 聊天机器人结合使用联系流程和不同的模板。到本章结束时,你将能够将呼叫中心连接到你的 Lex 聊天机器人。

Amazon Connect 基础知识

Amazon Connect 是 AWS(亚马逊网络服务)提供的一项服务,允许你创建基于云的呼叫中心。这意味着人们可以使用电话号码来联系该服务并与机器人或人类代表进行对话。在本章中,我们主要关注使用上一章构建的聊天机器人来自动化交互。

Amazon Connect 的一些关键特性如下:

  • 使用图形编辑器定义的工作流程,设置和连接 Connect 非常容易。

  • 没有基础设施需要部署或管理,因此呼叫中心可以快速扩展或缩减规模。

  • 这是一种按使用付费的服务,因此没有设置费或月费。我们将使用免费层,所以我们应该不需要支付任何费用来使用这项服务。对于商业用途,费用基于每分钟的费率。

  • Amazon Connect 部署在 42 个可用区域和 16 个地理区域内。

    免责声明

    不幸的是,Amazon Connect 并非在所有地区都可用。在设置 Amazon Connect 时,会提供一个本地电话号码,截至本书编写时(2020年4月),这项服务仅在美、英、澳、日、德和新加坡可用。好消息是亚马逊正在不断扩展其服务。因此,当你阅读这本书时,Amazon Connect 可能会在你所在地区可用。有关地区的表格请参阅 https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/

免费层信息

在整本书中,你只需要使用所提供服务的免费层。然而,了解免费使用的限制和其他层的定价非常重要。

你应该参考官方网页 https://aws.amazon.com/connect/。单个呼叫中心可能包括一定数量的 Amazon Connect 服务使用量和直接拨打号码,包括 60 分钟的入站和出站通话。这可能会根据你的区域设置而变化。

注意

对于这本书,你不需要使用免费层之外的服务。如果你超出了免费层的限制,亚马逊将根据在 https://aws.amazon.com/connect/pricing/ 发布的费率进行收费。

与聊天机器人交互

使用Connect通过语音与您的聊天机器人交互需要您首先在Connect中设置一个呼叫中心。呼叫中心获得一个免费的本地电话号码(或在美国的免费长途电话号码)。此号码可以连接到MarketNanny)。聊天机器人使用Lambda无服务器服务从外部API获取数据并将其回传给电话中的用户:

图片参考: https://aws.amazon.com/blogs/aws/new-amazon-connect-and-amazon-lex-integration/

![图5.1:使用Amazon Connect、Lex和Lambda的基于语音的聊天机器人应用程序示例

图片

图5.1:使用Amazon Connect、Lex和Lambda的基于语音的聊天机器人应用程序示例

通过Amazon Connect使用呼叫中心与您的聊天机器人交谈

使用Amazon Connect,我们可以创建一个呼叫中心应用程序,这将使我们能够通过语音命令而不是文本框连接到我们在上一章第4章对话式人工智能MarketNanny)中构建的聊天机器人。

要创建一个Amazon Connect呼叫中心,您需要创建一个Amazon Connect实例。每个示例都包含了与您的呼叫中心实例相关的多数资产和设置。您可以从Amazon Connect支持页面监督您场景的设置。

您可以创建各种实例;然而,每个示例仅限于创建它的AWS区域内部。设置、客户端、测量和细节不会在Amazon Connect实例之间共享。

注意

必须有一个AWS账户。Amazon Lex服务可以通过控制台页面访问。

练习5.01:创建个人呼叫中心

在这个练习中,我们将使用Amazon Connect创建一个个人呼叫中心,并将您的MarketNanny聊天机器人连接到它。请注意,我们已经在本章前面讨论了Amazon Connect服务:

  1. 对于第一步,导航到AWS控制台中的Amazon Connect服务页面。您可以选择链接进行导航,或者可以直接访问https://console.aws.amazon.com/connect:![图5.2:Amazon Connect欢迎屏幕

    图片

    图5.2:Amazon Connect欢迎屏幕

  2. 点击开始使用按钮创建一个新的呼叫中心实例。在随后的屏幕上,保持默认选项在Amazon Connect中存储用户,然后输入您的应用程序名称。名称在AWS中是唯一的,不允许重复,因此您可能需要尝试一下或给名称添加数字,直到得到一个唯一的名称。

  3. 完成后,点击下一步按钮:![图5.3:Amazon Connect资源配置屏幕的第1步

    图片

    图5.3:Amazon Connect资源配置屏幕的第1步

  4. 在下一步中,添加新管理员的详细信息,将电子邮件地址设置为您的电子邮件地址。同样,完成后再次点击下一步按钮:![图5.4:Amazon Connect资源配置屏幕的第2步

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_04.jpg)

    图5.4:Amazon Connect资源配置屏幕的第2步

  5. 在下一步中,请保持传入电话复选框选中,并取消选中传出电话复选框:

    注意

    在这种情况下,我们不需要我们的机器人向任何人发起电话,但我们确实希望它能够接收电话。

    ![图5.5:Amazon Connect资源配置屏幕的第3步

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_05.jpg)

    图5.5:Amazon Connect资源配置屏幕的第3步

  6. 完成后,请点击下一步按钮。

  7. 接下来,您将看到一个信息屏幕,告知您正在授予呼叫中心应用程序读取和写入您的S3存储桶数据的权限,加密或解密数据,以及读取和写入CloudWatch日志。

  8. 它还将显示存储您的数据和联系流程日志的S3存储桶的位置。点击下一步

    注意

    注意,有一个自定义设置链接可以进一步自定义这些位置,但我们现在不会使用它。

    ![图5.6:Amazon Connect资源配置屏幕的第4步

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_06.jpg)

    图5.6:Amazon Connect资源配置屏幕的第4步

  9. 这将带您到最后一个屏幕,该屏幕将为您提供对您的联系中心应用程序所有设置的回顾:![图5.7:Amazon Connect资源配置屏幕的第5步

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_07.jpg)

    图5.7:Amazon Connect资源配置屏幕的第5步

  10. 现在,点击创建实例按钮以创建您的应用程序。您应该会看到一个对话框窗口:![图5.8:设置Amazon Connect

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_08.jpg)

    图5.8:设置Amazon Connect

  11. 一分钟或两分钟后,它将完成设置过程,并将您带到成功!屏幕,您可以在其中点击开始使用按钮直接进入您的应用程序:![图5.9:成功!屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_09.jpg)

图5.9:成功!屏幕

注意

设置应用程序可能需要长达15分钟的时间。因此,如果您最初未能成功进入应用程序页面,请保持耐心,并时不时地再次尝试,直到成功为止。

通常,这不会花费很长时间,并且通常,应用程序页面将立即可访问。

因此,您在几分钟内就创建了一个客户联系中心,这在以前可能需要3到6个月的时间。虽然创建界面看起来非常简单,但它掩盖了所有底层基础设施的复杂性。这就是Amazon AWS Connect的力量。

正如您将在下一个练习中看到的那样,您实际上可以获取一个物理电话号码,以便拨打您自己的联系中心。

练习5.02:为您的呼叫中心获取免费电话号码

在这个练习中,我们将为我们的定制呼叫中心获取一个免费号码。这个免费电话号码可以通过Amazon Connect提供的免费层服务获得。以下是为了获取免费号码需要执行的步骤:

  1. 您个人呼叫中心的欢迎屏幕应该可见。如果不可见,您可以在之前屏幕上显示的URL中轻松访问它,在您点击开始按钮之前:![图5.10:Amazon Connect欢迎屏幕

    图片

    图5.10:Amazon Connect欢迎屏幕

  2. 在这一点上,您可以点击让我们开始按钮来启动第一步,即为您呼叫中心应用程序申领一个本地电话号码。在这个屏幕上,您可以选择您的国家:![图5.11:获取电话号码屏幕

    图片

    图5.11:获取电话号码屏幕

  3. 类型保留为默认选项(直接拨打)。然后,从电话号码下拉菜单中选择一个电话号码。在大多数情况下,这应该是一个您当地的号码。如果您选择了一个不是本地的号码,您可能会根据拨打该号码的成本付费:![图5.12:电话号码选择

    图片

    图5.12:电话号码选择

  4. 完成后,点击下一步按钮。这将允许您通过拨打新电话号码来测试您的电话号码。您应该会听到一条以您好,感谢来电开始的语音信息

  5. 这将随后显示一个选项列表;您可以在有时间的时候尝试它们,看看它们会做什么。现在,点击继续按钮,这将带您到仪表板屏幕:![图5.13:Amazon Connect仪表板屏幕

    图片

图5.13:Amazon Connect仪表板屏幕

您现在已经在Amazon Connect上拥有了一个工作的呼叫中心应用。

使用Amazon Lex聊天机器人和Amazon Connect

通过Amazon Lex,您可以创建智能聊天机器人。这可以通过将联系流程转换为常规对话来实现。Amazon Connect服务通过启用创建一个联系中心(基于云)以及生成动态流程来补充之前提到的功能,从而为您的来电者提供个性化的体验。此外,来电者在通话过程中输入的双音多频DTMF)数字可以很容易地被这些聊天机器人识别。

当Amazon Lex和Amazon Connect协同工作时,聊天机器人可以评估来电者的意图。此外,您可以使用AWS Lambda函数与您的聊天机器人一起处理来电请求,向来电者提供信息,并查询应用程序。这些聊天机器人能够通过智能管理对话并实时根据来电者的回复审查回复来维持上下文。

在下一节中,我们将连接您的 MarketNanny 聊天机器人到呼叫中心。这样,用户就可以通过电话说话,并将他们的语音自动转换为文本话语,该话语将被发送到 Lex 聊天机器人。

了解联系流程

联系流程定义了客户在与您的呼叫中心互动时经历的每个步骤。Amazon Connect 提供了模板,供您创建简单高效的联系流程。您还可以使用可视联系流程编辑器创建新的联系流程。编辑器是一个非常直观且简单的工具,用于创建联系流程。但不要被简单性所迷惑——您可以创建非常复杂和详细的流程。

联系流程设计器屏幕提供了一个在拖放环境中创建联系流程的方法。联系流程由左侧面板中的节点组成,这些节点可以在设计区域(在“显示更多流程信息”链接下)访问。

节点根据“交互”、“设置”、“分支”、“集成”和“终止”/“转接”类别进行分类。可以通过点击每个类别旁边的下拉图标来隐藏或显示每个类别中的节点。您将通过为您的聊天机器人创建联系流程来探索一些可用的节点。

联系流程是用户(通常是主管)逐步刷新进入框架的每个通话的设置,并确保用户听到定制和相关的选择的一种方式。虽然有许多预设计的联系流程,但您将为您的MarketNanny聊天机器人创建一个新的流程。

联系流程模板

下面的列表列出了可用的各种模板。仅作信息参考,完整的列表显示在下面的屏幕截图中。您创建的模板也将显示在模板列表中。您可以点击每个流程以获取更多详细信息并从中学习:

![图 5.14:Amazon Connect 联系流程模板

图片 B16061_05_14.jpg

![图 5.14:Amazon Connect 联系流程模板

在下一个主题中,我们将设置您的呼叫中心,使其能够接受来电,将您的MarketNanny聊天机器人连接到呼叫中心,以便用户可以通过电话说话,并将用户的语音自动转换为文本话语,该话语将被发送到 Lex 聊天机器人。

然后,聊天机器人将继续处理话语,查找意图和槽位,并通过您在上一节中设置的 Lambda 函数满足用户请求。

要将您的呼叫中心实例与您的聊天机器人连接,您需要返回主屏幕并导航到连接仪表板,如下面的屏幕截图所示。

选择“服务”>“客户参与”>Amazon Connect

![图 5.15:从 AWS 管理控制台选择 Amazon Connect

图片 B16061_05_15.jpg

![图 5.15:从 AWS 管理控制台选择 Amazon Connect

选择您的 Connect 实例:

![图 5.16:Amazon Connect 控制台

图片 B16061_05_16.jpg

图 5.16:Amazon Connect 控制台

练习 5.03:将呼叫中心连接到您的 Lex 聊天机器人

在这个练习中,您将设置您的呼叫中心,使其能够接受来电,并且可以将您的 MarketNanny 聊天机器人连接到呼叫中心。以下是要完成这些步骤的步骤:

  1. 从亚马逊管理控制台,通过 服务 菜单导航到 客户参与 下的 Amazon Connect。您将看到 Amazon Connect 虚拟联系中心实例屏幕;点击您的实例。从左侧工具栏中选择 联系流程。点击 机器人;然后点击下拉菜单以找到 MarketNanny 机器人条目,选择它,然后选择 添加 Lex 机器人 链接以保存它:![图 5.17:带有 Lex 机器人选择下拉菜单的联系流程屏幕

    img/B16061_05_17.jpg

    图 5.17:带有 Lex 机器人选择下拉菜单的联系流程屏幕

    以下截图显示了将 MarketNanny 添加到 Lex 机器人的情况:

    ![图 5.18:显示 Lex 机器人

    img/B16061_05_18.jpg

    图 5.18:显示 Lex 机器人

  2. 现在,您可以通过选择 概览 链接并点击 登录 URL 按钮然后输入您的 Amazon Connect 实例凭据来返回到 仪表板 屏幕。仪表板 屏幕将在新的浏览器标签页中打开:![图 5.19:登录概览屏幕

    img/B16061_05_19.jpg

    图 5.19:登录概览屏幕

  3. 仪表板 屏幕上,选择 5. 创建联系流程 下的 查看联系流程 图标:![图 5.20:从左侧面板屏幕选择路由和联系流程

    img/B16061_05_20.jpg

    图 5.20:从左侧面板屏幕选择路由和联系流程

  4. 这将带您到一个与之前所见的类似的 联系流程 屏幕。这是 联系流程设计器 屏幕,您可以在其中设计和创建新的联系流程:![图 5.21:联系流程屏幕

    img/B16061_05_21.jpg

    图 5.21:联系流程屏幕

  5. 在页面右上角点击 创建联系流程 按钮以创建一个新的联系流程。将其命名为 MarketNannyFlow:![图 5.22:联系流程设计器屏幕

    img/B16061_05_22.jpg

    图 5.22:联系流程设计器屏幕

  6. 您将为聊天机器人的联系流程使用的第一个节点是 Set voice 节点。您可以在 Set 类别下找到它,并将其拖动到 Entry point 节点右侧的图形视图中,该节点已经处于视图中。

  7. 通过单击输出圆圈并使用鼠标将其拖动到 Set voice 节点左侧的输入凸起处,将 Entry point 节点的输出连接到 Set voice 节点的输入:![图 5.23:带有 Set voice 节点的联系流程设计器屏幕

    img/B16061_05_23.jpg

    图 5.23:带有 Set voice 节点的联系流程设计器屏幕

  8. 接下来,您可以通过单击节点顶部来设置节点的 属性。这将弹出一个面板,显示您可以设置的相应属性。

  9. 对于此组件,它提供了 LanguageVoice 属性,这两个属性都可以通过从每个属性标签下的下拉菜单中选择值来设置。您可以设置适合您场景的值,然后点击 Save 按钮:![图 5.24:Set Voice 节点的属性

    图片

    图 5.24:Set Voice 节点的属性

  10. 下一个要添加的节点是 Get customer input 节点,您可以在 Interact 选项卡下找到它。您可以像连接 Set voiceEntry point 节点一样连接此节点的输入到 Set voice 节点的输出:![图 5.25:添加 Get customer input 节点

    图片

    图 5.25:添加 Get customer input 节点

  11. 首先,单击 Get customer input 块上的属性图标,选择 Text to speech (Ad hoc) 选项,然后在其下点击 Enter text。在输入框中,输入以下问候语:

    Hi this is the Market Nanny chatbot. How may I help you today?
    

    注意

    您可以随意将其替换为可能对您更有趣或更合适的其他文本。

  12. 这是当 Contact center 应用程序首次接听电话时将转换为语音问候的文本:![图 5.26:Get customer input 属性

    图片

    图 5.26:Get customer input 属性

  13. 接下来,向下滚动设置面板并选择 Amazon Lex 子部分,而不是 DTMF 部分。在这里,您将能够配置节点以与您的聊天机器人一起工作。

    注意

    DTMF 部分提供了一种通过电话按键操作与呼叫者进行交互的方法,但这里我们不会涉及。我们更感兴趣的是让我们的聊天机器人与呼叫者进行交互。

  14. 在此部分中,在 Lex bot 下,您可以输入您聊天机器人的名称和别名。在 Name 下输入 MarketNanny,在 Alias 下输入 $LATEST

  15. $LATEST 是一个系统定义的别名,它指定联系中心将始终访问 MarketNanny 聊天机器人最近发布的版本:![图 5.27:Get customer input 属性中的 Amazon Lex 属性

    图片

    图 5.27:Get customer input 属性中的 Amazon Lex 属性

  16. 最后,在 Intents 部分下指定 GetQuote 意图。由于这是我们目前正在处理的唯一意图,请点击 Save 按钮:![图 5.28:Get customer input 节点中的 GetQuote 意图

    图片

    图 5.28:Get customer input 节点中的 GetQuote 意图

  17. 您现在可以看到 Get customer input 节点已更改以显示其属性面板中指定的意图:![图 5.29:完整的联系中心流程

    图片

    图 5.29:完整的联系中心流程

  18. 您可以通过添加两个更多节点来完成流程:

    • Interact部分选择Play prompt:在属性面板中将Prompt属性设置为Text to speech (Ad hoc),并在Enter text下的文本框中输入如下文本:

      "Thanks for using MarketNanny" Feel free to ask me something else.
      
    • Terminate/Transfer部分的Disconnect/hang up。不要设置任何属性。

  19. 按照之前所示连接节点。将Get customer input中的DefaultError状态的输出连接到Disconnect/Hang up节点的输入。

  20. GetQuote的输出连接到Play prompt节点。

  21. Play prompt的输出连接到Set voice的输入。这确保了只要你继续提出正确的问题,你就可以与你的聊天机器人互动。

  22. 最后,点击屏幕右上角的Save按钮,然后选择Publish按钮来发布联系流程:![图5.30:保存和发布按钮

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_30.jpg)

    图5.30:保存和发布按钮

  23. 作为最后一步,你将把你联系中心的电话号码连接到你刚刚创建的新联系流程。

  24. 从屏幕左侧的菜单面板中选择Routing菜单。然后,从那里选择Phone numbers项:![图5.31:从仪表板选择路由和电话号码

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_31.jpg)

    图5.31:从仪表板选择路由和电话号码

  25. 这将打开Manage Phone号码屏幕,你可以选择你希望用于MarketNanny的电话号码。

  26. 选择电话号码将带你去到Edit Phone number页面:![图5.32:编辑电话号码页面

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_32.jpg)

    图5.32:编辑电话号码页面

  27. 在这里,点击Contact flow/IVR下的下拉菜单,选择或输入你新的联系流程名称:MarketNannyFlow

  28. 拨打你的联系中心电话号码以验证你是否可以通过与它说话来与你的MarketNanny聊天机器人互动。

  29. 你可以在S3存储桶中查看日志。你还可以在CloudWatch > Log groups中查看日志。在我们的案例中,我们可以看到jarvis42,如下截图所示:![图5.33:Amazon CloudWatch控制台

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_33.jpg)

图5.33:Amazon CloudWatch控制台

在这个练习中,我们设置了我们自己的呼叫中心,甚至将我们的MarketNanny聊天机器人连接到了呼叫中心。现在,让我们通过一个有趣的活动来测试我们迄今为止学到的内容。

活动五.01:创建自定义机器人和将机器人与Amazon Connect连接

在这个活动中,我们将创建一个Amazon Lex机器人来检查用户的账户余额。该机器人将通过自动语音识别ASR)和自然语言理解NLU)能力进行控制,这些能力与推动Amazon的Alexa的类似创新。

对于这个活动,我们将考虑以下用户故事:作为用户,你可以通过语音用户界面使用你的手机检查你的账户余额。

推断来看,我们可以看到我们需要Amazon Connect、一个电话号码、一个Lex机器人和一个Lambda函数来查询账户余额。我们将做出一个简化的假设,即用户只有一个账户——否则,我们需要更多的提示来选择账户等等。

通过Amazon Connect创建账户余额服务的步骤如下:

![图5.34:通过Amazon Connect创建账户余额服务的步骤]

![图片B16061_05_34.jpg]

![图5.34:通过Amazon Connect创建账户余额服务的步骤]

  1. 为了简单起见,我们将账户余额存储在S3存储桶中。在现实生活中,对存储桶的调用将被替换为对数据库的SQL调用,例如,SELECT account_balance from balance_table WHERE account_number = <account Number>或类似的操作。

  2. 然后,我们将创建一个Lambda函数来访问存储桶并返回余额值。

  3. 我们将创建一个Lex机器人来获取账户余额。这样,我们可以实现多渠道服务——客户可以通过聊天机器人或拨打我们的客服中心来获取账户余额。

然后,当然,我们在Amazon Connect中创建一个联系流程来通过电话激活机器人并通过电话获取余额。

注意

这个活动的解决方案可以在第312页找到。

希望这个活动和本章对你来说有趣,并且激励你尝试更多复杂和有趣的机器人,这些机器人可以回答各种问题。

摘要

在本章中,我们进入了语音的世界——我们学习了Amazon Connect的基础知识,甚至查看了一下Amazon Connect的免费版。后来,我们探索了使用Amazon Connect、Lex和Lambda的基于语音的聊天机器人应用示例。然后,我们创建了一个个人呼叫中心。

你还学会了如何为个人呼叫中心获取一个免费电话号码,以及如何使用Amazon Lex聊天机器人和Amazon Connect配合联系流程和不同的模板。最后,你学习了如何将呼叫中心连接到Lex聊天机器人。

在下一章中,你将学习如何使用Amazon Rekognition服务通过计算机视觉分析图像。Amazon Rekognition服务用于检测图像中的对象、场景和文本。它还用于匹配不同图像中的面部,以及比较图像之间相互关联的紧密程度。

第六章:6. 计算机视觉和图像处理

概述

本章介绍了用于使用各种技术分析图像内容的亚马逊 Rekognition 服务。你将通过使用计算机视觉进行图像分析的 Rekognition 服务来了解图像分析,通过它你将能够检测图像中的对象和场景。你将学习如何分析人脸并在图像中识别名人。你还将能够比较不同图像中的人脸,以查看它们彼此之间有多接近。

到本章结束时,你将能够将亚马逊视觉和图像处理人工智能服务应用于生物学、天文学、安全等领域。

简介

在前面的章节中,你已经与亚马逊网络服务AWS)的人工智能AI)和机器学习ML)服务进行了许多有趣的练习和活动。你结合了无服务器计算范式和对话式人工智能来构建聊天机器人,以及一个完全功能性的联系中心,使任何人都可以通过拨打本地电话号码来通过语音界面与聊天机器人进行对话。你还学习了文本分析和主题建模,所有这些都是在使用AWS服务。

在本章中,你将使用亚马逊 Rekognition 服务执行各种图像处理任务。首先,你将在图像中识别对象和场景。然后,你将测试图像是否应该被标记为需要内容审查。接下来,你将使用 Rekognition 分析人脸。你还将识别图像中的名人和知名人士。你将比较在不同图像和设置(例如,在群体或孤立状态下)出现的面孔,并在不同图像中识别相同的人。最后,你将从可能显示文本的图像中提取文本。

亚马逊 Rekognition 基础

亚马逊 Rekognition 是 AWS 提供的一种基于深度学习的视觉分析服务,允许您使用机器学习对图片和视频进行图像分析。它建立在 AWS 本身的可扩展基础设施之上,并使用深度学习技术,如果需要,每天可以分析数十亿张图像。它也由亚马逊不断更新,并学习新的标签和功能。

亚马逊 Rekognition 的一些用例如下:

  • 使用文本关键词在图像内容库中进行搜索。

  • 通过将实时图像与参考图像进行比较来确认用户身份。

  • 根据公共图像分析趋势,包括图像中人们的情感和情绪。

  • 检测显性或暗示性内容,并自动过滤以满足您的需求。

  • 从图像中检测和检索文本。

    注意

    Amazon Rekognition也是符合HIPAA标准的医疗应用服务。如果您希望在HIPAA下保护您的数据,您需要联系Amazon客户支持并填写一份业务伙伴协议BAA)。有关HIPAA的更多信息,请访问以下链接:https://aws.amazon.com/compliance/hipaa-compliance/

Amazon Rekognition的免费层信息

对于这本书,您将使用Amazon Rekognition的免费层服务。请注意免费层服务的限制和定价选项。以下是您可以使用进行图像处理的免费服务:

  • 新的Amazon Rekognition客户每年可以分解多达5,000张图片。

  • 在免费计划中,您可以免费使用所有Amazon Rekognition的API,并免费使用最多1,000张无面部特征的照片。

    注意

    您通常不需要超过免费层限制,但如果您超过了免费层的限制,您将根据此链接发布的费率向Amazon付费:https://aws.amazon.com/rekognition/pricing/

Rekognition和深度学习

深度学习是人工智能的一个分支,也是机器学习的一个子领域。深度学习通过使用具有许多处理层的深度神经网络图从原始数据中推断高级抽象来工作。

深度学习结构,如卷积神经网络CNNs)和循环神经网络RNNs),已被用于自然语言处理、音频识别、语音识别和计算机视觉,以产生显著的结果。神经机器翻译已经取代了所有人工编辑的翻译引擎,自动驾驶汽车中的对象检测广泛使用基于CNN的架构,而对话式人工智能正在推动各种客户交互。

Rekognition服务在幕后使用深度学习来提供其各种功能。它使用预训练的模型,因此用户不需要训练系统。具体的细节是Amazon的专有和保密信息,但我们将在本章中学习它是如何工作的以及如何使用Rekognition。正如我们之前提到的,Amazon Rekognition的一个有趣方面是算法会定期进行监控和训练以提高其准确性和能力。它还可以通过自定义标签和用您的图像训练的模型进行扩展。

注意

对于您可能有的任何问题,Amazon Rekognition的常见问题解答页面(https://aws.amazon.com/rekognition/faqs/)是一个极好的资源。

在图像中检测对象和场景

Amazon Rekognition提供了一种功能,可以在图像中检测对象和场景并对其进行标记。这个标签可能是一个对象、场景或概念,例如人、水、沙子、海滩(场景)和户外(概念)。

每个标签都附带一个置信度分数,该分数衡量服务在 0 到 100 的范围内得到正确答案的概率。这允许您或您的应用程序判断允许或丢弃结果的阈值。

Rekognition 支持来自以下表格所示类别的数千个标签:

图 6.1:Amazon Rekognition 支持的标签

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_01.jpg)

图 6.1:Amazon Rekognition 支持的标签

此外,Amazon 正在持续训练系统以识别新的标签,您可以通过 Amazon 客户支持请求您可能希望使用的、不在系统中的标签。

要创建 Amazon Rekognition 对样本图像的分析,您可以执行以下操作:

  1. 导航到 AWS 管理控制台中的 Amazon Rekognition 服务网页,并在左侧顶部点击“服务”。它还有一个搜索框:![图 6.2:在 AWS 管理控制台中选择 Rekognition 服务

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_02.jpg)

    图 6.2:在 AWS 管理控制台中选择 Rekognition 服务

  2. 您可以在“机器学习”部分找到 Rekognition。当您在 Rekognition 页面上时,点击左侧工具栏中的“对象和场景检测”链接以导航到“对象和场景检测”页面:![图 6.3:Amazon Rekognition 服务页面

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_03.jpg)

    图 6.3:Amazon Rekognition 服务页面

  3. 接下来,选择“使用您的图像”面板下的文本框,并输入以下 URL:https://images.unsplash.com/photo-1540253208288-6a6c32573092?w=800:![图 6.4:使用图像 URL 输入框

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_06.jpg)

    图 6.4:使用图像 URL 输入框

    图像的结果如下:

    ![图 6.5:样本图像的结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_05.jpg)

    图 6.5:样本图像的结果

  4. 您可以看到,在图像中,置信度超过 90% 的检测到的对象如下:

    Nature

    Outdoors

    Sky

    Sun

    Dawn

    Sunset

  5. 点击“显示更多”链接以显示更多置信度较低的级别结果。这将显示更多检测到的对象:![图 6.6:我们的样本图像从对象和场景检测中得到的完整标签集

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_06.jpg)

图 6.6:我们的样本图像从对象和场景检测中得到的完整标签集

您可以选择您希望用于应用程序的置信度阈值,以截断结果。

练习 6.01:使用您的图像检测对象和场景

在这个练习中,我们将使用 Amazon Rekognition 检测自定义图像的对象和场景。自定义图像可以是来自在线资源,或者您可以从本地机器上传。检测对象和场景的步骤如下:

  1. 从 AWS 管理控制台导航到 Amazon Rekognition 服务页面,或直接访问以下 URL:https://console.aws.amazon.com/rekognition

  2. 点击工具栏中的“物体和场景检测”链接以导航到“物体和场景检测”页面。

  3. 接下来,选择“使用自己的图像”面板下的文本框。

  4. 输入以下 URL 以获取要分析的图像:https://images.unsplash.com/photo-1522874160750-0faa95a48073?w=800。以下是在 Rekognition 页面上的图像。您可以看到它能够精确地定位到图像:![图 6.7:物体和场景检测的第一个测试图像]

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_07.jpg)

    图 6.7:物体和场景检测的第一个测试图像

    注意

    我们从一家名为 https://unsplash.com/ 的股票照片网站上收集了图像,该网站提供免费下载的图片,可用于本书,且无任何限制。请始终遵守版权法,并注意您居住地可能适用的任何限制或许可费用(如果适用)。您可以在以下位置查看 unsplash.com 上图像的许可:https://unsplash.com/license

  5. 您可以在图像右侧的“结果”面板下查看物体检测的结果。在这种情况下,它是一张相机的图像,结果应该如下所示:![图 6.8:物体和场景检测的第一个测试图像的结果]

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_08.jpg)

    图 6.8:物体和场景检测的第一个测试图像的结果

  6. 如您所见,结果非常准确。接下来,您可以尝试以下图像,并验证结果是否与每张图像后立即显示的表格中的结果一致,即https://images.unsplash.com/photo-1517941875027-6321f98198ed?w=800https://images.unsplash.com/photo-1500111709600-7761aa8216c7?w=800

    以下是一些图像。这是第二个测试图像:

    ![图 6.9:物体和场景检测的第二个测试图像]

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_09.jpg)

图 6.9:物体和场景检测的第二个测试图像

以下是为第二个图像提供的检测结果:

![图 6.10:物体和场景检测的第二个测试图像的结果]

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_10.jpg)

图 6.10:物体和场景检测的第二个测试图像的结果

这是第三个测试图像:

![图 6.11:物体和场景检测的第三个测试图像]

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_11.jpg)

图 6.11:物体和场景检测的第三个测试图像

以下是为第三个图像提供的检测结果:

![图 6.12:物体和场景检测的第三个测试图像的结果]

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_12.jpg)

图 6.12:对象和场景检测的第三张测试图像的结果

第二张图像的结果确实表明它是一个人类头部,置信度超过 83%。查看金门桥的第三张图像,它在“桥梁”类别之前有更多类别,置信度为 96.5%

图像审查

除了对象和场景检测之外,Rekognition 还提供了过滤不良内容的能力。您可以使用审查标签进行逐点子分类,使您能够调整您使用的渠道,以确定您认为满意或令人震惊的图片类型。使用 DetectModerationLabels 操作来检测图像中的不安全内容。

您可以利用这个组件来增强照片分享目的地、聚会、约会应用、青少年内容平台、电子商务平台和购物中心等。在这本书中,我们不会使用任何成人或裸露图像,但我们可以展示在展示女性穿着泳装或夜店服装等可能被认为露骨或暗示性的内容地区的这一功能的使用。

默认情况下,本节中的图像会被模糊处理,所以除非您按下“查看内容”按钮,否则您不需要查看它们。

注意

如果您认为任何露骨或暗示性的图像令人反感,请根据您个人的、道德的、宗教的或文化规范跳过本节。

Amazon Rekognition 使用分层分类法来标记显眼和暗示性内容的类别。两个顶级类别是显眼裸露暗示性。每个顶级类别都有许多二级类别。使用此功能检测并标记的内容类型如下:

![图 6.13:内容类型类别

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_13.jpg)

图 6.13:内容类型类别

要创建一个示例图像的“图像审查”,您可以执行以下操作:

  1. 在 AWS 管理控制台中导航到 Amazon Rekognition 服务页面,或直接访问以下网址:https://console.aws.amazon.com/rekognition.

  2. 点击工具栏中的“图像审查”链接,导航到“图像审查”页面。

  3. 您将在左下角看到一些示例图像。点击其中一个。

  4. 您会立即注意到内容被模糊处理,如下面的截图所示。正在分析的图像是左边的第一张图像,它已经被选中。您会看到服务已经正确地识别出图像中“女性泳装或内衣”类型的“暗示性”内容,置信度为 94.9%:![图 6.14:图像审查的结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_14.jpg)

图 6.14:图像审查的结果

通过这种方式,我们已经看到 Amazon Rekognition 可以过滤掉暗示性内容,但让我们看看它在检测图像中的不良内容方面做得如何。

练习 6.02:检测图像中的不良内容

在这个练习中,我们将检测图像中的不良内容。你可以在你的图像上尝试这个服务。我们已选择了三张我们将尝试使用此功能的图像。按照以下步骤完成此练习:

  1. 将以下URL复制粘贴或输入到页面底部使用您的图像部分下的使用图像URL文本框中,然后按Go按钮以从服务中获得结果 – https://images.unsplash.com/photo-1525287957446-e64af7954611?w=800:![图6.15:使用图像URL上传文本框

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_04.jpg)

    图6.15:使用图像URL上传文本框

  2. 你应该收到一个结果,表明服务已找到Female Swimwear Or Underwear内容,置信度为99.4%:![图6.16:图像审查服务发现的检测结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_16.jpg)

    图6.16:图像审查服务发现的检测结果

  3. 需要提供给服务的图像URLhttps://images.unsplash.com/photo-1509670811615-bb8b07cb3caf?w=800

  4. 就像之前一样,将其输入到使用图像URL文本框中,然后按Go按钮。这张图片没有不良内容:![图6.17:图像审查的第一个测试图像

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_17.jpg)

    图6.17:图像审查的第一个测试图像

    你应该看到Rekognition正确地返回了无结果:

    ![图6.18:图像审查的第一个测试图像的结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_18.jpg)

    图6.18:图像审查的第一个测试图像的结果

  5. 最后,我们将使用一张应该再次返回一些结果的图片:https://images.unsplash.com/photo-1518489913881-199b7c7a081d?w=800

    这一张应该再次正确地被识别为包含Female Swimwear Or Underwear内容,置信度为99.6%:

    ![图6.19:第二个提供的图像的图像审查结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_19.jpg)

图6.19:第二个提供的图像的图像审查结果

正如你所看到的,Amazon Rekognition具有强大的图像分析能力 – 包括内容审查。作为一个建议,你可以尝试一些可能或可能不具有暗示性的更多图像,并检查结果。你可能会在目标检测深度学习算法中找到一些差距。

面部分析

Rekognition还可以对面部进行更详细的分析。给定一张可检测到人脸的图片,它可以判断该人脸是男性还是女性,人脸的年龄范围,该人是否在微笑并看起来很开心,以及他们是否戴眼镜。

它还可以检测更详细的信息,例如眼睛和嘴巴是张开还是闭合,以及该人是否有胡须或络腮胡子。

要创建样本图像的面部分析,你可以这样做:

注意

点击左侧工具栏中的面部分析链接,导航到面部分析页面。

  1. 我们将使用上传功能上传图片并分析图片:![图6.20:图片上传按钮

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_20.jpg)

    图6.20:图片上传按钮

  2. 需要分析的第一张图片可以在https://packt.live/3f5ipH0找到。

    您可以将图片保存到您的磁盘上,或者下载本书的GitHub仓库,正如我们在第一章AWS简介中所述。

  3. 点击上传;您将看到标准资源管理器窗口。导航到您有Chapter06文件夹的目录,并选择Rekognition-05.jpeg文件:![图6.21:带有上传窗口的资源管理器

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_21.jpg)

    图6.21:带有上传窗口的资源管理器

  4. 对于这张图片,您将看到主要图像框显示一个边界矩形,它显示了检测到面部所在的区域。在边界框内,还有三个点来识别关键面部特征的位置——嘴巴和鼻子:![图6.22:面部分析的第一张样本图片

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_22.jpg)

    图6.22:面部分析的第一张样本图片

  5. 在图片右侧的结果部分,您将看到Rekognition检测到的图片中面部以下属性:![图6.23:面部分析的第一张样本图片的结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_23.jpg)

图6.23:面部分析的第一张样本图片的结果

您可以点击显示更多链接来查看其他已识别的属性。

所有这些识别的品质都有极高的置信度,表明该服务对其发现非常自信。

练习6.03:使用您自己的图片分析面部

在这个练习中,您在本书的GitHub仓库(https://packt.live/31X6w1Z)中提供了三张图片,以便您可以使用样本图片尝试Amazon Rekognition服务。这些图片由https://unsplash.com/和Pinterest提供。让我们看看它们是否可以识别突出的面部特征。按照以下步骤完成此练习:

注意

点击左侧工具栏中的面部分析链接,导航到面部分析页面。

  1. 我们将使用上传功能上传图片并进行分析:![图6.24:图片上传按钮

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_24.jpg)

    图6.24:图片上传按钮

  2. 需要分析的第一张图片可以在https://packt.live/3edZZCx找到。

    您可以将图片保存到您的磁盘上,或者下载本书的GitHub仓库,正如我们在第一章AWS简介中所述。

  3. 点击上传,它将显示标准资源管理器窗口。导航到您有Chapter06文件夹的目录,并选择Rekognition-01.jpeg文件:![图6.25:带有上传窗口的资源管理器

    图片

    图6.25:带有上传窗口的探险者

  4. 你可以从边界框和点看出,Rekognition能够轻松识别面部:![图6.26:用于面部分析的第一张图片的边界框

    图片

    图6.26:用于面部分析的第一张图片的边界框

  5. 在“结果”部分,它相当准确地显示了图像中面部属性:![图6.27:用于面部分析的第一张图片的结果

    图片

    图6.27:用于面部分析的第一张图片的结果

  6. 让我们看看Recognition是否能检测到多个面部以及每个面部的面部特征。第二张图片包含多个面部。文件可以在以下链接找到:https://packt.live/3gDSzu5

  7. 点击“上传”,它将显示标准资源管理器窗口。导航到包含Chapter06文件夹的目录,并选择Rekognition-02.jpeg文件。

  8. Rekognition再次很好地完成了面部识别:![图6.28:用于面部分析的第二张图片的边界框

    图片

    图6.28:用于面部分析的第二张图片的边界框

  9. 现在,“结果”视图有一个右箭头按钮,并显示第一个面部:![图6.29:用于面部分析的第二张图片的结果

    图片

    图6.29:用于面部分析的第二张图片的结果

  10. 点击右箭头,你将获得第二个面部的详细信息:![图6.30:用于面部分析的第二张图片的结果 – 第二个面部。

    图片

    图6.30:用于面部分析的第二张图片的结果 – 第二个面部。

  11. 最后,我们将给Rekognition提供一张中性表情的图片,看看它的表现如何。我们将使用以下链接中的图片 – https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=1000:![图6.31:用于面部分析的第三张图片

    图片

    图6.31:用于面部分析的第三张图片

  12. 如预期,该服务可以识别男性和女性。它通过边界框识别面部:![图6.32:用于面部分析的第三张图片的边界框

    图片

    图6.32:用于面部分析的第三张图片的边界框

  13. 它还以高置信度(97.7%)显示面部为男性,并相应地更新年龄范围:![图6.33:用于面部分析的第三张图片的结果

    图片

图6.33:用于面部分析的第三张图片的结果

84.2% 的信心认为这个人没有在笑,并且我们可以从图片中看出,他并没有笑得很开心,如果有的话。最后,服务有 97.5% 的把握认为他戴着眼镜,但也以 90.2% 的信心说他没有戴太阳镜。这表明还有很多改进的空间,我们应该应用人类的逻辑和规则来验证图像检测服务的成果。在这种情况下,我们可以选择置信度分数更高的那个(即“戴着眼镜”),以表明我们可以使用相对分数来评估结果。

如我们所知,人类天生具有极好的物体检测和图像分析能力,这些能力在我们成长过程中得到增强。但对于机器来说,这非常困难,因为它们没有推理或执行语义分析的能力。图像分析领域相对较新,大部分进步都是在过去 5 到 6 年中取得的。正在研究新的算法,探索新的训练方法,并寻求优化。因此,Amazon Rekognition 非常有效——它通过一组有用且实用的接口封装了算法和机制,掩盖了底层算法和计算机理论复杂性,并通过利用当前最佳实践和研究不断学习和进化。在本节中,你了解了 Amazon Rekognition 图像分析服务的能力。你将在接下来的章节中了解更多关于此服务的信息。

名人识别

Rekognition 为我们提供了在图像中识别和标记名人和其他名人的能力。这包括来自体育、商业、政治、媒体和娱乐等多个领域的知名人士。

重要的是要记住,Rekognition 只能识别它已经训练过的面孔,因此并不涵盖所有名人的完整、详尽的列表。然而,由于亚马逊持续训练该系统,它不断地向服务中添加新的面孔。

注意

点击左侧工具栏中的“名人识别”链接,导航到“名人识别”页面。

要创建一个样本图像的名人识别,你可以执行以下操作:

  1. 点击“上传”按钮。我们将使用一个文件可以在 https://packt.live/38CmbVM 找到的图片。你可以将图片保存到你的磁盘上,或者按照 第 1 章AWS 简介 中描述的下载这本书的 GitHub 仓库。

  2. 它将显示标准的探索者窗口。导航到包含Chapter06文件夹的目录,并选择Rekognition-04.jpeg文件:![图 6.34:带有上传窗口的探索者

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_34.jpg)

    图 6.34:带有上传窗口的探索者

  3. Amazon Rekognition在识别尼切尔·尼科尔斯(因在《星际迷航》电影中扮演Nyota Uhura上尉而闻名)方面做得非常出色:![图6.35:名人识别的第一个样本图像及其结果

    图片

    图6.35:名人识别的第一个样本图像及其结果

  4. 点击“结果”框中的“了解更多”链接,将带您到尼切尔·尼科尔斯的IMDb页面:![图6.36:第一个样本图像的“了解更多”链接

    图片

图6.36:第一个样本图像的“了解更多”链接

练习6.04:在您的图片中识别名人

在这个练习中,我们将使用另一个拥有更多名人图像的网站。您也可以免费无限制地使用这些图像。您还可以在自己的图像上尝试这项服务。我们已选择了三张图片,我们将使用此功能尝试它们。

您可以在此处查看pexels.com图片的许可:https://www.pexels.com/creative-commons-images/。按照以下步骤完成此练习:

注意

点击左侧工具栏中的“名人识别”链接,导航到“名人识别”页面。

  1. 在页面底部的“使用自己的图片”部分,将一个URL复制粘贴或输入到“使用图片URL”文本框中,然后点击Go按钮以从服务中获得结果:![图6.37:使用图片URL输入文本框

    图片

    图6.37:使用图片URL输入文本框

  2. 首先将以下URL输入到文本框中:https://images.pexels.com/photos/276046/pexels-photo-276046.jpeg:![图6.38:为名人识别提供的第一个图像

    图片

    图6.38:为名人识别提供的第一个图像

  3. 这是一张知名女演员查理兹·塞隆的图片。结果部分将显示她的名字和一个了解更多链接,该链接将带您到她的IMDb页面:![图6.39:为名人识别提供的第一个图像的“了解更多”链接

    图片

    图6.39:为名人识别提供的第一个图像的“了解更多”链接

  4. 您可以在文本框中输入的第二个图像可以在以下位置找到:https://images.pexels.com/photos/2281/man-person-suit-united-states-of-america.jpg?w=800,并给出以下图像:![图6.40:为名人识别提供的第二个图像

    图片

    图6.40:为名人识别提供的第二个图像

  5. 这张图片显示了前美国总统巴拉克·奥巴马。Rekognition可以轻松地检测到他也显示在“结果”部分。了解更多链接再次链接到他的IMDb页面:![图6.41:为名人识别提供的第二个图像的“了解更多”链接

    图片

    图6.41:用于名人识别的第二张图像的了解更多链接

  6. 最终图像包含多个名人。将以下 URL 输入 Rekognition:https://images.pexels.com/photos/70550/pope-benedict-xvi-president-george-bush-laura-bush-andrews-afb-70550.jpeg?w=800。这给我们以下图像:![图6.42:用于名人识别的第三张图像,包含三个边界框

    img/B16061_06_42.jpg

    图6.42:用于名人识别的第三张图像,包含三个边界框

  7. 结果部分,您可以看到 Rekognition 识别了图像中的所有三位名人:

    • 乔治·W·布什

    • 约翰·保罗二世

    • 劳拉·布什

      以下图像显示了名人识别的结果:

      ![图6.43:用于名人识别的第三张图像的结果

      img/B16061_06_43.jpg

图6.43:用于名人识别的第三张图像的结果

他们名字下的了解更多链接将转到他们各自的 IMDb 页面。正如我们之前所做的那样,我们可以通过点击它们来验证这一点。

面部比较

Rekognition 允许您比较两张图像中的面部。这主要是为了识别两张图像中哪些面部是相同的。作为一个用例示例,这也可以用于将人们的照片与他们的个人照片进行比较。

本节展示了行业标准,以便您可以使用 Amazon Rekognition 分析包含不同面部排列的图片中的面部。当您指定一个参考面部(源)和一个比较面部(目标)图片时,Rekognition 会考虑源图片中最大的面部(即参考)以及目标图片(即测试图像)中识别到的最多100个面部,然后发现源图片中的面部与目标图片中的外观匹配程度如何。每个测试的接近度得分都显示在结果表中。

使用此功能的某些限制如下:

  • 如果源图像包含多个面部,则使用最大的面部与目标图像进行比较。

  • 目标图像可以包含多达15个面部。源图像中检测到的面部将与目标图像中检测到的每个面部进行比较。

    注意

    点击左侧工具栏中的面部比较链接以导航到面部比较页面。

使用面部比较功能时,有两个图像部分并排显示。您可以选择将左侧部分的图像与右侧部分的图像进行比较。要创建样本图像的面部分析,您可以执行以下操作:

  1. 前往左侧使用自己的图像面板下的文本框。

  2. 输入以下网址以获取要分析的图像:https://images.unsplash.com/photo-1524788038240-5fa05b5ee256?w=800.

  3. 前往右侧“使用自己的图像”面板下的文本框。

  4. 输入以下网址以获取要分析的图像 – https://images.unsplash.com/photo-1524290266577-e90173d9072a?w=800.![图6.44:提供的第一批样本图像用于面部对比

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_44.jpg)

    图6.44:提供的第一批样本图像用于面部对比

  5. 使用默认选择,在“结果”部分,您将看到它以99.8%的置信度识别出左侧图像中的女孩在右侧,如图所示:![图6.45:提供的第一批样本图像的对比结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_45.jpg)

图6.45:提供的第一批样本图像的对比结果

活动6.01:在Rekognition中创建和分析不同的面部

在这个活动中,您可以使用自己的图像尝试Rekognition。例如,我们提供了指向两组显示同一人的图像的链接。您可以通过使用“上传”按钮将图像集输入到左侧(对比)和右侧(对比)的两侧。记住这次有两个,所以还有两个Go按钮要按。按照以下步骤完成此活动:

  1. 从亚马逊管理控制台导航到亚马逊识别服务,并在左侧工具栏中选择“面部对比”。

  2. 您将看到两组“上传”按钮,如下面的截图所示:![图6.46:面部对比的上传按钮

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_46.jpg)

    图6.46:面部对比的上传按钮

  3. 将第一批图像上传到 Rekognition 以便它能够识别和对比面部。我们有三张图像,face-01-01face-02-02face-01-03,在不同的照明条件和角度下。有趣的是,Rekognition 可以检测出它们都是同一个人的面部!

    要分析的图像可以在 https://packt.live/31X6IP6https://packt.live/3ebuSYzhttps://packt.live/2ZLseUd 文件中找到。

    您可以将图像保存到您的磁盘上或下载本书的GitHub仓库,如我们在第1章AWS简介中所述:

    ![图6.47:带有上传窗口的探索者

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_47.jpg)

    图6.47:带有上传窗口的探索者

  4. 上传 https://packt.live/31X6IP6https://packt.live/2ZLseUd.

  5. 使用以下参数比较第一批图像:

    • 置信度

    • 比较不同角度

    • 照明

    • 眼镜在面部上的位置

  6. 比较第二组图像的面部相似性参数。

    额外挑战

    作为一项额外的挑战,你还可以尝试在这两张来自Unsplash的图片上执行相同的步骤:https://images.unsplash.com/photo-1526510747491-58f928ec870fhttps://images.unsplash.com/photo-1529946179074-87642f6204d7

预期的输出是来自图像集的两个对应图像是否为同一人的置信度,即使角度、光照和面部位置不同。你将在结果部分看到这一点。这项活动展示了Amazon Rekognition服务的图像分析能力。

注意

本活动的解决方案可以在第348页找到。

图像中的文本

在前面的章节中,你学习了如何从扫描的文档中提取文本,例如税务申报和公司报表。Amazon Rekognition同样可以从图像中检测和提取文本——例如,街牌、海报、产品名称和车牌。当然,这个功能是为了与真实世界的图像而不是文档图像一起使用。在左侧工具栏中可访问的“图像中的文本”链接,就是Amazon Rekognition中这一功能的所在。

对于提供的每一张图像,服务都会返回一个文本标签和边界框,以及一个置信度分数。这对于在图像集合中搜索文本非常有用。根据此服务和其他功能的结果,每张图像都可以根据相应的文本元数据进行标记。

目前,支持的文本仅限于拉丁字母和数字(西文脚本)。每张图像可以识别多达50个字符序列。文本必须是水平的,旋转角度在+/- 90度之间。

注意

点击左侧工具栏中的“图像中的文本”链接,导航到“图像中的文本”页面。

要识别样本图像中的“图像中的文本”,你可以执行以下操作:

  1. 前往左侧“使用自己的图像”面板下的文本框。

  2. 输入以下图像的URL以进行分析:https://images.unsplash.com/photo-1527174744973-fc9ce02c141d?w=800。你将看到以下图像:![图6.48:提供用于图像中文本的第一个样本图像

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_48.jpg)

图6.48:提供用于图像中文本的第一个样本图像

Rekognition会在检测到的文本周围绘制边框,以便你可以识别它所识别的文本区域。你可以在“结果”部分看到文本提取的结果:

![图6.49:提供用于图像中文本的第一个样本图像的结果

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_49.jpg)

图6.49:提供用于图像中文本的第一个样本图像的结果

Rekognition 能够在图像中找到文本并在其周围放置一个框;然后,它能够“阅读”文本,甚至理解有两个单词!Rekognition 服务已经从图像中提取了文本,并在不同区域之间用分隔符(|)分隔单词。即使标志的字体独特,带有阴影,它仍然能够提取文本。

接下来,让我们用来自不同真实场景的自己的图片来测试这个功能,例如不同角度的店面和车牌。正如您将看到的,Amazon Rekognition 在从商店招牌下方拍摄的照片以及从车牌上方拍摄的角度照片上都表现得非常好。

练习 6.05:从您的图片中提取文本

在这个练习中,您将从自己的图片中提取文本。让我们看看 Amazon Rekognition 在处理图像中的不同文本方面表现如何。我们为您提供了三张免费使用的图片。按照以下步骤完成这个练习:

  1. 点击左侧工具栏中的“图像中的文本”链接,导航到“图像中的文本”页面。

  2. 将以下 URL 复制粘贴或输入到页面底部“使用您的图片”部分下的“使用图像 URL”文本框中:https://images.unsplash.com/photo-1521431974017-2521d1cdcd65?w=800。您将看到以下图像:![图 6.50:提供的第一个图像的文本

    图片 B16061_06_50.jpg

    图 6.50:提供的第一个图像的文本

    注意

    您的结果可能不如我们这里得到的结果精确。

    您可以看到围绕图像的边界框,这表明 Rekognition 已经识别出图像中的文本。结果可以在图像右侧的“结果”面板中查看。它错过了一个位于 N 和 OUT 之间的连字符,但没有错过 IN 中的 I,尽管它在图片中几乎看不见,并且是倾斜的:

    ![图 6.51:提供的第一个图像的文本识别结果

    图片 B16061_06_51.jpg

    图 6.51:提供的第一个图像的文本识别结果

  3. 下一个图像可以在以下 URL 中找到。像以前一样复制粘贴或输入到“使用图像 URL”文本框中:https://images.unsplash.com/photo-1528481958642-cd4b4efb1ae1?w=800。您将看到以下图像:![图 6.52:提供的第二个图像的文本

    图片 B16061_06_52.jpg

    图 6.52:提供的第二个图像的文本

    您可以看到 Rekognition 已经识别出商店窗户中的主要文本:OCEAN GIFTS SPORTFISHING WHALE WATCHING以及单词之间的分隔:

    ![图 6.53:提供的第二个图像的文本识别结果

    图片 B16061_06_53.jpg

    图 6.53:提供的第二个图像的文本识别结果

    尽管结果非常好,但 Rekognition 可能会感到困惑。这是你应该注意并警惕在结果中的事情。Rekognition 可能会感到困惑并返回虚假的结果。

  4. 最后,复制并粘贴或输入以下 URL 到“使用图像 URL”文本框中:https://images.unsplash.com/photo-1456668609474-b579f17cf693?w=800。你将看到以下图像:![图 6.54:提供的第三张图像中的文本]

    图片 B16061_06_54.jpg

图 6.54:提供的第三张图像中的文本

这又是车牌号的另一个例子。结果如下:

![图 6.55:提供的第三张图像中的文本结果]

图片 B16061_06_55.jpg

图 6.55:提供的第三张图像中的文本结果

它在隔离车牌方面做得很好。

在这个练习中,我们了解到 Amazon Rekognition 可以从图像中提取文本,即使是有不同角度、字体、阴影等。你应该尝试使用具有不同角度、光照和尺寸的多个图像来使用这个功能。

摘要

在本章中,你学习了如何使用 Amazon Rekognition 服务的各种功能,并将其应用于图像。首先,你使用该服务识别图像中的对象和场景。接下来,通过使用 Rekognition 识别图像中的不适当内容,你调节了可能包含不适当内容的图像。

你能够使用 Rekognition 分析面部,并且还能够识别他们的性别、年龄范围、是否在微笑以及是否戴着眼镜。

你还使用该服务识别了名人及著名人物,并比较了不同图像中的面部是否相同。最后,你能够从图像中提取显示的文本。

有了这些,我们已经到达了本章和本书的结尾。我们希望这是一次有趣的旅程,发现了无服务器计算、Amazon AI 和 ML 服务、文本分析、图像分析等巨大能力的发现。

这些类型的特性在几年前似乎是难以置信的。机器学习和人工智能的本质是这样的,在可预见的未来,计算机将能够做到的事情将取得巨大进步,AWS 将能够为你和你的应用程序提供这些服务。

附录

1. AWS 简介

活动 1.01:使用 CLI 将数据放入 S3

解决方案:

  1. 通过执行 aws s3 ls 来验证配置是否正确,以输出您的存储桶名称(存储桶名称将是唯一的):![图 1.46:命令行显示 S3 存储桶中的文件列表

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_46.jpg)

    图 1.46:命令行显示 S3 存储桶中的文件列表

    注意

    您将看到的列表可能与前面的截图略有不同。这取决于您已经执行了哪些活动或练习;您可能会在 S3 中看到更多一些文件。

  2. 让我们创建一个新的 S3 存储桶。mb 是创建存储桶的命令:

    aws s3 mb s3://lesson1-text-files-20200217
    

    ![图 1.47:创建 S3 存储桶的命令

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_47.jpg)

    图 1.47:创建 S3 存储桶的命令

    如果成功,您将看到 make_bucket : message

    注意

    您的存储桶名称需要是唯一的,因此添加 YYYYMMDD 到名称(或类似的内容)使其变得唯一更容易。您将在后面的章节中看到这种技术。如果您查看早期的 ls 命令,您将看到使用的存储桶名称——甚至使用了 YYYYMMDDHHMM 来确保名称的唯一性。有关具体细节,请参阅 S3 的“存储桶命名规则” https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-s3-bucket-naming-requirements.html)。

  3. 将您的文本文件导入到 S3 存储桶中。

    对于这些练习,我们为您从《德古拉》和《彼得·潘》中准备了一些听起来很有趣的文本摘录。这些文件位于 GitHub https://packt.live/31WESlK。假设您已经在本地上克隆了存储库,使用命令行导航到本地目录。在我们的例子中,文件位于 ~/Documents/aws-book

    ![图 1.48:在命令行中导航到本地目录

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_48.jpg)

    图 1.48:在命令行中导航到本地目录

  4. 要将文件从本地目录复制到 S3,请使用命令 aws s3 cp pos_sentiment__leaves_of_grass.txt s3://lesson1-text-files-20200217 将文本文件导入到您的 S3 存储桶,如图 1.48 的末尾所示:

  5. 同样,将 neg_sentiment__dracula.txtpeter_pan.txt 文件导出到 S3 存储桶:![图 1.49:在命令行中从本地目录复制文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_49.jpg)

    图 1.49:在命令行中从本地目录复制文件

  6. 在命令行中导航到您的桌面。使用 mkdir s3_exported_files 命令创建一个名为 s3_exported_files 的新本地文件夹:in

    图 1.50:在命令行中导航到桌面

  7. 接下来,使用 - -recursive 参数递归地从 S3 存储桶中导出两个文件(neg_sentiment__dracula.txtpeter_pan.txt)到您的本地目录。以下是指令的输出:![图 1.51:从 S3 存储桶复制文件的命令行

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_51.jpg)

    图 1.51:从 S3 存储桶复制文件的命令行

  8. 使用 dirls 命令验证对象是否已成功导出到你的本地文件夹,如下截图所示。这是预期的输出:![图 1.52:从 S3 存储桶进行多文件复制的结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_01_52.jpg)

图 1.52:从 S3 存储桶进行多文件复制的结果

2. 使用自然语言处理分析文档和文本

活动 2.01:将 Lambda 与 Amazon Comprehend 集成以执行文本分析

解决方案

  1. test_s3trigger_configured.txt 文件上传到我们的 S3 存储桶以验证 Lambda s3_trigger 函数配置成功。

  2. 导航到 S3 页面:https://console.aws.amazon.com/s3/.

  3. 点击用于测试 s3_trigger 函数的存储桶名称(在我的情况下,为 aws-ml-s3-trigger-202001181023):![图 2.55:S3 存储桶列表

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_55.jpg)

    图 2.55:S3 存储桶列表

  4. 点击 上传:![图 2.56:S3 存储桶列表上传屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_56.jpg)

    图 2.56:S3 存储桶列表上传屏幕

    以下屏幕将显示:

    ![图 2.57:S3 上传存储桶添加文件屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_57.jpg)

    图 2.57:S3 上传存储桶添加文件屏幕

  5. 点击 添加文件:![图 2.58:S3 添加文件选择屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_58.jpg)

    图 2.58:S3 添加文件选择屏幕

  6. 导航到 test_s3trigger_configured.txt 文件位置。选择该文件。

    该文件包含以下文本:

    I am a test file to verify the s3 trigger was successfully configured on 1/20/2020 at 1:34 PM and tried 3 times!
    

    在我们执行 s3_trigger 之前,考虑以下文本方面的输出:情感(正面、负面或中性)、实体(数量、人物、地点等)和关键词。

    备注

    test_s3trigger_configured.txt 可在以下 GitHub 仓库中找到:https://packt.live/3gAxqku.

  7. 点击 上传,然后 下一步:![图 2.59:用于 Lambda 触发测试的存储桶中添加的文件

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_59.jpg)

    图 2.59:用于 Lambda 触发测试的存储桶中添加的文件

  8. 在设置权限选项卡中点击 下一步:![图 2.60:用于 Lambda 触发测试的存储桶中添加的文件——对象权限

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_60.jpg)

    图 2.60:用于 Lambda 触发测试的存储桶中添加的文件——对象权限

  9. 保持默认的 Standard 存储类 并点击 下一步:![图 2.61:用于 Lambda 触发测试的存储桶中添加的文件——存储类

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_61.jpg)

    图 2.61:用于 Lambda 触发测试的存储桶中添加的文件——存储类

  10. 选择 上传:![图 2.62:用于 Lambda 触发测试的存储桶中添加的文件——上传

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_62.jpg)

    图 2.62:用于 Lambda 触发测试的存储桶中添加的文件——上传

  11. 你将在文件列表中看到该文件:![图 2.63:用于 Lambda 触发测试的存储桶中添加的文件 – 文件列表

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_63.jpg)

    图 2.63:用于 Lambda 触发测试的存储桶中添加的文件 – 文件列表

  12. 现在我们来看看我们的Lambda是否被触发。通过Services>Compute>Lambda>Functions>s3_trigger导航回Lambda。点击监控:![图2.64:选择监控选项卡

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_64.jpg)

    图2.64:选择监控选项卡

  13. 点击在CloudWatch中查看日志:![图2.65:在CloudWatch中选择查看日志

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_65.jpg)

    图2.65:在CloudWatch中选择查看日志

  14. 点击日志流:![图2.66:选择日志流

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_66.jpg)

    图2.66:选择日志流

  15. 选择文本旁边的单选按钮以展开输出:![图2.67:点击单选按钮以展开Lambda输出

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_67.jpg)

    图2.67:点击单选按钮以展开Lambda输出

    以下是一些输出内容的前几行。要查看整个输出,您需要向下滚动以查看所有结果(见下文)。我们将在下一步解释总输出:

    ![图2.68:s3_trigger输出的顶部部分

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_68.jpg)

    图2.68:s3_trigger输出的顶部部分

    注意

    如果您遇到权限错误,请检查Services>Security, Identity, & Compliance-IAM-Roles中的s3TriggerRole的权限。策略列表应如下所示。如果其中之一缺失,您可以添加它们。

  16. 此外,如果您删除并重新创建Lambda,您可以重用该角色——只需选择使用现有角色而不是创建新角色。总是好的,尝试各种配置并了解它们是如何相互配合的:![图2.69:s3TriggerRole的策略

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_02_69.jpg)

    图2.69:s3TriggerRole的策略

  17. 现在我们来检查AWS Comprehend的Lambda结果。您可能会看到略有不同的置信度水平,因为亚马逊定期训练其算法。

    Sentiment_response -> 被分类为51.0%可能是中性的。这是一个陈述,所以中性是好的。

    Sentiment_response

    { {'Sentiment': 'NEUTRAL', 
       'SentimentScore': {'Positive': 0.21022377908229828, 
                          'Negative': 0.27646979689598083, 
                          'Neutral': 0.5132954716682434, 
                          'Mixed': 1.0932244549621828e-05},
    

    entity_response -> 它确实从文本中找到了日期和数量

    entity_response

    { 'Entities': [{'Score': 0.9891313314437866, 
                    'Type': 'DATE', 'Text': '1/20/2020 at 1:34 PM', 
                    'BeginOffset': 76, 'EndOffset': 96}, 
                   {'Score': 0.9999986290931702, 'Type': 'QUANTITY', 
                    'Text': '3 times', 'BeginOffset': 107, 
                    'EndOffset': 114}], 
    

    key_phases_response -> 它找到了关键短语,分数接近100%的置信度

    key_phases_response

    {'KeyPhrases': [{'Score': 0.9992266297340393, 
                     'Text': 'a test file', 'BeginOffset': 8, 
                     'EndOffset': 19}, 
                    {'Score': 0.9999999403953552, 
                     'Text': 'the s3 trigger', 'BeginOffset': 30, 
                     'EndOffset': 44}, 
                    {'Score': 0.9999963045120239, 
                     'Text': '1/20/2020', 'BeginOffset': 76, 
                     'EndOffset': 85}, 
                    {'Score': 0.9960731863975525, 
                     'Text': '1:34 PM', 'BeginOffset': 89, 
                     'EndOffset': 96}, 
                    {'Score': 0.9999966621398926, 'Text': '3 times', 
                     'BeginOffset': 107, 'EndOffset': 114}],
    

3. 主题建模和主题提取

活动三.01:对一组未知主题的文档执行主题建模

解决方案

  1. 对于这个活动,我们将使用1,000个电影评论文件。导航到以下链接(或导航到您已下载GitHub文件的本地目录)以获取包含电影评论的文本数据文件:https://packt.live/3gISDZL。肯定比手动下载1,000个文件要好。

  2. 导航到S3仪表板https://s3.console.aws.amazon.com/s3/home

  3. 点击您之前创建的存储桶(在我的情况下,它是"aws-ml-input-for-topic-modeling-20200301"):![图3.50:'input-for-topic-modeling'的S3主屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_50.jpg)

    图3.50:'input-for-topic-modeling'的S3主屏幕

  4. 点击创建文件夹:![图3.51:点击创建文件夹

    图片 B16061_03_51.jpg

    图3.51:点击创建文件夹

  5. 输入movie_review_files并点击保存:![图3.52:点击保存

    图片 B16061_03_52.jpg

    图3.52:点击保存

    注意

    对于这一步,您可以选择跟随练习并输入Jupyter笔记本中的代码,或者从本章的源代码文件夹中获取笔记本文件(text_files_to_s3.ipynb):https://packt.live/2W077MR。复制文件并将其粘贴到编辑器中。

  6. 首先,您将使用以下命令导入osboto3包:

    import os
    import boto3
    
  7. 创建一个S3客户端:

    # Create an S3 client
    s3 = boto3.client('s3')
    
  8. 接下来,在突出显示的区域输入您唯一的存储桶名称:

    BUCKET_NAME = '<insert a unique bucket name>'
    BUCKET_FOLDER = 'movie_review_files/'
    
  9. 接下来,获取本地路径中文本文件的当前工作目录:

    LOCAL_PATH = os.getcwd() +'\\os.getcwd() command will get the current path. Ensure that the movie review files are in a folder located at the same path. Based on the folder name, you have to change the highlighted value. Alternatively, you can assign a custom path to LOCAL_PATH as well.
    
  10. 创建所有文本文件的列表:

    text_files_list = [f for f in os.listdir(LOCAL_PATH) \
                       if f.endswith('.txt')]
    
  11. 对所有文件进行迭代,并将每个文件上传到s3

    file_count = 0
    for filename in text_files_list:
      # print(filename)
      file_count += 1
    s3.upload_file(LOCAL_PATH + filename, BUCKET_NAME, \
                   BUCKET_FOLDER + filename)
    print(F"Completed uploading {file_count} files.")
    
  12. Shift + Enter运行单元格。

  13. 这将需要几分钟时间。结果是1,000个文本文件被上传到S3的movie_review_files文件夹:![图3.53:上传到S3的movie_review_files

    图片 B16061_03_53.jpg

    图3.53:上传到S3的movie_review_files

  14. 参考以下图中的S3输出前几行:![图3.54:S3中的movie_review_files

    图片 B16061_03_54.jpg

    图3.54:S3中的movie_review_files

  15. 接下来,通过Comprehend链接导航到AWS Comprehend:https://aws.amazon.com/comprehend/。您也可以从https://aws.amazon.com/进入,然后点击我的账户并选择AWS管理控制台。在控制台中,选择服务然后点击机器学习类别下的Amazon Comprehend

  16. 然后,点击启动Amazon Comprehend:![图3.55:Amazon Comprehend的主屏幕

    图片 B16061_03_55.jpg

    图3.55:Amazon Comprehend的主屏幕

  17. 现在,点击左侧工具栏上的第一个项目分析作业:![图3.56:选择分析作业

    图片 B16061_03_56.jpg

    图3.56:选择分析作业

  18. 现在,点击创建作业:![图3.57:点击创建作业

    图片 B16061_03_57.jpg

    图3.57:点击创建作业

  19. 现在,在名称输入字段中输入unknown_topic_structure_job:![图3.58:输入unknown_topic_structure_job

    图片 B16061_03_58.jpg

    图3.58:输入unknown_topic_structure_job

  20. 在分析类型下拉框中选择主题建模:![图3.59:选择主题建模分析类型

    图片 B16061_03_59.jpg

    图3.59:选择主题建模分析类型

  21. 现在,向下滚动到输入数据部分并点击浏览S3:![图3.60:选择浏览S3按钮

    图片 B16061_03_60.jpg

    图3.60:选择浏览S3按钮

  22. 点击所选存储桶旁边的单选按钮以输入用于主题建模的文件(aws-ml-input-for-topic-modeling-20200301),然后点击存储桶名称:![图3.61:展开S3存储桶子文件夹

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_61.jpg)

    图 3.61:展开 S3 存储桶子文件夹

  23. 点击“movie_review_files”文件夹旁边的单选按钮:![图 3.62:选择 movie_review_files 文件夹

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_62.jpg)

    图 3.62:选择 movie_review_files 文件夹

  24. 现在,点击“选择”按钮。

    以下图显示了所选输入数据的 S3 位置:

    ![图 3.63:选择输入数据所选的 S3 位置

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_63.jpg)

    图 3.63:选择输入数据的 S3 位置

  25. 从“输入格式”下拉菜单中选择“每文件一个文档”:![图 3.64:选择每文件一个文档选项

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_64.jpg)

    图 3.64:选择每文件一个文档选项

  26. 接下来,在“主题数量”输入字段中输入40:![图 3.65:输入 40 个主题

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_65.jpg)

    图 3.65:输入 40 个主题

  27. 滚动到选择输出位置,然后点击“浏览 S3”:![图 3.66:点击浏览 S3

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_66.jpg)

    图 3.66:点击浏览 S3

  28. 选择您为主题建模输出唯一命名的输出存储桶,然后点击“选择”:![图 3.67:选择主题建模输出的 S3 存储桶

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_67.jpg)

    图 3.67:选择主题建模输出的 S3 存储桶

  29. 滚动到“访问权限”,并选择如图所示的“使用现有的 IAM 角色”:![图 3.68:在访问权限中选择使用现有的 IAM 角色

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_68.jpg)

    图 3.68:在访问权限中选择使用现有的 IAM 角色

  30. 在“角色名称”下拉菜单中,选择AmazonComprehendServiceRole-myTopicModelingRole:![图 3.69:选择现有的 IAM 角色

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_69.jpg)

    图 3.69:选择现有的 IAM 角色

  31. 最终屏幕应如下所示:![图 3.70:选择现有的 IAM 角色

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_70.jpg)

    图 3.70:选择现有的 IAM 角色

  32. 点击“创建作业”按钮。主题建模作业状态将首先显示为“已提交”:![图 3.71:状态为已提交

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_71.jpg)

    图 3.71:状态为已提交

  33. 主题建模作业状态将随后显示为“进行中”。主题建模作业大约需要 20 分钟:![图 3.72:状态为进行中

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_72.jpg)

    图 3.72:状态为进行中

  34. 当状态变为“完成”时,点击unknown_topic_structure_job链接:![图 3.73:选择超链接的主题建模链接

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_73.jpg)

    图 3.73:选择超链接的主题建模链接

    备注

    如您所见,我们第一次没有做对,状态显示为“失败”。可能需要尝试几次。如果作业失败,请点击“复制”(位于“创建作业”按钮左侧的按钮)并纠正错误。由于不能有重复的作业,一个好的流程是在作业名称后附加一个序列号,例如,unknown_topic_structure_job_01

  35. 滚动并单击主题建模输出超链接(您的将显示不同的唯一主题建模作业字母数字字符串):![图3.74:单击主题建模输出S3位置

    ![img/B16061_03_74.jpg]

    图3.74:单击主题建模输出S3位置

  36. 您将被引导到S3输出文件夹中实际的主题建模作业文件。点击“下载”:![图3.75:在输出文件上点击下载

    ![img/B16061_03_75.jpg]

    图3.75:在输出文件上点击下载

  37. 将文件保存到本地目录;通常,下载文件夹或桌面都行:![图3.76:从S3保存下载的输出文件

    ![img/B16061_03_76.jpg]

    图3.76:从S3保存下载的输出文件

  38. 导航到您下载文件的目录,通过双击提取CSV文件。在Windows中,右键单击output.tar.gz文件并选择“在此处提取”:![图3.77:选择此处提取

    ![img/B16061_03_77.jpg]

    图3.77:选择此处提取

    结果是两个CSV文件:doc-topics.csvtopic-terms.csv

    作为参考,提取的CSV文件可在以下GitHub目录中找到,以及您在本地目录中下载它们的位置(在我的情况下,这是/Users/ksankar/Documents/aws_book/The-Applied-AI-and-Natural-Language-Processing-with-AWS/Chapter03/Activity3.01):

    https://packt.live/2AIccSw.

    https://packt.live/3eaGdry.

    我们已经完成了第1部分:执行主题建模,对于这个活动。现在,让我们进入第2部分:未知主题的分析。

    注意

    对于这一步,您可以选择跟随练习并输入代码到Jupyter笔记本中,或者从您下载存储库的GitHub文件夹中获取local_csv_to_s3_for_analysis.ipynb文件并将其粘贴到Jupyter编辑器中。作为参考,源代码可通过以下GitHub存储库获取:https://packt.live/3gDErks

  39. 首先,我们将导入boto3

    import boto3
    
  40. 接下来,导入pandas

    import pandas as pd
    
  41. 创建S3客户端对象。

    region = 'us-west-2'
    s3 = boto3.client('s3',region_name = region)
    
  42. 接下来,为存储源CSV文件的S3存储桶创建一个唯一名称。在这里,存储桶被命名为unknown-tm-analysis-20200302,但您需要创建一个唯一的名称:

    #'<insert a unique bucket name>'
    bucket_name = 'unknown-tm-analysis-20200302'
    
  43. 接下来,创建一个新的存储桶:

    # Create a location Constraint
    location = {'LocationConstraint': region}
    # Creates a new bucket 
    s3.create_bucket(Bucket=bucket_name,\
                     CreateBucketConfiguration=location)
    
  44. 创建一个CSV文件名列表以导入:

    filenames_list = ['doc-topics.csv', 'topic-terms.csv']
    
  45. 遍历每个要上传到S3的文件:

    for filename in filenames_list: 
        s3.upload_file(filename, bucket_name, filename)
    
  46. 接下来,检查文件名是否为'doc-topics.csv'

    if filename == 'doc-topics.csv':
    
  47. 现在,获取doc-topics.csv文件对象并将其分配给obj变量:

    obj = s3.get_object(Bucket=bucket_name, Key=filename)
    
  48. 接下来,读取csv对象并将其分配给doc_topics变量:

    doc_topics = pd.read_csv(obj['Body']) else:
    obj = s3.get_object(Bucket=bucket_name, Key=filename) \
                        topic_terms = pd.read_csv(obj['Body'])
    
  49. 在主题列上合并文件以获取每个文档的最常见术语:

    merged_df = pd.merge(doc_topics, topic_terms, on='topic')
    
  50. merged_df打印到控制台:

    print(merged_df)
    
  51. 接下来,使用Shift + Enter执行笔记本单元格。

  52. 控制台输出是一个合并的DataFrame,它提供了文档名称及其相应的术语和术语的权重(参见图):![图3.78:S3创建存储桶调用的输出

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_78.jpg)

图 3.78:S3 创建存储桶调用的输出

![图 3.79:活动合并主题建模输出

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_03_79.jpg)

图 3.79:活动合并主题建模输出

5. 使用语音与聊天机器人

活动第 5.01:创建自定义机器人和将机器人连接到 Amazon Connect

解决方案:

这是一个结合了我们之前章节所学内容的活动。尝试自己完成活动,并在需要时参考解决方案。你可能会犯错,会遇到看起来不起作用的事情。这些都是学习有趣领域的一部分。如果你逐步构建和测试,开发将更容易,并且会有更少的移动部件。

步骤 1:创建 S3 存储桶并存储 balance.txt

  1. 首先,从 https://aws.amazon.com/ 导航到 Amazon S3 服务,然后导航到 我的账户 – AWS 管理控制台-服务-存储-S3。点击 创建存储桶:![图 5.35:为用户账户余额创建 S3 存储桶

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_35.jpg)

    图 5.35:为用户账户余额创建 S3 存储桶

    对于 存储桶名称,输入 account-balance,然后点击 创建

    注意

    AWS 中的存储桶名称必须唯一。否则,您将收到 存储桶名称已存在 错误。一种简单的方法是将日期和时间附加到存储桶名称上,例如,YYYYMMDDHHMM。在编写本章时,我们创建了一个名为 account-balance-202001241911 的存储桶,并且它工作正常。

  2. 您的存储桶将被创建,并且您将被重定向到存储桶列表:![图 5.36:S3 存储桶列表屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_36.jpg)

    图 5.36:S3 存储桶列表屏幕

  3. 点击您正在使用的存储桶名称(在我们的例子中,为 account-balance-202001241911),然后点击 上传:![图 5.37:S3 存储桶列表在上传屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_37.jpg)

    图 5.37:上传屏幕上的 S3 存储桶列表

    以下屏幕将显示:

    ![图 5.38:S3 上传存储桶添加文件屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_38.jpg)

    图 5.38:S3 上传存储桶添加文件屏幕

  4. 点击 添加文件:![图 5.39:S3 添加文件选择屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_39.jpg)

    图 5.39:S3 添加文件选择屏幕

  5. 导航到 balance.txt 文件位置。选择文件。

    注意

    balance.txt 文件可以从以下 GitHub 仓库获取:https://packt.live/38CipvB

    正如我们在 第 1 章 中提到的,AWS 简介,你应该已经将 GitHub 文件下载到本地子目录中。

    例如,将文件下载到 Documents/aws-book/The-Applied-AI-and-Natural-Language-Processing-with-AWS 目录。正如你可能猜到的,这个练习的文件位于 Chapter05 子目录中。

  6. 选择完文件后,点击 打开 按钮上传文件:![图 5.40:资源管理器中的文件选择窗口

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_40.jpg)

    图 5.40:资源管理器中的文件选择窗口

  7. 点击 下一步:![图 5.41:S3 选择文件标签页

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_41.jpg)

    图 5.41:S3 选择文件选项卡

  8. 将权限设置为以下截图所示:![图 5.42:S3 设置权限选项卡

    图 5.47:Lambda 控制台

    图 5.42:S3 设置权限选项卡

  9. 在“存储类”下保持默认的“标准”选项,然后点击“下一步”:![图 5.43:S3 设置属性选项卡

    图 5.44:S3 审查选项卡

    图 5.43:S3 设置属性选项卡

  10. 在“审查”选项卡中选择“上传”:![图 5.44:S3 审查选项卡

    图 5.42:S3 设置权限选项卡

    图 5.44:S3 审查选项卡

  11. 您将在文件列表中看到该文件:![图 5.45:S3 文件列表

    图 5.48:AWS Lambda – 使用从头开始创建作者选择创建函数

图 5.45:S3 文件列表

步骤 2:创建一个 Lambda 函数以访问 S3 存储桶并读取账户余额

  1. 导航到 Amazon Lambda,然后选择“服务”,在“计算”下点击Lambda:![图 5.46:服务 > 计算 > Lambda

    图 5.46:服务 > 计算 > Lambda

    图 5.46:服务 > 计算 > Lambda

    您将看到以下 Lambda 控制台:

    ![图 5.47:Lambda 控制台

    图 5.52:AWS Lambda—the default lambda_function screen

    图 5.47:Lambda 控制台

  2. Lambda控制台中,点击“创建函数”。

  3. 从可用选项中选择“从头开始创建作者”。对于“函数名称”,键入fetch_balance:![图 5.48:AWS Lambda – 使用从头开始创建作者选择创建函数

    图 5.53:fetch_balance 函数代码

    图 5.48:AWS Lambda – 使用从头开始创建作者选择创建函数

  4. 对于“运行时”选项,从列表中选择Python 3.6:![图 5.49:AWS Lambda—Python 3.6 选择

    图 5.52:AWS Lambda—the default lambda_function screen

    图 5.49:AWS Lambda—Python 3.6 选择

  5. 点击“选择或创建执行角色”,然后选择“从 AWS 策略模板创建新角色”。然后,在“角色名称”字段中输入readBalanceRole

  6. 在“策略模板”下点击下拉菜单,然后选择“Amazon S3 对象只读权限”。

  7. 然后,点击“创建函数”按钮以在 AWS 中创建 Lambda 函数:![图 5.50:AWS Lambda—创建函数屏幕

    图 5.43:S3 设置属性选项卡

    图 5.50:AWS Lambda—创建函数屏幕

    您将看到 Lambda 函数设计器。那里有很多信息。让我们关注这个活动的要点:

    ![图 5.51:AWS Lambda—函数设计器

    图 5.45:S3 文件列表

    图 5.51:AWS Lambda—函数设计器

  8. 接下来,将屏幕向下滚动到“函数代码”部分。默认代码将与以下代码相同或类似:![图 5.52:AWS Lambda—the default lambda_function screen

    图 5.51:AWS Lambda—函数设计器

    图 5.52:AWS Lambda—默认 lambda_function 屏幕

  9. 在这里,我们可以在lambda_function选项卡内完全输入和编辑我们的代码(只要“代码输入类型”设置为“内联编辑”,这是下拉菜单中的默认值):

    注意

    对于这个步骤,您可以跟随操作并输入代码,或者您可以从您本地磁盘上的源代码文件夹中获取它,该文件夹是从 GitHub 或 https://packt.live/2ZOSJbd 下载的文件。

    ![图 5.53:fetch_balance 函数代码

    图片

    图 5.53:fetch_balance函数的代码

  10. 首先,我们从http://boto3.readthedocs.io/en/latest/导入boto3

    import boto3
    
  11. 接下来,创建一个接受两个参数——eventcontext的函数:

    def Lambda_handler(event, context):
    
  12. 接下来,创建s3客户端对象:

    s3 = boto3.client("s3")
    
  13. 接下来,将<输入桶名>替换为您创建的桶(例如,在我的例子中是account-balance-202001241911):

    # e.g." account-balance-202001241911"
    bucket = "<input Bucket name>"
    
  14. 接下来,将filename分配给一个变量,然后打印文件名:

    filename = 'balance.txt'
    print("filename: ", filename)
    
  15. 接下来,通过获取BucketKey创建文件对象:

    file_obj = s3.get_object(Bucket = Bucket, Key = filename)
    
  16. 从文件中提取账户余额:

    account_balance =  (float(file_obj['Body'].read()))
    
  17. 然后,将余额作为消息返回:

    return close('Your balance is ' + str(account_balance))
    
  18. 我们需要为我们的机器人提供一个close函数,它需要一个格式良好的 JSON 响应:

    def close(message):
        return {
            'sessionAttributes': {},
            'dialogAction': {
                'type': 'Close',
                'fulfillmentState': 'Fulfilled',
                'message': {
                    'contentType': 'PlainText',
                    'content': message
                }
            }
        }
    

    记得经常保存函数:

    备注

    使用右上角的测试按钮测试和调试代码。您将在代码面板下方的执行结果中看到结果。

  19. 点击右上角的测试按钮:![图 5.54:测试 Lambda 函数的测试按钮

    图片

    图 5.54:测试 Lambda 函数的测试按钮

  20. 对于每个测试,我们至少需要创建一个测试事件。如果您是第一次运行测试,您将看到配置测试事件屏幕:![图 5.55:配置测试事件以测试 Lambda 函数

    图片

    图 5.55:配置测试事件以测试 Lambda 函数

  21. 如果事件需要值,例如股票符号或账户号码,这就是创建有效 JSON 有效负载的地方。如果你根据用户的要求有多个操作,你可以有多个事件,然后使用任何事件调用 Lambda。在我们的例子中,为了保持交互简单,我们不在事件有效负载中查找任何信息。所以只需给事件起一个名字——例如,输入getBalance然后点击创建按钮。![图 5.56:配置名为 getBalance 的测试事件

    图片

    图 5.56:配置名为 getBalance 的测试事件

  22. 您将在执行结果选项卡下看到结果:![图 5.57:fetch_balance函数的执行结果 - 响应

    图片

    图 5.57:fetch_balance函数的执行结果 - 响应

  23. 如果您在执行结果窗口中向下滚动,您将看到更多详细信息以及您在代码中看到的函数日志。在开发 Lambda 函数时打印诊断消息总是好的:![图 5.58:fetch_balance函数的执行结果 – 函数日志

    图片

图 5.58:fetch_balance函数的执行结果 – 函数日志

第 3 步:创建 Lex 机器人以使用 Lambda 函数获取余额

  1. 第一步是导航到 AWS 控制台中的Amazon Lex服务。您可以通过点击服务|机器学习|Amazon Lex或导航到https://console.aws.amazon.com/lex来实现。

  2. 下一步是点击创建按钮,以便进入聊天机器人创建屏幕:![图5.59:Amazon Lex控制台

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_59.jpg)

    图5.59:Amazon Lex控制台

  3. 在这一点上,您可以通过点击自定义聊天机器人选项来创建一个自定义聊天机器人。这会显示聊天机器人的详细信息,可以填写,如下面的截图所示:![图5.60:自定义聊天机器人选项

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_60.jpg)

    图5.60:自定义聊天机器人选项

  4. 聊天机器人名称字段可以设置为GetBalance输出语音字段可以设置为任何声音,例如,您可以选择Kendra。这是因为我们将使用语音与聊天机器人进行交互。

  5. 会话超时可以设置为默认的5分钟。IAM角色字段显示IAM角色的名称,Lex会自动创建该角色以供聊天机器人应用程序使用。对于情感分析,我们选择

  6. 最后,COPPA字段指的是儿童在线隐私保护法案,这是在线应用程序必须遵守的。根据您是否希望13岁以下的用户使用您的聊天机器人,选择

    注意

    1998年通过了一项法律,以保护13岁以下儿童的隐私。该法律指出,在线网站在未经父母同意的情况下,不得收集13岁以下用户的个人信息,以及其他规定。您可以在https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule了解更多关于COPPA的信息。

  7. 最后,点击创建按钮将创建聊天机器人,并带您进入聊天机器人的编辑屏幕。此屏幕将允许您为聊天机器人创建和定义意图,以及一个具有自定义槽类型的槽。

  8. 点击创建意图按钮,将弹出添加意图的弹出对话框:![图5.61:GetBalance聊天机器人的编辑标签

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_61.jpg)

    图5.61:GetBalance聊天机器人的编辑标签

  9. 相反,如果您已经定义了一个意图,您可以通过点击屏幕左侧菜单中意图标题旁边的+号来创建一个新的意图。

  10. 创建意图窗口提供了一些选项,可以将意图添加到聊天机器人中。导入意图链接允许您从包含一个或多个Lex格式意图的ZIP文件中导入意图。

  11. 搜索现有意图允许您重用您可能之前定义或导入的意图,以及Amazon Lex定义的内置意图。

  12. 您只需点击创建意图链接,即可进入以下对话框。

  13. 创建意图对话框中,为新意图命名为Balance。当您告诉聊天机器人您对市场报价感兴趣时,聊天机器人将识别此意图。点击添加按钮完成此步骤:![图5.62:创建意图对话框

    图片

    图 5.62:创建意图对话框

    你应该回到屏幕左侧工具栏部分的 Balance 意图。编辑器 屏幕还包含许多用于定义和自定义新意图的字段。

  14. 首件事是填写一些 示例语句 以训练 Lex 背后的 NLU 系统,以便识别你提供给机器人的语句作为用户对 Balance 意图的信号:![图 5.63:创建新意图

    图片

    图 5.63:创建新意图

  15. 在输入一些示例语句后,你点击页面顶部的 构建 按钮以启动机器人的训练过程:![图 5.64:构建机器人

    图片

    图 5.64:构建机器人

  16. 将会出现一个带有另一个 构建 按钮的后续对话框,你也应该点击它:![图 5.65:构建确认

    图片

    图 5.65:构建确认

  17. 在此之后,你应该等待,直到你看到 GetBalance 构建成功 消息框。这可能需要几秒钟到几分钟:![图 5.66:机器人构建成功

    图片

    图 5.66:机器人构建成功

    你可以在屏幕右上角的 测试机器人 窗格中测试你的新意图,在机器人内部。

    注意

    如果 测试机器人 窗格不可见,你可能需要点击箭头按钮以展开它并使其可见。

    在窗格中输入语句以验证机器人能否从语句中识别出正确的意图:

    ![图 5.67:测试机器人窗格

    图片

    图 5.67:测试机器人窗格

    当它返回响应:“意图 Balance 是 ReadyForFulfillment”时,你就知道它已经正确识别了意图。请随意根据你的示例语句进行实验,以验证 NLU 引擎是否正常工作。

    在这个阶段,你的机器人几乎不做任何事情,除了尝试识别 Balance 意图并标记它已准备好执行。

  18. 让我们现在连接我们的 Lambda 函数并查看它是否工作。在 执行 中选择 AWS Lambda 函数,然后选择 fetch_balance Lambda 函数:![图 5.68:Lambda 启动

    图片

    图 5.68:Lambda 启动

  19. 点击 构建 并再次测试。现在应该会显示余额:![图 5.69:测试 Lambda 函数

    图片

图 5.69:测试 Lambda 函数

我们正在取得良好的进展。

步骤 4:将 Amazon Connect 呼叫中心连接到 GetBalance 机器人

我们将扩展在 练习 5.01 中创建的呼叫中心,以添加此 GetBalance 功能。

  1. 我的账户 | AWS 管理控制台,转到 服务 | 客户参与 | Amazon Connect。选择你创建的实例(在我们的例子中是 jarvis42):![图 5.70:Amazon Connect 联系流程配置

    图片

    图5.70:Amazon Connect联系流程配置

    我们有两种连接方式——通过Amazon Lex或AWS Lambda。我们将使用Lex,但您也可以自由尝试Lambda。

  2. 添加GetBalance机器人:![图5.71:Amazon Connect联系流程

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_71.jpg)

    图5.71:Amazon Connect联系流程

  3. 下一步是创建一个联系流程。转到仪表板,点击右上角的查看联系流程创建联系流程

  4. 将其命名为GetBalance,并按照以下方式连接:![图5.72:联系流程编辑器—添加入口点

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_72.jpg)

    图5.72:联系流程编辑器—添加入口点

  5. 添加获取客户输入和一条友好的消息:![图5.73:获取客户输入详情

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_73.jpg)

    图5.73:获取客户输入详情

  6. 将其连接到我们的GetBalance Lex机器人和Balance意图:![图5.74:获取客户输入配置

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_74.jpg)

    图5.74:获取客户输入配置

    然后,暂时将所有这些连接到挂断。这是一个简单的序列。您可以尝试各种流程:

    ![图5.75:添加挂断流程

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_75.jpg)

    图5.75:添加挂断流程

    现在我们已经创建了另一个联系流程,让我们重新连接我们的电话号码来回答这个问题。

  7. 前往概览,点击登录URL,然后输入您的Amazon Connect凭据:![图5.76:概览屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_76.jpg)

    图5.76:概览屏幕

  8. 点击路由电话号码:![图5.77:选择电话号码

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_77.jpg)

    图5.77:选择电话号码

  9. 点击电话号码:![图5.78:管理电话号码屏幕

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_78.jpg)

    图5.78:管理电话号码屏幕

  10. 从下拉列表中选择GetBalance用于Contact flow/IVR:![图5.79:将GetBalance添加到电话号码

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_05_79.jpg)

    图5.79:将GetBalance添加到电话号码

  11. 点击保存。现在您已经将机器人连接到了呼叫中心。

  12. 拨打电话。它会问您我能帮您什么忙?您可以说我有多少钱?然后它会回答您有42.0!亚马逊做得很好:当我们通过测试控制台从键盘激活机器人时,它给我们发回了文本消息。然而,当我们通过Connect拨打时,它给我们的是语音回答。

这是个好时机,可以尝试不同的问题,甚至不同的人——您的朋友、您的配偶和其他人。通过相对较少的工作,语音机器人将能够理解他们在说什么,并回答这个简单的问题。您可以尝试不同的提示,也许甚至添加一个美元符号,看看它是否正确地说出来。

6. 计算机视觉和图像处理

活动第6.01节:在Rekognition中创建和分析不同的面部

解决方案:

  1. 从亚马逊管理控制台导航到亚马逊Rekognition服务,并在左侧工具栏中选择面部比较

  2. 将第一组图像上传到 Rekognition 以便它可以识别和比较人脸,即https://packt.live/31X6IP6https://packt.live/2ZLseUd:![图 6.56:用于人脸比较的第一组图像

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_56.jpg)

    图 6.56:用于人脸比较的第一组图像

    即使在不同角度、光照和色调下,Rekognition 也能以 99.1% 的置信度识别出这些人脸是同一个人:

    ![图 6.57:用于人脸比较的第一组图像的结果

    ](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_57.jpg)

    图 6.57:用于人脸比较的第一组图像的结果

    额外挑战

  3. 第二组图像是 https://images.unsplash.com/photo-1526510747491-58f928ec870fhttps://images.unsplash.com/photo-1529946179074-87642f6204d7

![图 6.58:用于人脸比较的第二组图像

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_58.jpg)

图 6.58:用于人脸比较的第二组图像

再次证明,Rekognition 以 99.4% 的置信度识别出人脸,即使在不同的角度下:

![图 6.59:用于人脸比较的第二组图像的结果

](https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/app-ai-nlp-ws/img/B16061_06_59.jpg)

图 6.59:用于人脸比较的第二组图像的结果

在那些令人印象深刻的成果基础上,我们得出这个活动的结论。

posted @ 2025-09-24 13:51  绝不原创的飞龙  阅读(18)  评论(0)    收藏  举报