AWS-机器学习-全-

AWS 机器学习(全)

原文:annas-archive.org/md5/fe7fe8c4b2ea83384eccb4287b198b26

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

关于

本节简要介绍了作者、本书涵盖的内容、开始学习所需的技能,以及完成所有包含的活动和练习所需的硬件和软件要求。

关于本书

在本书中,你将了解 AWS 上可用的各种人工智能和机器学习服务。通过实践动手练习,你将学习如何使用这些服务生成令人印象深刻的结果。到本书结束时,你将基本了解如何在自己的项目中使用广泛的 AWS 服务。

关于作者

Jeffrey Jackovich 是本书的作者,他是一位好奇的数据科学家,拥有健康技术和并购(M&A)背景。他拥有丰富的以业务为导向的医疗保健知识,但喜欢使用 R 和 Python 分析所有类型的数据。他热爱数据科学过程中的挑战,并在摩洛哥担任和平队志愿者时磨练了他的独创性格。他正在波士顿大学完成计算机信息系统硕士学位,主修数据分析。

Ruze Richards 是本书的作者,同时也是一位数据科学家和云架构师,他大部分职业生涯都在为企业和小型初创公司构建高性能分析系统。他对人工智能和机器学习特别热情,最初作为一名物理学家,对神经网络产生了兴趣,随后在 AT&T 贝尔实验室工作以进一步追求这一兴趣领域。随着新的一波热情以及云计算上实际可用的计算能力,他非常高兴能够传播知识并帮助人们实现目标。

目标

  • 在 AWS 平台上开始使用机器学习

  • 使用人工智能和亚马逊 Comprehend 分析非结构化文本

  • 创建一个聊天机器人,并使用语音和文本输入与之交互

  • 通过你的聊天机器人检索外部数据

  • 开发自然语言界面

  • 使用亚马逊 Rekognition 将人工智能应用于图像和视频

读者对象

这本书非常适合想要了解亚马逊云服务(Amazon Web Services)的人工智能和机器学习能力的数据科学家、程序员和机器学习爱好者。

方法

本书以实践为导向,教你使用 AWS 进行机器学习。它包含多个活动,使用真实业务场景让你练习并应用你的新技能,在一个高度相关的环境中。

最小硬件要求

为了获得最佳的学生体验,我们推荐以下硬件配置:

  • 处理器:英特尔酷睿 i5 或同等性能

  • 内存:4GB RAM

  • 存储:35GB 可用空间

软件要求

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

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

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

  3. AWS 免费层账户

约定

文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称如下所示:“命令形式为,"s3://myBucketName/myKey."”

代码块设置如下:

aws comprehend detect-dominant-language ^
--region us-east-1 ^
--text "Machine Learning is fascinating."

新术语和重要词汇以粗体显示。屏幕上显示的单词,例如在菜单或对话框中,在文本中显示如下:“存储在 S3 中的数据使用应用程序编程接口(API)管理,该接口可通过互联网(HTTPS)访问。”

安装和设置

在开始本书之前,您需要一个 AWS 账户。您还需要设置 AWS 命令行界面(AWXSCLI),具体步骤如下。您在整个书中还需要 Python 3.6、pip 和 AWS Rekognition 账户。

AWS 账户

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

AWSCLI 设置

从以下链接安装 AWS CLI 设置 s3.amazonaws.com/aws-cli/AWSCLISetup.exe。下载 AWS CLI 设置文件(包括 32 位和 64 位 MSI 安装程序,并将自动安装正确的版本)。要验证安装是否成功,请打开命令提示符并输入aws --version

安装 Python

按照以下链接中的说明安装 Python 3.6:realpython.com/installing-python/

安装 pip

  1. 要安装 pip,转到命令提示符并输入pip install awscli --upgrade --user。使用命令"aws --version"验证安装是否成功。

  2. 安装pip后,将 AWS 可执行文件添加到您的操作系统 PATH 环境变量中。使用 MSI 安装时,这应该会自动发生,但如果"aws --version"命令不起作用,您可能需要手动设置它。

  3. 要修改你的PATH变量(Windows),输入环境变量,然后选择编辑您的账户的系统环境变量,选择路径,并将路径添加到变量值字段中,用分号分隔。

安装虚拟环境

从以下链接安装适合您操作系统的 Anaconda 版本 www.anaconda.com/download/。Anaconda 可以帮助您安装所需软件,而不会与冲突的包发生冲突。

  1. 要检查 Anaconda 发行版是否更新,输入conda update conda

  2. 要创建虚拟环境,输入conda create -n yourenvname python=3.6 anaconda并按y继续,这将安装 Python 版本以及所有相关的 Anaconda 打包库到path_to_you_anaconda_location/anaconda/envs/yourenvname

  3. 要在 macOS 和 Linux 上激活账户,请输入source activate yourenvname,在 Windows 上请输入activate yourenvname

  4. 要将额外的 Python 包安装到虚拟环境中,请输入conda install –n yourenvname [package]

  5. 要取消激活虚拟环境,请输入deactivate

配置和凭证文件

要定位配置文件,请查看以下特定于操作系统的命令。更多信息请参阅:docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html

Amazon Rekognition 账户

您需要创建一个新的 Amazon Rekognition 免费层账户,客户在前 12 个月内每月可免费分析高达 5,000 张图片。要创建免费账户,请点击aws.amazon.com/rekognition/链接。

安装代码包

其他资源

本书代码包也托管在 GitHub 上:github.com/TrainingByPackt/Machine-Learning-with-AWS

我们还有其他代码包,这些代码包来自我们丰富的书籍和视频目录,可在github.com/PacktPublishing/找到。查看它们吧!

1

第一章:亚马逊网络服务的简介

学习目标

到本章结束时,你将能够:

  • 描述使用亚马逊 S3 在 AWS 上工作的基础知识

  • 使用 AWS 管理控制台和命令行界面(CLI)从亚马逊 S3 导入和导出数据

  • 使用 AWS 管理控制台

  • 识别机器学习服务

本章描述了使用 AWS 管理控制台操作 S3 以及识别机器学习服务。

简介

本章将向您介绍亚马逊网络服务(AWS)界面,并教会您如何使用亚马逊简单存储(S3)存储和检索数据。

接下来,您将通过管理控制台和命令行界面(CLI)导入和导出文本数据来应用您的 S3 知识。

最后,你将学习如何定位和测试人工智能(AI)

机器学习(ML)服务。

什么是 AWS?

AWS 是一个安全的云平台,通过互联网上的云服务平台提供按需计算能力、数据库存储、应用程序和其他 IT 资源,采用按使用付费的定价模式。截至 2018 年,根据 Canalys(https://www.canalys.com/static/press_release/2018/270418-cloud-infrastructure-market-grows-47-q1-2018-despite-underuse.pdf)的数据,AWS 在全球云基础设施服务市场中占据主导地位,市场份额约为 30%,相比之下,微软(约 15%)和谷歌(约 5%)位居其后。

什么是机器学习?

机器学习是计算机科学领域人工智能的一个子集,通常使用统计技术来提供计算机在没有编程的情况下通过数据学习的能力。机器学习探索构建和构建算法,这些算法可以从数据中学习并做出预测。这些算法超越了静态指令,并使用从样本输入中得到的模型进行数据驱动的预测和决策。

在当今世界,机器学习是必不可少的,因为它是所有行业竞争和运营数据策略的一个组成部分。更具体地说,机器学习允许从自然语言处理(NLP)中获得见解来驱动聊天机器人;在金融行业中使用欺诈检测机器学习见解,以及机器学习应用允许高效的在线推荐引擎,例如 Facebook 上的朋友建议、Netflix 显示你可能喜欢的电影,以及亚马逊上更多需要考虑的项目。

什么是人工智能?

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

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

总体而言,本章将为您提供 AWS 的基础知识,以在项目中构建复杂的 AI 和 ML 应用程序。这将帮助您识别免费层 AWS 服务,从而您将能够单独使用它们,或将它们集成以分析数据、构建会话聊天机器人、存储和处理大量数据,并将您的想法变为现实。

本章将向您介绍 AWS 接口,并帮助您学习如何使用 Amazon Simple Storage Service (S3) 存储和检索数据。您将通过通过 AWS 管理控制台和 CLI 导入和导出文本数据来应用您的 S3 知识。您还将学习如何定位和测试人工智能和机器学习服务。

什么是 Amazon S3?

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

使用 S3 的好处如下:

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

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

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

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

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

    注意

    更多信息请参阅:aws.amazon.com/s3/

为什么使用 S3?

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

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

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

  • 要实现大数据分析

它可以很容易地与额外的 AWS 机器学习和基础设施服务结合使用。例如,导入到 Amazon S3 的文本文档可以通过在 AWS Lambda 函数中运行的代码进行总结,该函数使用 AWS Comprehend 进行分析。我们将在第 2 章“使用 NLP 概述文本文档”和第 3 章“执行主题建模和主题提取”中介绍这两者。

使用 S3 在 AWS 上的基础知识

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

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

AWS 免费层账户

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

将数据导入和导出到 S3

AWS 导入和导出是一项服务,您可以使用它将大量数据从物理存储设备传输到 AWS。您将便携式存储设备邮寄到 AWS,AWS 导入/导出通过 Amazon 的高速内部网络直接从您的存储设备传输数据。您的数据加载通常在您的存储设备到达 AWS 后的下一个工作日开始。数据导出或导入完成后,服务将返回您的存储设备。对于大型数据集,AWS 数据传输可以比互联网传输快得多,并且比升级您的连接更经济。

S3 与文件系统的不同之处

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

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

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

核心 S3 概念

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

可存储的数据类型:S3 推荐用于存储静态内容,如文本文件、图像、音频、视频等。

对象:对象是存储在 S3 中最基本的实体。每个对象都包含数据、元数据和键。元数据是关于数据的数据,提供了关于存储在对象中的数据的基本信息。元数据存储在一组名称-值对中,用于描述与对象相关的信息。

:键是分配给对象的名称,它唯一地标识了存储在存储桶内的对象。存储桶中的所有对象都关联有一个键。

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

区域:区域指的是亚马逊 S3 根据用户偏好存储存储桶的地理位置。区域可以在创建存储桶时选择。位置应该基于数据将被访问最多的地方。总的来说,如果 S3 用于存储仅在一个特定地理区域内访问的网站文件,则特定区域选择对 S3 的影响最大。具有不同形式的存储桶中的对象存储如下:

图 1.1:对象存储

图 1.1:对象存储

![图 1.2:对象存储:使用唯一键和 myBucket

![img/image003.jpg]

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

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

![img/image005.jpg]

图 1.3:存储在 myBucket 中的对象

S3 操作

S3 应用程序程序接口(API)相当简单,并为相应的实体包括以下操作:

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

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

数据复制

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

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

REST 接口

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

  • Bucket 中的键

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

练习 1:使用 AWS 管理控制台创建 S3 Bucket

在这个练习中,我们将把一个文本文件导入到我们的 S3 Bucket 中。要导入文件,您需要能够访问 Amazon S3 控制台:

  1. 在点击 https://console.aws.amazon.com/console/home 时按住 Ctrl 键,在新浏览器标签页中打开 AWS 管理控制台。

  2. 在 AWS 服务下方的搜索栏中点击:![图 1.4:搜索 AWS 服务 图片 007

    图 1.4:搜索 AWS 服务
  3. 在搜索栏中输入S3,将显示一个自动填充的列表。然后,点击S3 云可扩展存储下拉选项:![图 1.5:选择 S3 服务 图片 009

    图 1.5:选择 S3 服务
  4. 现在,我们需要创建一个 S3 Bucket。在 S3 仪表板中,点击

    创建 Bucket按钮。

  5. 如果这是您第一次创建 bucket,您的屏幕将如下所示:图 1.6:创建 Bucket

    图 1.6:创建 Bucket

    注意

    如果您已经创建了 S3 Bucket,您的仪表板将列出您创建的所有 Bucket。

  6. 输入一个唯一的 Bucket 名称:Bucket 名称必须在 Amazon S3 中所有现有 Bucket 名称中是唯一的。如果您遇到命名问题,请参阅 https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html。

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

  8. 点击下一步按钮继续创建 bucket:![图 1.7:创建 Bucket 图片 013

    图 1.7:创建 Bucket 窗口
  9. S3 Bucket 提供了版本控制、服务器访问日志、标签、对象级日志和默认加密等属性选项。然而,我们将不会启用它们。

  10. 您的 Bucket 将显示在 bucket 列表中,如下所示:

![图 1.8:Bucket 已创建图片 015

图 1.8:Bucket 已创建

练习 2:使用您的 S3 Bucket 导入和导出文件

在这个练习中,我们将使用 S3 Bucket 导入和导出文件。以下是为完成这些步骤:

导入文件:

  1. 您将导入一个文件到您的 Amazon S3 Bucket。

  2. 点击 Bucket 的名称以导航到 Bucket:![图 1.9:导航到 Bucket 图片 017

    图 1.9:导航到 Bucket
  3. 您正在 Bucket 的主页。选择上传:![图 1.10:将文件上传到 Bucket 图片 019

    图 1.10:将文件上传到 Bucket
  4. 要选择上传的文件,点击pos_sentiment__leaves_of_grass.txt位置并选择您想要存储的样本文件:![img/image021.jpg]

    图 1.11:向 Bucket 添加新文件
  5. 选择要上传的文件后,选择下一步图 1.12:在 Bucket 中选择要上传的文件

    图 1.12:选择要上传到 Bucket 的文件
  6. 点击下一步按钮并保留默认选项![img/image025.jpg]

    图 1.13:上传文件时的默认选项页面
  7. 您可以为您的对象设置属性设置,例如存储类别加密元数据。但是,保留默认值不变,然后点击下一步按钮:图 1.14:设置属性

    图 1.14:设置属性
  8. 点击上传按钮上传文件:![图 1.15:上传文件选项

    ![img/image029.jpg]

    图 1.15:上传文件
  9. 您将被引导到 Bucket 主屏幕中的对象:

![图 1.16:Bucket 中上传的文件

![img/image031.jpg]

图 1.16:上传到 Bucket 的文件

导出文件

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

    图 1.17:导出文件
  2. 文件将下载,如屏幕左下角所示:

图 1.18:下载文件以导出

图 1.18:下载文件以导出

AWS 命令行界面(CLI)

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

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

练习 3:配置命令行界面

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

  1. 前往:https://console.aws.amazon.com/console/home,然后点击用户图 1.19:带有用户选项高亮的亚马逊控制台主页

    图 1.19:带有用户选项高亮的亚马逊控制台主页
  2. 在已登录的 AWS 管理控制台右上角,点击我的安全凭证:![img/image039.jpg]

    图 1.20:选择我的安全凭证
  3. 然后,点击继续到安全凭证图 1.21:安全凭证

    图 1.21:安全凭证
  4. 点击访问密钥访问密钥 ID 和密钥访问密钥)选项:图 1.22:访问密钥生成

    图 1.22:访问密钥生成
  5. 然后,点击创建新访问密钥图 1.23:创建新访问密钥

    图 1.23:创建新访问密钥
  6. 点击下载密钥文件以下载密钥文件:图 1.24:下载密钥文件

    图 1.24:下载密钥文件
  7. 包含密钥的rootkey.csv将被下载。点击它以查看详细信息:图 1.25:下载的密钥文件

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

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

  10. 您将被提示输入四个输入变量,依次输入您相应的信息,然后在每个输入后按Enter键:

    AWS 访问密钥 ID

    AWS 密钥访问密钥

    默认区域

    默认输出格式(json)

  11. 名称是在您的控制台中获得的(此处显示为N. Virginia,但您的名称由您的唯一位置决定):图 1.26:位置搜索

    图 1.26:位置搜索
  12. 代码是从以下可用区域列表中获得的:图 1.27:可用区域列表

    图 1.27:可用区域列表
  13. 命令提示符的最终输入变量将如下所示。然后,按Enter键:

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

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

命令行界面(CLI)使用方法

使用命令时,至少指定一个路径参数。两个路径参数是 LocalPath 和 S3Uri:

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

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

整个命令结构是aws s3 <Command> [<Arg> …]。以下表格显示了不同的命令,包括描述和示例:

图 1.29:命令列表

图 1.29:命令列表

递归和参数

逐个导入文件很耗时,尤其是如果您有一个文件夹中有很多文件需要导入。一个简单的解决方案是使用递归过程。递归过程是指能够调用自身的过程,这样您作为用户就可以避免为每个文件输入相同的导入命令。

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

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

使用命令,将相应 Bucket 中的所有 s3 对象复制到指定的目录:

图 1.30:参数列表

图 1.30:参数列表

活动 1:使用 CLI 将数据导入和导出到 S3

在这个活动中,我们将使用 CLI 在 S3 中创建一个 Bucket 并导入第二个文本文件。假设你是一位企业家,你正在创建一个聊天机器人。你已经确定了包含能够让你的聊天机器人更有效地与客户互动的内容的文本文件。在文本文件可以被解析之前,它们需要上传到 S3 Bucket。一旦它们在 S3 中,就可以进行进一步的分析。为了确保这一过程正确完成,你需要安装 Python,设置好环境,并使用 CLI 进行用户认证:

  1. 配置命令行界面并验证它是否能够成功连接到您的 AWS 环境。

  2. 创建一个新的 S3 Bucket。

  3. 将文本文件导入到 Bucket 中。

  4. 从 Bucket 中导出文件并验证导出的对象。

    注意

    要查看详细步骤,请参阅本书末尾的附录 A,第 192 页的 附录 A

使用 AWS 控制台识别机器学习服务

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

练习 4:导航 AWS 管理控制台

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

  1. 点击 https://console.aws.amazon.com/console/ 以导航到 AWS 控制台。然后,点击 服务图 1.31:AWS 控制台

    图 1.31:AWS 控制台
  2. 滚动页面以查看所有机器学习服务。然后,点击 Amazon Lex图 1.32:机器学习选项

    图 1.32:机器学习选项
  3. 您将被重定向到 Amazon Lex 主屏幕:

图 1.33:Amazon Lex 主屏幕

图 1.33:Amazon Lex 主屏幕

定位新的 AWS 服务是发现更多工具以解决您的数据项目解决方案的关键技能。现在,让我们回顾另一种通过 搜索栏 定位机器学习资源的方法。

活动二:测试 Amazon Comprehend 的 API 功能

在这个活动中,我们将通过在 API 探索器中使用部分文本文件输入来显示文本分析输出。探索 API 是一种技能,通过确保输出符合项目所需格式来节省开发时间。因此,我们将测试 Comprehend 的文本分析功能。

假设你是一位正在创建聊天机器人的企业家。你已经确定了一个商业主题和相应的文本文档,这些文档将使聊天机器人使你的业务成功。你的下一步是识别/验证一个 AWS 服务来解析文本文档以进行情感、语言、关键词和实体的分析。在投入时间编写完整的程序之前,你希望通过 AWS 管理控制台的用户界面测试 AWS 服务的功能。为了确保这一点,你需要在网上搜索一篇(用英语或西班牙语撰写)包含你感兴趣的主题(体育、电影、时事等)的文章。AWS 管理控制台也可以通过根用户账户访问。

你知道探索 API 是一种技能,可以通过确保输出符合项目所需格式来节省开发时间。以下为完成步骤:

  1. 通过 AWS 管理控制台识别一个 AWS 服务,以实现你的目标。

  2. 导航到你的网页,其中包含英语和西班牙语的文章。

  3. 复制用英语或西班牙语撰写的文章中的文本,以识别以下特征:情感、语言、关键词和实体。

  4. 获得代表文章的分数:情感、语言、关键词和实体。

    注意

    要参考详细步骤,请参阅本书末尾的附录 A,第 194 页。

摘要

在本章的开头,我们解释了什么是亚马逊网络服务(Amazon Web Services)、什么是机器学习以及什么是人工智能。随后,你学习了什么是亚马逊 S3 以及为什么使用亚马逊 S3。你还探索了使用 S3 与 AWS 一起工作的基本要求。有了这些,你使用了 IAM(身份和访问管理)。

接下来,你学习了如何将数据导入和导出到 S3。随后,你探索了 S3 的组件。同时,你了解了 REST 接口。在本章的最后部分,我们探讨了 AWS 命令行及其用法。最后,我们探讨了递归和参数的概念,以及如何使用 AWS 控制台来识别机器学习服务。

在下一章中,你将学习如何使用自然语言处理(NLP)来总结文本文档。研究新的 AWS 服务对于发现解决你正在工作的任何机器学习问题的额外解决方案至关重要。

2

第二章:摘要

使用 NLP 处理文本文档

学习目标

到本章结束时,你将能够:

  • 使用 Amazon Comprehend 检查文本,以确定其主要语言

  • 从一组文档中提取信息,如实体(人或地点)、关键词(指示内容的名词短语)、情感倾向和主题

  • 设置 Lambda 函数以使用 Comprehend 处理和分析导入的文本

本章描述了使用 Amazon Comprehend 概括文本文档以及创建 Lambda 函数来分析文本的方法。

简介

Amazon Comprehend 服务不断从 Amazon.com 的产品描述和消费者评论中学习新数据,因此,它持续提高理解各种主题(如政府、健康、媒体、教育、广告等)的能力。总体而言,Amazon Comprehend 可以分析一组文本文档,并可以根据主题组织文章,识别最常提到的特征,并根据主题对文章进行分组,以便为网站访客提供个性化推荐。

在本章的第一部分,你学习了如何使用 Amazon Comprehend 通过从文档内容中使用自然语言处理(NLP)来提取见解。现在,你将学习如何使用 Amazon Comprehend API 通过识别文档中的语言、实体、关键词、情感和主题来产生见解。这将使你能够理解基于深度学习的 NLP,以构建更复杂的应用程序,我们将在第二天进行。

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

什么是自然语言处理?

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

Amazon Comprehend 处理任何 UTF-8 格式的文本文件。它使用预训练的模型来检查文档或文档集,以便收集关于文档集的见解。Amazon 持续训练模型,因此无需提供训练数据。

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

Amazon Comprehend 用于从各种主题(健康、媒体、电信、教育、政府等)和文本数据中的语言中获取见解。因此,分析文本数据并利用更复杂的功能(如主题、实体和情感分析)的第一步是确定主导语言。确定主导语言确保了更深入分析的正确性。

为了检查文本以确定主要语言,有两种操作(DetectDominantLanguageBatchDetectDominantLanguage)。

DetectDominantLanguage 接受至少 20 个字符长度的 UTF-8 文本字符串,并且必须包含少于 5,000 个 UTF-8 编码字符。BatchDetectDominantLanguage 接受字符串数组作为列表。该列表可以包含最多 25 个文档。每个文档应至少有 20 个字符,并且必须包含少于 5,000 个 UTF-8 编码字符。

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

注意

查看 https://docs.aws.amazon.com/comprehend/latest/dg/how-languages.html 以获取支持语言的最新列表。

![图 2.1:Amazon Comprehend – 支持的语言

![img/image0011.jpg]

图 2.1:Amazon Comprehend 支持的语言

反应还包括一个分数,表示 Amazon Comprehend 对特定语言是文档中的主导语言的确定性水平(见以下截图)。语言分数与其他分数独立,因此反应不提供文档中由特定语言表示的百分比:

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

![img/image002.jpg]

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

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

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

注意

源代码可通过 GitHub 上的存储库获取:https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_a/detect_dominant_languages.py。

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

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

    import json 	
    
  3. <输入区域> 替换为您的唯一区域(例如,us-east-1)。以下实例化一个新的 Comprehend 客户端:

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

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

    print('Calling DetectDominantLanguage')
    print('english_string result:')
    
  6. 最后,使用engligh_stringspanish_string变量调用 Comprehend 的detect_dominant_language方法 https://docs.aws.amazon.com/comprehend/latest/dg/API_DetectDominantLanguage.htmljson.dumps()将 JSON 数据写入终端中的 Python 字符串:

    print(json.dumps(comprehend.detect_dominant_language(Text = english_string), sort_keys=True, indent=4))
    
  7. 将更改保存到文件中。如果尚未打开,请打开命令提示符并激活您的虚拟环境。

  8. 导航到detect_dominant_languages.py的位置。在命令提示符中输入python detect_dominant_languages.py。执行此命令将生成以下输出(见以下截图):

    如预期的那样,english_text字符串被识别为英语(使用"en"语言代码),置信度分数为 ~0.99(见以下输出)。

    如预期的那样,spanish_text 字符串被识别为西班牙语(使用 "es" 语言代码),置信度分数为 ~0.99(见以下输出):

![图 2.3:检测主导语言输出 – 英语和西班牙语图片 0031

图 2.3:检测主导语言输出 – 英语和西班牙语

练习 6:使用命令行界面(CLI)检测多份文档中的主导语言

在这个练习中,你将学习如何检测 Comprehend 的detectDominantLanguage操作对多份文档。以下步骤描述了如何检测主导语言:

注意

源代码可通过 GitHub 上的存储库获取:https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_a/batch_detect_dominant_languages.py。

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

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

    import json 	
    
  3. <输入区域> 替换为您的唯一区域(例如,us-east-1)。以下实例化了新的 Comprehend 客户端:

    comprehend = boto3.client(service_name='comprehend', region_name='<input region>')	
    
  4. 接下来,分配一个包含英语和西班牙语字符串的列表,由 Comprehend 进行分析:

    english_string_list = ['机器学习令人着迷.', '学习人工智能是我的热情。']

    spanish_string_list = ['自动学习令人着迷.', '学习人工智能是我的热情。']

  5. 最后,我们使用engligh_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(json.dumps(comprehend.batch_detect_dominant_language(Text = english_string_list), sort_keys=True, indent=4))
    

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

一系列字符串。

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

从一系列文档中提取信息

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

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

实体是对现实世界中对象唯一名称的文本引用,例如人、地点、商业物品以及对日期和数量等测量的精确引用。例如,在文本 "Martin lives at 27 Broadway St." 中,Martin 可能被检测为 PERSON,而 27 Broadway St 可能被检测为 LOCATION

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

![图 2.4:AWS Comprehend - 实体类型和描述图片 004

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

DetectEntites – 输入和输出

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

![图 2.5:AWS Comprehend - 实体类型和描述图片 0051

![图 2.5:AWS Comprehend 实体类型和描述### 练习 7:确定文档中的命名实体在这个练习中,我们将确定文档中的命名实体。为此,我们将使用 Amazon Comprehend 的 DetectEntities 操作。以下是为检测命名实体所采取的步骤:#### 注意源代码可通过 GitHub 在以下仓库中获取:https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_b/detect_entities.py.1. 导航到 detect_entities.py 位置,将 <input region> 替换为您的特定区域,并保存文件。 现在,通过以下命令导入 AWS SDK for python (boto3) https://boto3.amazonaws.com/v1/documentation/api/latest/index.html: py import boto3 1. 现在,通过以下命令导入 JSON 模块以序列化 JSON https://docs.python.org/3.6/library/json.html: py import json 1. 现在,实例化一个新的 Comprehend 客户端: py comprehend = boto3.client(service_name='comprehend', region_name='<input region>') 1. 现在,在实例化一个新的 Comprehend 之后,提供 english_string = "I study Machine Learning in Seattle on Thursday.": py print('Calling DetectEntities') 1. 现在,json.dumps() 将 JSON 数据写入 Python 字符串: py print(json.dumps(comprehend.detect_entities(Text = english_string, LanguageCode='en'), sort_keys=True, indent=4)) print('End of DetectEntities\n') 1. 通过执行 detect_entities.py 命令并使用 python 运行代码。前面代码的输出如下截图所示:![图 2.6:AWS Comprehend – DetectEntities 输出图片 006
图 2.6:AWS Comprehend DetectEntities 输出

由于输入是简单的示例,置信度分数都是 ~0.99。正如预期的那样,西雅图被检测为地点,而星期四被检测为日期

图 2.7:AWS Comprehend - BeginOffset 和 EndOffset 检查

图 2.7:AWS Comprehend BeginOffset 和 EndOffset 检查

在一组文档(文本文件)中检测实体

我们现在将从一个文档集(文本文件)中提取实体。导航到 https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_b/detect_entities_from_documents.py 位置,将 <input region> 替换为您的特定区域,并保存文件。通过执行以下命令运行代码:python detect_key_phrases.py

图 2.8:detectKeyPhrases 输出

图 2.8:DetectKeyPhrases 输出

检测关键短语

对于 AWS 来说,一个关键短语相当于一个名词短语,它代表一个实际事物。在英语中,当我们把代表一个具体想法的不同单词组合在一起时,我们称之为名词短语。例如,"一台快速的机器" 是一个名词短语,因为它由 "一台",冠词,"快速",形容词,和 "机器",一个名词组成。AWS 寻找合适的词组组合,并给出分数,表示字符串实际上是一个名词短语的置信度。

练习 8:确定关键短语检测。

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

注意

源代码可通过 GitHub 在以下存储库中获取:https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_b/detect_key_phrases.py。

  1. 导航到 detect_key_phrases.py 位置,将 <input region> 替换为您的特定区域,并保存文件。通过以下命令导入 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', region_name='<input region>')
    
  4. 现在,提供要分析的 英文 文本,使用以下代码:

    english_string = 'I study Machine Learning in Seattle on Thursday.'
    print('Calling DetectKeyPhrases')
    # json.dumps() writes JSON data to a Python string
    print(json.dumps(comprehend.detect_entities(Text = english_string, LanguageCode='en'), sort_keys=True, indent=4))
    print('End of DetectKeyPhrases\n')
    
  5. 通过执行以下命令运行代码:python detect_key_phrases.py。您将看到以下输出:

图 2.9:AWS Comprehend – DetectKeyPhrases 输出

图 2.9:AWS Comprehend DetectKeyPhrases 输出

检测情感

Amazon Comprehend 可以用来确定文档的情感。您可以确定情感是积极的、消极的、中性的还是混合的。例如,您可以使用情感分析来确定博客文章的评论情感,以确定您的读者是否喜欢该文章。

练习 9:检测情感分析

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

注意

源代码可通过以下 GitHub 仓库中的链接获取:https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_b/detect_sentiment.py。

  1. 导航到detect_sentiment.py位置,将<input region>替换为您的特定区域,并保存文件。通过以下命令从 http://boto3.readthedocs.io/en/latest/导入 Python 的AWS SDK(boto3):

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

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

    comprehend = boto3.client(service_name='comprehend', region_name='<input region>')
    
  4. 然后,提供要分析的文本字符串,使用以下代码:

    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')
    

    通过执行以下命令运行代码:python detect_seniment.py。输出如下所示:

![图 2.10:AWS Comprehend – DetectSentiment 输出

![img/image0091.jpg]

图 2.10:AWS Comprehend – DetectSentiment 输出

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

在这个主题中,我们将集成 AWS Lambda 函数到 Comprehend,这提供了一个更强大、可扩展的基础设施。您可以使用 AWS Lambda 在事件(如 Amazon S3 桶中的数据更改)发生时运行您的代码。

通过对事件执行代码提供了一种开发可扩展软件架构的实用解决方案。总体而言,这增加了我们的数据管道,并提供了处理更复杂的 Big Data 体积和 NLP 操作的能力。

什么是 AWS Lambda?

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

总体而言,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_handler 函数中包含一个名为 Lambda_function.py 的 Python 文件,这是我们的 Lambda 函数的入口点。入口点接受两个参数作为参数:

  • 事件参数提供了有效负载的值,该有效负载是从 调用 进程发送到函数的。它通常采用 Python dict 类型的形式,尽管它也可能是列表、strintfloatNoneType 之一。

  • 上下文参数是 LambdaContext 类型,包含运行时信息。您将在稍后的练习中使用此参数。函数的返回值可以是任何可 JSON 序列化的类型。此值在序列化后返回给调用应用程序。

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

![图 2.11: 架构图]

![img/image010.jpg]

![图 2.11: 架构图]

练习 10:为 S3 设置 Lambda 函数

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

创建 S3 存储桶

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

    ![img/image0111.jpg]

    ![图 2.12: 为 Lambda 触发器创建 S3 存储桶]
  2. 对于存储桶名称,键入 aws-ml-s3-trigger,然后点击 创建:![图 2.13: 创建 S3 存储桶

    ![img/image012.jpg]

    ![图 2.13: 创建 S3 存储桶]
  3. 您的 Bucket 将被创建,您将被重定向到 存储桶列表:![图 2.14: S3 存储桶列表屏幕

    ![img/image0131.jpg]

    ![图 2.14: S3 存储桶列表屏幕]
  4. 接下来,导航到 https://console.aws.amazon.com/Lambda/ 并点击 创建函数:![图 2.15: AWS Lambda 主屏幕。

    ![img/image014.jpg]

    ![图 2.15: AWS Lambda 主屏幕。
  5. 从选项中选择从头开始创建作者。对于名称,type s3_trigger:![图 2.16: AWS Lambda – 使用“从头开始创建作者”选择创建函数

    ![img/image0151.jpg]

    图 2.16:AWS Lambda – 使用“从头开始创建”选项创建函数
  6. 对于运行时选项,从列表中选择Python 3.6:![图 2.17:AWS Lambda – Python 3.6 选择 img/image016.jpg

    图 2.17:AWS Lambda – Python 3.6 选择
  7. 对于角色字段,在角色名称字段中选择s3TriggerRole。然后,点击 AWS 中的Lambda 函数:![图 2.18:AWS Lambda – 创建函数屏幕 img/image0171.jpg

    图 2.18:AWS Lambda – 创建函数屏幕
  8. 然后,点击策略模板下的下拉菜单:![图 2.19:策略模板选择下拉 img/image018.jpg

    图 2.19:策略模板选择下拉菜单
  9. 选择Amazon S3对象的只读权限:![图 2.20:Amazon S3 对象只读权限选择 img/image0191.jpg

    图 2.20:Amazon S3 对象只读权限选择
  10. 然后,点击Lambda 函数:![图 2.21:点击创建函数 img/image020.jpg

    图 2.21:点击创建函数

    注意

    如果你收到NoSuchEntity错误,这是当 Amazon 为s3_trigger创建服务角色时出现的临时警告。AWS 在“角色”标题下有关于可能临时问题的参考。这不会影响你继续本章的能力。刷新你的屏幕,几分钟后警告信息应该会消失。

  11. Logs服务作为函数角色的资源可用时,你会知道问题已经解决:![图 2.22:Amazon CloudWatch 日志 img/image0211.jpg

    图 2.22:Amazon CloudWatch 日志
  12. 你应该看到一个配置屏幕,如下所示:![图 2.23:AWS Lambda - 成功创建 s3_trigger 的验证屏幕 img/image022.jpg

    图 2.23:AWS Lambda 成功 s3_trigger 验证屏幕
  13. 现在,让我们添加 S3 作为触发器。在添加触发器下,滚动到 S3:![图 2.24:AWS Lambda – 添加 S3 作为触发器选择屏幕 img/image0231.jpg

    图 2.24:AWS Lambda – 添加 S3 作为触发器选择屏幕
  14. 点击S3,它将自动填充在s3_trigger下。点击S3后,你的屏幕将如下所示:

![图 2.25:Aws Lambda – S3 触发器选择,需要配置img/image024.jpg

图 2.25:AWS Lambda – S3 触发器选择,需要配置

练习 11:配置 S3 存储桶的触发器

在这个练习中,我们将配置前面练习中创建的Bucket的触发器。要配置触发器,请按照以下步骤操作:

  1. 将屏幕向下滚动到aws-ml-s3-trigger的配置触发器部分:![图 2.26:AWS Lambda – 配置 S3 触发器,S3 存储桶选择 img/image0251.jpg

    图 2.26:AWS Lambda – 配置 S3 触发器,S3 存储桶选择
  2. 保持其余默认设置。接下来,将屏幕向下滚动并点击添加:![图 2.27:AWS Lambda – 添加 S3 存储桶作为触发器 img/image0271.jpg

    图 2.27:AWS Lambda – 将 S3 存储桶添加为触发器
  3. 下一步是点击保存按钮:AWS Lambda – 保存 S3 触发器

    AWS Lambda – 保存 S3 触发器
  4. 接下来,将屏幕向下滚动到函数代码部分。默认代码将与以下代码相同或类似:图 2.28:AWS Lambda – 默认 Lambda_function 屏幕

    图 2.28:AWS Lambda 默认 Lambda_function 屏幕

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

    注意

    对于这一步,你可以跟随操作并输入代码,或者从 https://github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_c/s3_trigger.py 文件中的源代码文件夹获取代码。

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

    import boto3
    
  6. 接下来,创建一个接受两个参数-事件和上下文的函数:

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

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

  9. 接下来,将<input Bucket name>替换为你创建的 Bucket(在我的例子中是aws-ml-s3-trigger):

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

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

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

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

    body_str_obj = str(file_obj['Body'].read())
    
  14. 将<input region name>替换为你的特定区域。此外,创建 comprehend 变量(在我的例子中是 us-east-1):

    comprehend = boto3.client(service_name="comprehend", region_name='<input region_name>') 
    
  15. 接下来的三行代码调用相应的 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)
    
  16. 最后一条语句返回字符串'Hello from Lambda',如下所示:

    return 'Hello from Lambda'
    
  17. 现在,点击保存按钮:

  18. 图 2.29:AWS Lambda – 保存屏幕

图 2.29:AWS Lambda – 保存屏幕

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

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

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

  1. 导航到 https://console.aws.amazon.com/iam 的“身份和访问管理”仪表板:图 2.30:IAM 仪表板

    图 2.30:IAM 仪表板
  2. 现在,一旦你到达 IAM 仪表板,点击角色图 2.31:IAM 仪表板的左侧

    图 2.31:IAM 仪表板的左侧
  3. 现在,屏幕将填充角色列表。在角色列表中点击s3TriggerRole:![图 2.32:角色列表 – 选择 s3TriggerRole 图片

    图 2.32:角色列表选择 s3TriggerRole
  4. s3TriggerRole的选项将被启用。然后,单击附加策略:![图 2.33:s3TriggerRole 的权限选项卡 图片

    图 2.33:s3TriggerRole 的权限选项卡
  5. 输入Comprehend以过滤策略。然后,点击ComprehendFullAccess旁边的复选框:![图 2.34:ComprehendFullAccess 策略选择 图片

    图 2.34:ComprehendFullAccess 策略选择
  6. 一旦选中复选框,请单击屏幕右下角的附加策略:![图 2.35:附加所选策略 图片

    图 2.35:附加所选策略
  7. 您将被重定向到s3TriggerRole屏幕,并且您将收到以下消息:

![图 2.36:成功附加策略消息图片

图 2.36:成功附加策略消息

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

在此活动中,我们将 Lambda 函数与 Comprehend 集成,以便在文档上传到 S3 时执行文本分析(检测情感、检测实体和检测关键短语)。

假设你是一位正在创建聊天机器人的企业家。你已经确定了一个商业主题和相应的文本文档,其中包含的内容可以使你的业务成功。你的下一步是将 Lambda 函数与 Comprehend 集成,以进行情感、关键短语和实体的分析。为了确保正确执行,你需要有test_s3trigger_configured.txt。在执行s3_trigger之前,请考虑以下文本的以下方面的输出:情感(正面、负面或中性)、实体(数量、人物、地点等)和关键短语:

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

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

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

  4. 接下来,使用日志流在CloudWatch中单击“查看日志”。

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

  6. 以下将是输出结果:

    情感响应 -> 被分类为有 60.0%的可能性是正面

    情感响应:

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

实体响应 --> 被分类为有 70.5%的可能性是数量

实体响应:

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

关键短语响应 -> 被分类为有 89.9%的可能性是“测试文件”和 98.5%的可能性是“s3 触发器”是关键短语:

关键短语响应:

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

注意

要了解详细步骤,请参阅本书末尾的附录 A 第 198 页。

摘要

在本章中,你学习了如何构建 Comprehend 的DetectDominantLanguage方法的结构,以及如何传入字符串和字符串列表。你学习了如何提取实体、情感、关键短语和主题,这些为复杂 NLP 处理提供了数据。这允许 Amazon Comprehend 通过在已上传到 S3 的文本文档上自动进行文本分析,从而变得更加高效。

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

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

3

第三章:执行主题建模和主题提取

学习目标

到本章结束时,您将能够:

  • 通过 Amazon Comprehend 的主题建模提取和分析常见主题

  • 描述主题建模分析的基本原理

  • 在一组文档上执行主题建模并分析结果

本章描述了使用 Amazon Comprehend 分析文档集结果的主题建模在常见主题上的应用。

简介

在本章的第一部分,您将学习如何分析 Amazon Comprehend 的主题建模输出。具体来说,您将学习用于主题建模的算法的基本原理,即潜在狄利克雷分配(LDA)。学习 LDA 将使您能够将主题建模应用于多种独特的商业用例。

您将接着对两个具有已知主题结构的文档执行主题建模。第一个是故事 Romeo and Juliet,第二个是 War of the Worlds。最后,您将使用 Amazon Comprehend 分析包含 1,000 篇负面电影评论的文本文档中的主题。

提取和分析常见主题

您还可以使用 Amazon Comprehend 分析档案库以定位库中包含的正常主题。Amazon Comprehend 会检查库中的报告,并在之后恢复与每个主题相关的最显著主题和报告。主题显示是一个非传统的过程:您提供一组文件用于训练,然后在处理完成后获取结果。Amazon Comprehend 在大型文件集上执行主题显示。为了获得最佳结果,您在提交主题显示工作时应包含大约 1,000 个文件。

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

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

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

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

例如,如果文档的第一段包含像 eatchickenrestaurantcook 这样的单词,那么您可以得出结论,主题可以概括为 Food。如果文档的第二段包含像 tickettrainkilometervacation 这样的单词,那么您可以得出结论,主题是 Travel

基本 LDA 示例

主题建模可能看起来很复杂,理解 LDA 如何确定主题的基本步骤对于在更复杂的企业用例中进行主题建模至关重要。因此,让我们通过以下简单的例子来分解 LDA。

你有一篇包含五句话的文档。你的目标是确定文档中出现的两个最常见主题:

  • 我喜欢吃面包和香蕉。

  • 我早餐吃了一杯面包和香蕉的冰沙。

  • 小狗和小猫很可爱。

  • 昨天我哥哥收养了一只小狗。

  • 看看这只可爱的小负鼠正在吃一块西兰花。

LDA 发现这些句子包含的主题。例如,给定上述句子并要求两个主题,LDA 可能会产生以下结果:

第 1 和第 2 句:100% 主题 A

第 3 和第 4 句:100% 主题 B

第 5 句:60% 主题 A,40% 主题 B

主题 A:30% 面包,15% 香蕉,10% 早餐,10% 咀嚼(因此,你可以假设主题 A 是关于食物的)

主题 B:20% 小狗,20% 小猫,20% 可爱,15% 小负鼠(你可以假设主题 B 是关于可爱动物的)

为什么使用 LDA?

当你需要找到记录中的设计,而不考虑报告本身时,LDA 很有用。LDA 可以用来创建主题,以理解档案,一般主题。这通常用于推荐系统、报告排序和文件摘要。总之,LDA 在准备带有主题和事件预测模型时很有帮助。

LDA 有许多用例。例如,你有 30,000 封用户电子邮件,并希望确定最常见的主题,以便根据最普遍的主题提供针对特定群体的推荐内容。手动阅读,甚至外包 30,000 封电子邮件的阅读,将需要大量的时间和金钱投入,而且准确性难以确认。然而,Amazon Comprehend 可以在几个步骤内无缝提供 30,000 封电子邮件中最常见的主题,并且准确性令人难以置信。首先,将电子邮件转换为文本文件,上传到 S3 存储桶,然后使用 Amazon Comprehend 进行主题建模作业。输出是两个包含相应主题和术语的CSV文件。

Amazon Comprehend–主题建模指南

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

  • 你应该在每个主题中至少使用 1,000 条记录来展示工作

  • 每篇报告的长度应大约为三句话

  • 如果一条记录主要由数字信息组成,你应该将其从语料库中排除

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

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

输入格式选项

![Figure3.1: AWS Comprehend - 主题建模输入格式选项。Image_Lesson3_001.jpg

Figure3.1:AWS Comprehend– 主题建模输入格式选项

输出格式选项:

![Figure 3.2:AWS Comprehend - 主题建模输出文件描述。Image_Lesson3_002.jpg

Figure 3.2:AWS Comprehend – 主题建模输出文件描述

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

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

![Figure 3.3:两个文档输入的样本主题建模输出 (topic-terms.csv)。Image_Lesson3_003.jpg

Figure 3.3:两个文档输入的样本主题建模输出 (topic-terms.csv)

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

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

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

练习 13:已知主题结构的主题建模

在这个练习中,我们将使用 Amazon Comprehend 对两个已知主题的文档(罗密欧与朱丽叶世界大战)进行主题建模。我们使用两个已知主题来更好地理解 LDA。在进行练习之前,先看看数据管道架构的概述:

![Figure 3.5:数据管道架构概述Image_Lesson3_005.jpg

Figure 3.5:数据管道架构概述

以下是为完成已知主题结构的主题建模的步骤:

  1. 我们需要一个输入和输出 S3 存储桶。让我们创建两个。导航到 s3.console.aws.amazon.com/s3/

  2. 现在,点击创建存储桶按钮创建一个存储桶:![Figure 3.6: 创建存储桶 Image_Lesson3_006.jpg

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

    注意

    点击创建与点击下一步使用所有默认设置:属性和权限。

    ![Figure 3.7:创建存储桶名称输入 Image_Lesson3_007.jpg

    Figure 3.7:创建存储桶名称输入
  4. 现在,点击创建按钮创建一个文件夹:![Figure 3.8: 在 S3 中为主题建模输入创建文件夹 Image_Lesson3_008.jpg

    Figure 3.8:在 S3 中为主题建模输入创建文件夹
  5. 现在,输入known_structure作为文件夹名称,然后点击'known_structure'文件夹名称

  6. 在点击known_structure文件夹后:图 3.9:输入桶界面

    图 3.9:输入桶界面
  7. 现在,点击上传按钮:图 3.10:上传界面

    图 3.10:上传界面
  8. 现在,系统将提示您添加文件。点击添加文件或将文件拖放到屏幕上:图 3.11 添加文件界面

    图 3.11 添加文件界面
  9. 导航到下载并上传以下两个文本文件到机器上:

    注意

    您可以从/lesson3/topic_a/romeo_and_juliet.txt github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/topic_a/romeo_and_juliet.txt /lesson3/topic_a/the_war_of_the_worlds.txt github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/topic_a/the_war_of_the_worlds.txt下载 Romeo and Juliet 文本文件。

  10. 文件上传完成后,点击known_structure文本文件

  11. 导航到 Amazon S3 主界面:图 3.13:点击 Amazon S3。

    图 3.13:Amazon S3
  12. 接下来,创建一个输出 S3 桶。使用相同的 S3 桶创建过程。点击创建****桶按钮:图 3.14:点击创建桶。

    图 3.14:创建一个桶
  13. 现在,命名桶,然后点击创建按钮:图 3.15:主题建模的创建桶输出

    图 3.15:主题建模的创建桶输出
  14. 导航到 Amazon Comprehend:console.aws.amazon.com/comprehend/. 如果出现以下屏幕,请点击尝试 Amazon Comprehend图 3.16:Amazon Comprehend 主界面。

    图 3.16:Amazon Comprehend 主界面
  15. 现在,点击左侧工具栏中的组织图 3.17:Amazon Comprehend 组织界面

    图 3.17:Amazon Comprehend 组织界面
  16. 现在,在名称字段中点击known_structure_topic_modeling_job图 3.18:主题建模作业输入名称

    图 3.18:主题建模作业名称
  17. 现在,向下滚动到选择输入数据,然后点击搜索图 3.19:点击搜索以定位主题建模输入数据源

    图 3.19:点击搜索以定位主题建模输入数据源
  18. 导航到known_structure文件夹,然后点击选择图 3.20:为 S3 文件夹选择“选择”。

    图 3.20:点击选择 S3 文件夹
  19. 现在,从下拉菜单中选择每个文件一个文档图 3.21:选择每个文件一个文档

    图 3.21:选择每个文件一个文档
  20. 现在,输入两个作为您需要的主题数量图 3.22:输入 2 以执行主题建模的主题数量

    图 3.22:输入 2 以执行主题建模的主题数量
  21. 接下来,点击搜索以搜索之前创建的存储桶:图 3.23:点击搜索主题建模 S3 输出位置

    图 3.23:点击搜索主题建模 S3 输出位置
  22. 一旦找到您创建的存储桶,点击您创建的存储桶以输出主题建模:图 3.24:选择输出 S3 存储桶

    图 3.24:选择输出 S3 存储桶
  23. 现在,选择适当的存储桶,然后点击选择图 3.25:通过点击选择进行确认

    图 3.25:通过点击选择进行确认
  24. 向下滚动以选择一个IAM角色,然后点击创建IAM角色的圆圈:图 3.26:选择‘创建 IAM 角色’

    图 3.26:选择创建 IAM 角色
  25. 现在,从访问权限中选择输入输出 S3 存储桶图 3.27:提供输入和输出 S3 存储桶的权限

    图 3.27:提供输入和输出 S3 存储桶的权限
  26. 在名称后缀字段中输入myTopicModelingRole,然后点击创建作业按钮:图 3.28:点击创建作业按钮

    图 3.28:点击创建作业按钮
  27. 创建作业可能需要几分钟,但完成后,您将被重定向到 Comprehend 主屏幕:图 3.29:Comprehend 主屏幕

    图 3.29:Comprehend 主屏幕
  28. 在作业处理过程中,显示的状态将是进行中图 3.30:显示‘进行中’状态

    图 3.30:显示进行中状态
  29. 当状态更新为完成时,点击主题建模作业名称:图 3.31:显示完成状态。

    图 3.31:显示完成状态
  30. 现在,向下滚动到输出部分:图 3.32:主题建模输出显示主屏幕

    图 3.32:主题建模输出显示主屏幕
  31. 点击数据位置下的超链接:图 3.33:主题建模数据输出超链接位置

    图 3.33:主题建模数据输出超链接位置
  32. 点击输出文件夹的链接:图 34:主题建模输出文件夹

    图 34:主题建模输出文件夹
  33. 点击输出文件夹。然后,点击output.tar.gz并下载文件:图 3.35:点击下载

    图 3.35:点击下载
  34. 点击output.tar.gz并选择在文件夹中显示。点击确定以在桌面提取文件:图 3.36:点击确定

    图 3.36:点击确定
  35. 导航到你的桌面。将提取两个文件:doc-topics.csvtopics-terms.csv。将有两个文件要检查:topic-terms.xlsxdoc-topics.xlsx

图 3.37:主题建模输出 CSV 文件

图 3.37:主题建模输出 CSV 文件

注意

你的 Topic-terms.csv 和 doc-topics.csv 结果应与以下结果相同。如果你的结果不相同,请使用本章剩余部分提供的输出文件,这些文件位于 Lesson3\topic_a\doc-topics.csv github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/topic_a/doc-topics.csv和 lesson3\topic_a\topic-terms.csv github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/topic_a/topic-terms.csv.

以下为生成的输出:

图 3.38:topic-terms.csv 结果

图 3.38:topic-terms.csv结果

图 3.39:doc-topics.csv 结果

图 3.39:doc-topics.csv 结果

练习 14:执行已知结构分析

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

注意

对于这个步骤,你可以跟随练习并输入代码,或者从源代码文件夹local_csv_to_s3_for_analysis.py中获取它,并将其粘贴到编辑器中。源代码可在以下 GitHub 仓库中找到:github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/topic_a/local_csv_to_s3_for_analysis.py.

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

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

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

    s3 = boto3.client('s3')
    
  4. 接下来,我们将创建一个具有唯一桶名的变量。在这里,选定的桶名是known-tm-analysis,但你需要创建一个唯一的名称:

    bucket_name = '<insert a unique bucket name>' #  
    
  5. 接下来,创建一个新的桶:

    s3.create_bucket(Bucket=bucket_name)
    
  6. 创建要导入的 CSV 文件名列表:

    filenames_list = ['doc-topics.csv', 'topic-terms.csv']
    
  7. 现在,使用以下代码行迭代每个文件以上传到 S3:

    for filename in filenames_list:
        s3.upload_file(filename, bucket_name, filename)
    
  8. 接下来,检查文件名是否为doc-topics.csv

        if filename == 'doc-topics.csv':
    
  9. 现在,使用以下命令获取doc-topics.csv文件对象并将其分配给obj变量:

     obj = s3.get_object(Bucket=bucket_name, Key=filename)
    
  10. 接下来,读取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'])
    
  11. 现在,使用以下命令合并主题列上的文件,以获取每个文档中最常见的术语:

    merged_df = pd.merge(doc_topics, topic_terms, on='topic')
    Print the merged_df to the console
    print(merged_df)
    
  12. 接下来,导航到命令提示符中CSV文件的位置,并使用以下命令执行代码:

    python local_csv_to_s3.py
    
  13. 控制台输出是一个合并的dataframe,它提供了具有相应术语及其权重的docnames(见以下内容):![图 3.40:已知结构主题建模合并结果 img/Image_Lesson3_041.jpg

    图 3.40:已知结构主题建模合并结果
  14. 要验证 CSV 文件,导航到 S3(如果新存储桶没有出现,请重新加载页面),并在 S3 中创建了新的存储桶。单击存储桶以验证成功导入:![图 3.41:已知-tm-analysis S3 存储桶 img/Image_Lesson3_042.jpg

    图 3.41:已知-tm-analysis S3 存储桶
  15. 存储桶中将有两个 CSV 文件:doc-topics.csvtopic-terms.csv

![图 3.42:主题建模结果上传到 S3img/Image_Lesson3_043.jpg

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

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

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

执行主题建模

  1. 导航到以下链接以获取包含负面评论的文本数据文件:github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/activity/localfoldernegative_movie_review_files/cv000_29416.txt

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

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

  4. 导入操作系统和 Boto3。提及您的唯一存储桶名称。

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

  6. 创建一个包含所有文本文件的列表。

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

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

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

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

  11. 应用输入格式。

  12. 提供要建模的主题数量。

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

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

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

未知主题分析

  1. 导入 Boto3pandas

  2. 创建 S3 客户端。

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

  4. 创建要导入的 CSV 文件名列表。

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

  6. 读取 obj 变量。

  7. 在主题列上合并文件。

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

    注意

    要了解详细步骤,请参阅本书末尾的附录 A,第 203 页的 附录 A

摘要

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

在下一章中,我们将深入探讨聊天机器人的概念以及它们通过自然语言处理的理解。

4

第四章:使用自然语言创建聊天机器人

学习目标

到本章结束时,您将能够:

  • 定义聊天机器人和聊天机器人设计的基本概念

  • 设置 Amazon Lex 服务

  • 创建一个自定义聊天机器人来查询不同的股价

本章描述了使用 Amazon Lex 设计聊天机器人的过程。

引言

在上一章中,您学习了如何通过Amazon Comprehend的主题建模提取和分析常见主题。

在本章中,您将学习如何使用Amazon Lex构建聊天机器人。首先,我们将讨论如何设计聊天机器人。然后,我们将通过创建一个示例聊天机器人来深入了解 Amazon Lex 服务。

接下来,我们将创建自己的定制聊天机器人,用于查询披萨订购。最后,您将集成您的聊天机器人,以便通过文本界面与之交互。

什么是聊天机器人?

聊天机器人是一个使用规则和人工智能推理模拟智能对话的应用程序。与聊天机器人互动时,目标是能够与用户进行对话,以达到解决客户查询或从他们那里提出前进方式的程度。

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

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

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

聊天机器人的商业案例

传统上,我们通过输入设备,如键盘和鼠标与计算机互动。今天,计算能力和效率已经发展到我们可以几乎像与其他人互动一样自然地与计算机进行对话。这些对话由于计算机能够添加上下文信息,并跟踪和记住几次单独交互的上下文而显得更加人性化。

因此,对话界面真正流行开来并不令人惊讶。Gartner 的一项研究估计,到 2020 年,用户进行的 30%的浏览将是不带屏幕的。考虑到人类与计算机之间的所有互动,这是一个巨大的数字。

BI Intelligence 进行的一项研究发现,截至 2015 年第一季度,全球顶级四款消息应用每月活跃用户数量超过了顶级四款社交网络的用户数量,并且没有放缓的迹象。

企业无法忽视这一趋势,他们正在寻找在用户互动(通过文本)最频繁的地方接触用户:如 Facebook、Skype、Slack、WhatsApp 和微信等即时通讯平台,名单还在不断延长。即时通讯平台使用户之间的沟通更加便捷,聊天机器人使用户能够更快地传达他们想要的信息,比与其他人互动更加高效。

在这个主题中,你将了解自然语言理解(NLU)。使用这些知识,你将首先探索 AWS Lex 服务并构建你的第一个示例聊天机器人。作为下一步,你将构建一个自定义聊天机器人。

什么是自然语言理解?

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

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

核心概念概述

在我们开始构建聊天机器人之前,你需要先了解一些概念。现在,我们将探讨“聊天机器人”这一术语的技术含义以及构成聊天机器人并共同为用户提供对话体验的各个组件的名称。

聊天机器人

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

话语

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

  • 我想去看牙医。

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

意图

意图代表用户根据其话语内容想要执行的动作。聊天机器人根据其内部业务规则或应用程序流程推断意图并支持它,结果可能是其内部状态的变化或执行一个动作。这些通常也会导致向用户提供反馈或信息的响应。

因此,从先前的对话示例中,一个聊天机器人可能会推断出以下意图:

  • 我想去看牙医 => SeeDentist

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

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

提示

当机器人需要从用户那里获取更多信息或对意图不清楚时,它可以提出后续问题,以收集更多信息。这些被称为提示。提示通常用于填写必需的槽位值,尽管您的应用程序逻辑可能尝试填写可选的值,如果您希望的话。

槽位

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

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

图 4.1:Lex 内置的槽类型表

槽位

图 4.1:Lex 内置的槽类型表

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

备注

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

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

如果您希望您的机器人处理的信息类型不是这些内置类型之一,您可以定义自己的类型,以及槽位允许的实际值。您将在我们接下来的练习中看到这是如何工作的。

履行

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

当一个意图的所有必需槽位都已填写时,槽位就准备好履行了。在这个阶段,机器人准备好执行履行意图所需的企业逻辑。企业逻辑可以是以下任何一种操作:

  • 内部状态的变化

  • 在内部运行代码

  • 调用一个内部或外部服务,从中获取信息

  • 调用一个内部或外部服务以将其信息发布到其中

完成操作可以带或不带一些用户反馈,但作为最佳实践,总是更好地偏向于提供更多反馈给用户,而不是更少。

使用 Amazon Lex 设置

简介

在这个练习中,我们将创建一个示例聊天机器人,这是Amazon Lex提供的一个选项。这里的目的是了解示例聊天机器人的各个组件,并将它们与之前学习到的自然语言理解组件相关联。完成这个练习后,您应该能够轻松地导航 Lex 用户界面,并为您的下一个练习轻松创建意图、槽位和槽位类型,在下一个练习中,您将根据自己的业务逻辑构建自定义聊天机器人。

练习 15:创建一个示例聊天机器人来订购鲜花

在这个练习中,我们将创建并测试示例聊天机器人,以此作为熟悉Amazon Lex控制台界面的手段。以下是为创建示例聊天机器人完成所需的步骤:

![图 4.2:示例聊天机器人界面]

![img/image0021.jpg]

图 4.2:示例聊天机器人界面
  1. 让我们先导航到Amazon Lex主屏幕。您可以从主 AWS 控制台屏幕点击 Lex 服务链接或直接导航到 https://console.aws.amazon.com/lex。

  2. 如果这是您第一次使用 Amazon Lex,您应该看到以下屏幕:![图 4.3:Amazon Lex 入门屏幕]

    ![img/image0032.jpg]

    图 4.3:Amazon Lex 入门屏幕
  3. 您可以点击开始按钮以继续。

    注意

    如果您之前已经创建了一个机器人,您将看到一个不同的屏幕,您可以在其中点击创建按钮,而不是:

    ![图 4.4:创建屏幕]

    ![img/image0041.jpg]

    图 4.4:创建屏幕
  4. 然后,您将看到一个用于创建机器人的选项列表。这显示了两个选项:创建自己的尝试一个示例

  5. 现在,在尝试一个示例部分下选择OrderFlowers选项:![图 4.5:选择机器人]

    ![img/image0052.jpg]

    图 4.5:选择机器人
  6. 这将为您提供进一步填写选项。您可以保留机器人名称为默认值,OrderFlowers,并选择COPPA选项。您可以将IAM角色选项保留原样。它将自动为示例机器人创建一个角色:![图 4.6:IAM 角色和 COPPA 选择]

    ![img/image0061.jpg]

    图 4.6:IAM 角色和 COPPA 选择
  7. 点击创建按钮,进入下一个屏幕并继续下一步。

使用聊天机器人编辑器

  1. 意图槽位槽位类型样本话语上。您将看到只有一个OrderFlowers:![图 4.7:聊天机器人编辑器屏幕]

    ![img/Image_Lesson4_007.jpg]

    图 4.7:聊天机器人编辑器屏幕
  2. 输入的示例语句对应于以下意图:图 4.8:槽类型屏幕

    图 4.8:槽类型屏幕
  3. 同样有三个槽。其中两个槽(PickupDatePickupTime)使用内置类型。第三个槽是一个自定义定义的槽,名为 FlowerType。每个槽都有一个与之关联的提示,这是由机器人生成的,以便获取槽的信息。

  4. 同样还有一个名为 FlowerTypes槽类型。当用户被提示输入要订购的花卉类型时,这些值会被识别为 FlowerType 槽的值:图 4.9:槽类型屏幕

    图 4.9:槽类型屏幕
  5. 点击 FlowerTypes 链接以打开一个包含槽类型定义和示例值的对话框。以下为选择和编辑槽类型的步骤。图 4.10:选择花卉类型

    图 4.10:选择 FlowerTypes

    图 4.11:编辑槽类型

    图 4.11:编辑槽类型
  6. 您还可以点击左侧区域的 错误处理 链接以显示机器人将向用户显示的用于澄清的提示(澄清提示)以及用于终止交互的短语(挂起短语),在用户尝试最大次数后:

图 4.12:错误处理

图 4.12:错误处理

测试聊天机器人

  1. 您可以在屏幕右侧的测试聊天机器人区域测试聊天机器人。如果它尚未打开,您可能需要点击一个箭头图标来展开它:图 4.13:测试机器人屏幕

    图 4.13:测试机器人屏幕
  2. 您可以进行完整的交互,如下面的截图所示:图 4.14:聊天机器人交互界面

    图 4.14:聊天机器人交互界面
  3. 以下截图显示了与机器人的对话:图 4.15:聊天机器人交互界面

    图 4.15:聊天机器人交互界面

    当所有必需的 都填写完毕时,意图 就被认为是准备就绪的。这意味着所有意图所需的信息都已提供,聊天机器人背后的应用程序逻辑现在可以适当地处理该意图。

  4. 意图可以以 JSON 对象或已实现于 AWS Lambda 服务Lambda 函数 的形式返回给调用应用程序。此时可以调用它,将 JSON 信息作为参数传递给它。您将在稍后看到它是如何工作的:图 4.16:摘要视图屏幕

    图 4.16:摘要视图屏幕
  5. 关于对话框状态面板中显示的结果,第一个显示的是聊天机器人的状态文本表示。这是摘要视图,显示诸如识别到的意图、槽类型以及现在从 Lex NLU 系统可用的值等信息。

  6. 对话状态是 ReadyForFulfillment,这表示意图已准备好实现,如前一个屏幕截图所示:

![图 4.17: dialogState]

](https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-aws/img/image0152.jpg)

图 4.17: DialogState

在详细视图中,将显示返回给与聊天机器人交互的应用程序的 JSON 对象。使用 JSON 是应用程序从 Lex 聊天机器人系统中检索信息和向其发送信息的一种结构化方式。您可以看到,这里提供的信息与摘要视图中的信息相同,只是格式为 JSON

注意

意图的 Lex JSON 结构以及其他资源(如槽位和槽位类型)的格式在此处有文档说明:https://docs.aws.amazon.com/lex/latest/dg/import-export-format.html。

创建自定义聊天机器人

在这个主题中,我们将使用 GetQuote 创建一个自定义聊天机器人来获取股市报价。这表示,例如,为了获取特定股票代码的股市报价,将位于名为 ticker 的槽位中。然后,聊天机器人将从名为 IEX 的免费金融 API 中查找该股票代码的报价,并通过对话式响应将信息返回给用户:

注意

股票代码是表示在交易所(如纽约证券交易所或纳斯达克)交易的股票的标准方式。一系列字母代表正在交易的公司的股票。

图 4.18: 聊天机器人工作流程

我们可以为这个过程创建一个流程图,如下所示。让我们更详细地了解一下:

![图 4.19: 聊天机器人工作流程流程图]

](https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/ml-aws/img/image0172.jpg)

图 4.19: 聊天机器人工作流程流程图

识别意图和填充槽位值

作为第一步,聊天机器人等待用户的输入,以识别一个有效的意图。当它从用户发布的语句中提取 GetQuote 意图作为意图时,它将尝试填充所需的槽位。在我们的例子中,我们只有一个 StockTicker 类型的槽位(这是一个自定义槽位类型)。聊天机器人将发出提示,要求用户提供槽位的值,并解析用户的响应以填充槽位值。

有效槽位是系统识别的槽位。如果槽位值不是允许值列表的一部分,或者如果系统无法识别输入的槽位值,则称其为 invalidnot valid

如果槽位值无效,它将回退到尝试填充槽位(至少尝试到我们指定的次数,然后放弃并返回开始)。一旦聊天机器人填充了有效的槽位值,它将继续实现意图。

使用 Lambda 函数实现意图

当默认的执行操作是将意图和槽位值返回给用户,以便他/她可以在自己的应用程序中继续处理时,我们将选择在 AWS 上设置一个 Lambda 函数,该函数可以处理意图并运行满足它的业务逻辑。

在这一点上,Lex 中运行的聊天机器人进程将继续调用我们为执行而编写和指定的 Lambda 函数。

Lambda_function.Lambda_handler

当 Lex 调用执行函数时,它会发送一个包含关于发送者、意图和槽位值的各种信息的JSON有效负载。Lambda_handler()方法从JSON中解析意图和槽位参数值,然后调度另一个函数调用,从外部 API 获取我们所需的市值报价。

最后,Lambda 函数还将响应打包为另一个JSON字符串,并将其返回给 Lex。Lex 在后台解析JSON响应,并将响应消息呈现给用户。

我们将在接下来的两个活动中对这些元素进行更深入的探讨。在第一个活动中,我们将设置新的聊天机器人,在第二个活动中,我们将实现我们的 Lambda 处理函数,以便将用户请求的股票代码的实际市场价格返回给用户。

识别意图并填充槽位的聊天机器人

在下一个练习中,你将创建一个自定义聊天机器人,该机器人可以识别名为GetQuote的意图,以获取给定股票代码的市场报价。机器人将提示用户输入他/她感兴趣的股票代码值,直到槽位被填满。你还将学习如何在同一句话中声明意图和填充槽位。聊天机器人可以通过对话界面进行测试。

练习 16:创建一个可以识别意图并填充槽位的聊天机器人

在这个练习中,我们将创建并测试一个基于 Amazon Lex 的聊天机器人,该机器人具有自定义的意图槽位。以下是为创建具有自定义意图和槽位的聊天机器人的步骤:

  1. 第一步是导航到 AWS 控制台中的Amazon Lex 服务,可以通过点击 AWS 控制台中的适当链接或导航到 https://console.aws.amazon.com/lex。

  2. 下一步是点击开始按钮,以便进入聊天机器人创建屏幕:![图 4.20:开始屏幕

    ![img/image0181.jpg]

    图 4.20:开始屏幕
  3. 在这一点上,你可以通过点击自定义聊天机器人选项按钮来创建一个自定义聊天机器人。这将显示聊天机器人的详细信息,可以填写,如下面的截图所示:![图 4.21:自定义聊天机器人选项

    ![img/image0192.jpg]

    图 4.21:自定义聊天机器人选项
  4. MarketNanny。输出语音字段设置为None。这仅仅是一个基于文本的应用。这是因为我们将在本节中仅用文本与机器人交互,而暂时不使用语音。

  5. 会话超时可以设置为默认的 5 分钟。IAM 角色字段显示 IAM 角色的名称,Lex 会自动创建该角色以供机器人应用程序使用。

  6. 最后,COPPA字段涉及儿童在线隐私保护法案,在线应用程序必须遵守。假设没有 13 岁以下的儿童在课堂上,您可以点击。然而,如果您是 13 岁以下的在校学生或打算让 13 岁以下的人使用您的聊天机器人,那么您应该点击选项。

    注意

    1998 年通过了一项法律来保护 13 岁以下儿童的隐私。该法律指出,在线网站在未经父母同意的情况下,不得收集 13 岁以下用户的个人信息,以及其他规定。您可以在 https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule 了解更多关于 COPPA 法案的信息。

  7. 最后,点击带有自定义Slot typeSlot

  8. 点击创建意图按钮,将弹出一个添加意图的弹出对话框:图 4.22:MarketNanny 机器人编辑器

    图 4.22:MarketNanny 机器人编辑器
  9. 相反,如果您已经定义了一个意图,您可以通过点击屏幕左侧列中意图标题旁边的+号来创建一个新的意图。

  10. 创建包含一个或多个 Lex 格式的JSON文件和意图的ZIP文件。

  11. 搜索现有意图允许您重用您可能之前定义或导入的意图,以及由Amazon Lex定义的内置意图。

  12. 您只需点击创建意图链接,即可进入以下对话框。

  13. GetQuote中。当您告诉机器人您对市场报价感兴趣时,机器人将识别这个意图。点击添加按钮完成此步骤:图 4.23:创建意图屏幕

    图 4.23:创建意图屏幕
  14. 此时,您应该回到编辑器屏幕,并且应该看到屏幕左侧工具栏部分的GetQuote意图。编辑器屏幕还包含一些用于定义和自定义新意图的字段。

  15. 首件事是填写一些示例语句来训练GetQuote意图:图 4.24:创建意图

    图 4.24:创建意图
  16. 在输入一些示例语句后,您点击页面顶部的构建按钮,以启动机器人的训练过程:图 4.25:构建机器人

    图 4.25:构建机器人
  17. 将会出现一个带有另一个构建按钮的后续对话框,您也应该点击:图 4.26:构建确认

    图 4.26:构建确认
  18. 在此之后,您应该等待,直到您看到成功的构建对话框,这可能需要几秒钟到几分钟:![图 4.27:机器人构建成功

    ![img/image0252.jpg]

    图 4.27:机器人构建成功
  19. 您可以在屏幕右上角的测试机器人面板中测试您的新意图。

    注意

    如果测试机器人面板不可见,您可能需要点击一个箭头按钮来展开它并使其可见。

  20. 在面板中输入语句以验证机器人能否从语句中识别正确的意图:![图 4.28:测试机器人

    ![img/image026.jpg]

    图 4.28:测试机器人
  21. 当它返回响应:意图GetQuoteReadyForFulfillment时,您知道它已经正确识别了意图。请随意根据您的样本语句进行实验,以验证NLU引擎是否正常工作。

在这一点上,您的机器人除了尝试识别GetQuote意图并标记它已准备好执行外,几乎不做任何事情。这是因为我们没有向意图添加任何槽位

槽位添加

  1. 您的下一步将是添加一个槽位,以及为槽位添加一个自定义的槽位类型:![图 4.29:添加槽位

    ![img/image0273.jpg]

    图 4.29:添加槽位
  2. 添加一个槽位类型。这可以通过按JSON结构完成。然而,在点击new Slot类型之前,我们将点击:图 4.30:创建槽位类型

    图 4.30:创建槽位类型
  3. 描述字段中,并保留展开值

  4. StockTicker槽位类型下。如果您愿意,也可以添加一些自己的槽位:图 4.31:添加槽位类型

    图 4.31:添加槽位类型
  5. 最后,点击添加槽位到意图按钮,以便将槽位类型添加到意图中,并关闭对话框。

  6. 我们也可以点击保存槽位类型按钮,并在单独的步骤中将槽位添加到意图中,但使用按钮是完成这两个动作的单步快捷方式。

  7. 当您关闭对话框时,您会发现 Lex 在槽位部分也添加了一个新的槽位条目,并且它方便地预先填充了StockTicker槽位类型,您应该在条目的名称字段中将槽位名称更改为 ticker。

  8. 点击提示字段下的轮盘,将其展开到一个新的对话框:图 4.32:编辑器对话框

    图 4.32:编辑器对话框
  9. 提示编辑器对话框(命名为 ticker 提示)允许输入用于Slot的提示,机器人将使用这些提示来存储用户的输入以及用户在机器人试图通过提示从用户那里获取信息时通常会提供的相应样本语句

  10. 槽位值在相应话语中的位置由花括号 {} 表示,花括号内的槽位名称。在这种情况下,由于槽位被命名为 ticker,因此在样本话语中用 {ticker} 表示。

  11. 在提示部分填写提示(一个提示就足够了——如果您添加更多提示,机器人将随机使用它们,以增加多样性)。

  12. 然后,在相应的话语部分添加一些话语,表示槽位值的放置,在每个样本语句中使用占位符令牌 {ticker}

  13. 将最大重试次数字段保留为默认值两个。这意味着它将尝试获取槽位的值两次,然后才会发出一个错误信号:图 4.33:股票提示屏幕

    图 4.33:股票提示屏幕
  14. 最后,点击保存按钮以保存槽位提示和相应的话语定义。

  15. 最后,点击屏幕底部的保存意图按钮,然后点击屏幕顶部的构建按钮,以便启动使用我们已定义的新槽位和槽位类型的训练过程,并在训练完成后等待完成对话框显示:图 4.34:保存意图

    图 4.34:保存意图
  16. 您更新后的意图现在可以在测试机器人面板中测试:图 4.35:更新后的意图测试机器人

    图 4.35:更新后的意图测试机器人
  17. 在机器人流程结束时,当所有所需的信息都已填写完毕,它将以之前相同的格式返回意图。然而,它会在这一响应行之后跟随另一行,包含槽位参数的名称和值:

    ticker:GOOG
    
  18. 这表明股票槽位已被填充了值为GOOG。所以,太好了;我们的槽位意图正在起作用!

  19. 当您在玩机器人以验证意图和槽位是否按预期工作的时候,为什么不尝试点不同的事情:输入一些之前没有用于训练机器人的样本话语。

  20. 将您的初始话语输入为我能得到一个市场报价吗?,并查看机器人是否能识别意图。请注意,尽管这句话与样本话语相似,但它并不是那些话语之一:图 4.36:测试机器人屏幕

    图 4.36:测试机器人屏幕
  21. 如前一个屏幕截图所示,Lex 不仅能够从它未训练过的话语中识别出正确的意图,而且还能正确地将它之前未见过的符号(ADP)识别为股票槽位的值。

  22. 现在,让我们通过在句子中插入一个随机插入语作为句子的一部分来尝试槽位提示的对话形式,再次使用一个机器人之前未训练过的新股票符号(VZ)。同样,它被正确处理和识别:图 4.37:测试机器人屏幕

    图 4.37:测试机器人屏幕
  23. 显然,在训练和现实世界的对话输入示例之间,使用 NLU 引擎有很大的灵活性。

自然语言理解引擎

NLU 展示了使用在大量对话句子上训练并形成大型推理模型的 NLU 引擎的优势。

它能够连接与它专门训练的句子不同的句子。实际上,它们可以非常不同,但模型足够大,可以推断出语义含义是相似的。

你还可以使用一个技巧来让用户更容易与你的机器人互动。你可以在建立意图的同一句话中填写槽位值。这可以通过简单地在你提供的示例语句中包含槽位占位符令牌(在这种情况下为{ticker},)来实现:

  1. 将一个新的示例语句添加到GetQuote意图中,如下所示:图 4.38:GetQuote 屏幕

    图 4.38:GetQuote 屏幕
  2. ticker占位符令牌表示该槽位可以直接在初始语句中填写,在这种情况下,不需要生成提示:图 4.39:机器人的构建屏幕

    图 4.39:机器人的构建屏幕
  3. 点击构建按钮,像以前一样训练你的更新意图,然后在测试机器人面板中测试它,如下所示:图 4.40:测试机器人屏幕

    图 4.40:测试机器人屏幕
  4. 你可以看到意图已经准备好执行,并且槽位值已经适当地填写,只需一个步骤。

现在,我们已经完成了在 Amazon Lex 中定义自定义聊天机器人的过程,包括自定义意图、槽位类型和槽位。此外,我们还训练并测试了机器人,以验证它能够以高精度分类正确的意图并从对话输入中正确推断槽位值。最后,我们添加了一种快捷方法,通过在示例语句中插入槽位值的占位符令牌,直接在初始语句中填写槽位值,以训练 Lex 背后的 NLU 引擎。

Lambda 函数 – 业务逻辑实现

你可以创建 AWS Lambda 函数,以便运行你的 Amazon Lex 机器人的代码。你可以在意图配置中识别 Lambda 函数以启动和验证执行,如果没有 Lambda 函数,你的机器人将返回意图信息给客户端应用程序以执行。

在下一个练习中,你将学习如何将聊天机器人背后的业务逻辑作为 AWS 中的 Lambda 函数实现,并调用真实世界的 REST API 从外部服务获取信息返回给用户。

练习 17:创建一个 Lambda 函数来处理聊天机器人满足

在这个练习中,我们将使用在 AWS 上创建和部署的 Lambda 函数来处理聊天机器人满足业务逻辑。在上一个练习中,我们创建了一个具有 GetQuote 意图和股票槽的聊天机器人。在这个练习中,我们将实现满足业务逻辑。以下是实现业务逻辑的步骤:

  1. 通过 AWS 控制台导航到 AWS Lambda 屏幕,或者直接导航到:https://console.aws.amazon.com/Lambda.

  2. 如果你之前从未使用过 Lambda,你应该会看到一个欢迎屏幕:![图 4.41:AWS Lambda 启动屏幕 图 4.39:角色选择屏幕

    图 4.41:AWS Lambda 启动屏幕
  3. 点击创建函数按钮,开始操作。

  4. 在下一页上选择从头开始创建作者选项:![图 4.42:选择作者 图 4.40:角色选择屏幕

    图 4.42:选择作者
  5. 对于运行时,从下拉菜单中选择 Python 3.6,因为你将在这个练习中使用 Python 语言实现处理程序。在名称字段中,填写 marketNannyHandler:![图 4.43:填写值 图 4.41:填写值

    图 4.43:填写值
  6. 对于角色字段,从下拉菜单中选择创建新角色从模板:图 4.44:角色选择屏幕

    图 4.44:角色选择屏幕
  7. 在角色名称字段中输入名称 marketNannyProcessorRole。然后,点击创建函数按钮以在 AWS 中创建 Lambda 函数。你应该看到一个确认屏幕,如下所示:

![图 4.45:确认屏幕图 4.43:填写值

图 4.45:确认屏幕

实现 Lambda 函数

在这里,你将完全在行内使用 Lambda 函数编辑器,这意味着你可以直接输入和修改代码,而无需将任何文件上传到 AWS。你输入的代码将在 Lambda 函数被调用时执行:

图 4.46:函数代码屏幕

图 4.46:函数代码屏幕

首先,让我们看看 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"
        },
     …
}

我们感兴趣的相关值,用于处理,是currentIntent部分下的Slots中的name和单个ticker值。

由于我们的JSON输入被转换为 Python 字典,我们可以在 Lambda 函数中简单地获取这些值,如下所示:

event['currentIntent']['name']
event['currentIntent']['Slots']['ticker']

实现高级处理函数

实现我们的处理器的第一步是识别意图名称并调用实现它的相应函数。此代码如下所示:

def get_quote(request):
    return "Quote handling logic goes here."
def Lambda_handler(event, context):
    intent = event['currentIntent']['name']
    if intent == 'GetQuote':
        return get_quote(event)
    return "Sorry, I'm not sure what you have in mind.  Please try again."

到目前为止,这已经足够用于实际测试您的聊天机器人,如果您愿意的话,但让我们继续进行实现。

实现获取市场报价的函数

下一步将是实现get_quote函数,该函数负责获取市场报价信息并将其返回给调用处理函数:

def get_quote(request):
    Slots = request['currentIntent']['Slots']
    ticker = Slots['ticker']
    price = call_quote_api(ticker)

注意,我们已将参数命名为 request,因此我们发送给函数的事件object在此函数中被称为 request。它包含相同的值和结构,只是重命名了。因此,我们可以通过获取具有ticker键的项的值来获取之前提到的股票槽位值,如下所示:

request['currentIntent']['Slots']

我们随后调用call_quote_api()函数来获取股票条目价值的行情报价。我们尚未实现call_quote_api()函数,所以让我们接下来完成这个任务。

我们将实现call_quote_api函数,如下所示:

import json
from urllib.request import urlopen
def call_quote_api(ticker):
    response = urlopen('https://api.iextrading.com/1.0/stock/{}/delayed-quote'.format(ticker))
    response = json.load(response)
    return response['delayedPrice']

其中,股票值是股票参数的值(在这个特定例子中,它将是GOOG)。我们使用 IEX API,该 API 在互联网上提供了一个静态端点,即 https://api.iextrading.com,以获取延迟报价,使用他们 REST API 的 1.0 版本。

由于它被实现为一个简单的GET请求,股票参数嵌入在URL中,没有其他特殊头信息,如 API 密钥或用户信息,我们可以简单地使用urllib.request模块中的内置urlopen方法(我们将必须记住导入它)来接收包含嵌入股票的 URL 的响应。

由于响应也是 JSON 格式,我们需要导入 json 模块 并使用 json.load 函数 加载响应。我们感兴趣的唯一字段是 delayedPrice,因此我们将它作为函数的返回值。

将信息返回给调用应用(聊天机器人)

现在我们已经获得了市场报价值,我们可以将其返回到我们的调用应用,即我们实现的聊天机器人。然而,我们需要做一些小事情来返回这个值。首先,我们需要将其格式化为对话响应,如下面的字符串所示:

message = 'The last price (delayed) of ticker {} was {}'.format(ticker, price)

这应该让聊天机器人显示以下消息:

The last price (delayed) of ticker GOOG was 1107.32

最后一步是构建一个包含我们的消息和其他一些信息的 JSON 返回格式。我们将使用 helper 函数 close 来完成这项工作:

return close(message)

我们的 close 函数接受一个参数,即我们希望返回给聊天机器人的字符串(在这种情况下,这是消息变量的值)。它生成一个 JSON 包装器,该包装器符合我们的 Lex 机器人期望的结构,并且可以从其中提取内容并将其交付给用户。包装器的结构在此阶段并不重要,但如果您好奇,可以查看 close 函数的实现。

连接到聊天机器人

到目前为止,唯一剩下的任务是将 Lambda 函数连接到聊天机器人并测试它:

  1. 要这样做,请返回到 Amazon Lex 控制台并选择 MarketNanny 机器人:图 4.47:连接到机器人

    图 4.47:连接到机器人
  2. 然后,向下滚动到满足部分并选择 AWS Lambda 函数选项。接下来,从 Lambda 函数下拉菜单中选择 marketNannyHandler 函数,并将版本或别名保留为默认值 最新图 4.48:确认提示

    图 4.48:确认提示
  3. 通过点击 构建 按钮重建意图,并在测试聊天机器人面板中与 Lambda 处理器一起测试聊天机器人:

图 4.49:聊天机器人更新

图 4.49:聊天机器人更新

以下截图显示了与机器人交互以了解 AAPL 当前价格的过程:

图 4.50:聊天机器人更新

图 4.50:聊天机器人更新

活动 5:创建自定义机器人和配置机器人

在这个活动中,我们将为PizzaOrdering创建一个定制机器人。机器人执行自动订购披萨的任务。一个 Amazon Lex 机器人由自动语音识别ASR)和自然语言理解NLU)功能驱动,这些功能与Amazon Alexa所使用的技术相同。为此,我们将考虑以下示例:假设用户想要订购披萨;用户可能会说,“我可以订购披萨吗,请?”或者,“我想订购披萨”。你可以配置意图,以便 Amazon Lex 将信息简单地返回给客户端应用程序,以执行必要的履行。为确保其正确执行,你需要导航到 Amazon Lex 服务以创建定制机器人:

  1. 比萨订购创建一个定制机器人。

  2. 创建一个意图。

  3. 创建一个槽类型。

  4. 配置意图。

  5. 配置机器人。

    注意

    要查看详细步骤,请参阅本书末尾的附录 A,在第 217 页

摘要

在本章中,你学习了基本聊天机器人和聊天机器人设计。你还学习了如何设置 Amazon Lex 服务,以及如何创建一个示例聊天机器人。接下来,我们探讨了聊天机器人的工作流程。然后,我们查看了一个聊天机器人工作流程的流程图。最后,我们深入探讨了创建一个显示股票价格的定制聊天机器人。

在下一章中,我们将探讨如何将语音与聊天机器人结合使用。

5

第五章:使用语音与聊天机器人交互

学习目标

到本章结束时,你将能够:

  • 将 Amazon Connect 设置为个人呼叫中心

  • 将 MarketNanny 聊天机器人集成到 Amazon Connect

  • 使用语音和语音与聊天机器人交互

  • 将自定义机器人连接到 Amazon Connect

本章描述了使用语音和语音与聊天机器人交互的 Amazon Connect 服务。

简介

在上一章中,你学习了如何使用Amazon Lex服务创建MarketNanny聊天机器人。你能够通过文本框使用自然语言语音与聊天机器人交互,并且聊天机器人能够查询外部服务 API 以获取发送回你的信息。

在本章中,你将使用语音而不是文本与MarketNanny聊天机器人交互。首先,你将在 Amazon Connect 内设置一个呼叫中心,并配备本地电话号码。然后,你将MarketNanny连接到 Amazon Connect。

最后,你将通过与它通话来测试聊天机器人;这将通过调用它来完成。到本章结束时,你将能够通过电话界面使用 Amazon Connect 界面与你的MarketNanny机器人交谈。

Amazon Connect 基础知识

Amazon Connect是 AWS 提供的一项服务,允许创建基于云的接触中心。这意味着人们可以使用电话号码来联系该服务,并与机器人或人类代表进行对话。在这种情况下,我们主要对使用我们之前构建的聊天机器人来自动化交互感兴趣。

Amazon Connect 的一些关键特性如下:

  • 使用图形编辑器定义的工作流程设置和连接 Connect 很容易。

  • 没有需要部署或管理的基础设施,因此接触中心可以快速扩展和缩减。

  • 这是一种按使用付费的服务,因此没有设置或月费。我们将使用免费层,所以我们不应该需要为使用该服务付费。对于商业用途,费用基于每分钟费率。

  • Connect 部署在 42 个可用区,分布在 16 个地理区域内。

免费层级信息

在这本书中,你将只使用所提供服务的免费层级。然而,了解免费使用的限制和定价同样重要。

你应该检查官方网页 https://aws.amazon.com/connect/。一个单独的接触中心可能包括一定数量的 Amazon Connect 服务使用量和包括 60 分钟入站和出站通话的直接拨打号码。这可能会根据你的区域设置而变化。

注意

对于这本书,你不需要使用免费层级的所有服务。如果你超出了免费层级的限制,你将根据在:https://aws.amazon.com/connect/pricing/上发布的费率向 Amazon 付费。

与聊天机器人交互

使用 Connect 通过语音与您的聊天机器人交互,需要您首先在 Connect 中设置一个呼叫中心。呼叫中心将获得一个免费的本地电话号码(或在美国为免费长途电话号码)。此号码可以连接到MarketNanny)。聊天机器人使用 Lambda 无服务器服务从外部 API 获取数据并将其回传给电话中的用户:

图片参考https://aws.amazon.com/connect/connect-lexchatbot/

图 5.1:使用 Amazon Connect、Lex 和 Lambda 的基于语音的聊天机器人应用程序示例

图 5.1:使用 Amazon Connect、Lex 和 Lambda 的基于语音的聊天机器人应用程序示例

通过 Amazon Connect 使用呼叫中心与您的聊天机器人交谈

使用 Amazon Connect,我们可以创建一个呼叫中心应用程序,使我们能够通过语音命令连接到我们在上一章中构建的聊天机器人(MarketNanny),而不是通过文本框;

要创建 Amazon Connect 呼叫中心,您需要创建一个 Amazon Connect 实例。每个示例都包含与您的呼叫焦点相关的多数资产和设置。您可以从 Amazon Connect 支持中管理您场景的设置。您也可以从您的联系焦点内部管理联系焦点的设置。

您可以创建各种实例;然而,每个实例的能力仅限于您创建它的 AWS 区域内。设置、客户、测量和详细信息在 Amazon Connect 实例之间不共享。

注意

必须拥有 AWS 账户。可以通过控制台页面访问 Amazon Lex 服务。

练习 18:创建个人呼叫中心

在这个练习中,我们将使用 Amazon Connect 创建一个个人呼叫中心,并将您的MarketNanny聊天机器人连接到它。我们已经在本章中讨论了 Amazon Connect 服务:

  1. 对于第一步,导航到 AWS 控制台中的 Amazon Connect 服务页面。您可以选择链接进行导航,或直接访问此 URL: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 步

    图 5.4:Amazon Connect 资源配置界面的第二步
  5. 在下一步中,请保持来电复选框选中,并取消选中去电复选框:

    注意

    在此情况下,我们对我们机器人向任何人发起通话没有要求,但我们确实希望它能够接收通话。

    图 5.5:Amazon Connect 资源配置界面的第三步

    图 5.5:Amazon Connect 资源配置界面的第三步
  6. 完成后,点击下一步按钮。

  7. 接下来,您将看到一个信息屏幕,告知您您正在授予呼叫中心应用程序读取和写入您的 S3 存储桶中的数据、加密或解密数据以及读取和写入CloudWatch日志的权限。

  8. 它还将显示您的数据联系流程日志存储的S3 存储桶的位置:

    注意

    注意,有一个自定义设置链接可以进一步自定义这些位置,但我们不会使用它。

    图 5.6:Amazon Connect 资源配置界面的第四步

    图 5.6:Amazon Connect 资源配置界面的第四步
  9. 这将带您进入最终屏幕,该屏幕将为您提供对您的联系中心应用程序所有设置的回顾:图 5.7:Amazon Connect 资源配置界面的第五步

    图 5.7:Amazon Connect 资源配置界面的第五步
  10. 现在,点击创建实例按钮以创建您的应用程序。您应该会看到一个对话框:图 5.8:Amazon Connect 设置

    图 5.8:设置 Amazon Connect
  11. 几分钟或两分钟后,它将完成设置过程,并带您进入一个成功界面,在那里您可以点击开始按钮直接进入您的应用程序:图 5.9:成功界面

    图 5.9:成功界面

    注意

    应用程序的设置可能需要长达 15 分钟,所以如果您最初未能成功进入应用程序页面,请保持耐心,偶尔再试一次,直到成功为止。

  12. 通常,这不会花费很长时间,并且通常应用程序页面将立即可访问。

练习 19:为您的呼叫中心获取免费电话号码

在这个练习中,我们将为我们的定制呼叫中心获取一个免费号码。可以通过 Amazon Connect 提供的免费层服务获取免费电话号码。以下是为获取免费号码的完成步骤:

  1. 您个人呼叫中心的欢迎屏幕应该可见,如果不可见,您可以在之前屏幕中显示的URL中轻松访问它,在您点击开始按钮之前:

    注意

    在我的情况下,它是 https://mymarketnanny.awsapps.com/connect;在您的应用中,它将基于您自己的应用程序名称。

    ![图 5.10:Amazon Connect 欢迎界面 图片链接

    图 5.10:Amazon Connect 欢迎屏幕
  2. 在这一点上,您可以点击您的呼叫中心应用程序的本地电话号码。在此屏幕上,您可以选择您的国家:![图 5.11:索赔电话号码屏幕 图片链接

    图 5.11:索赔电话号码屏幕
  3. 类型保留为默认(直接拨打)选项,并从电话号码下拉菜单中选择一个电话号码。在大多数情况下,这应该是一个您当地的号码。如果您选择了一个不是本地的号码,您可能会根据拨打该号码的成本付费:![图 5.12:电话号码选择 图片链接

    图 5.12:电话号码选择
  4. 完成后,点击下一步按钮。这将允许您通过拨打新电话号码来测试您的电话号码。您应该会听到一条以你好开头的信息,感谢您的来电。这些都是 Amazon Connect 虚拟联系中心可以为您实现的一些示例。

  5. 这将随后是一个选项列表;您可以在有时间的时候尝试它们,看看它们会做什么。现在,点击继续按钮,这将带您到仪表板屏幕:![图 5.13:Amazon Connect 仪表板屏幕 图片链接

    图 5.13:Amazon Connect 仪表板屏幕
  6. 您现在已经在 Amazon Connect 上拥有了一个工作的呼叫中心应用程序。

使用 Amazon Lex 聊天机器人和 Amazon Connect

使用 Amazon Lex,您可以创建智能聊天机器人。这可以通过将联系流程转换为常规对话来实现。Amazon Connect 服务通过启用创建一个联系中心(基于云)以及生成动态流程来补充上述功能。这为您的来电者提供个性化的体验。此外,来电者在通话过程中输入的双音多频DTMF)数字可以很容易地被这些聊天机器人识别。

当 Amazon Lex 和 Amazon Connect 协同工作时,聊天机器人可以评估来电者的意图。此外,您可以使用 AWS Lambda 函数以及您的聊天机器人来处理来电请求,向来电者提供信息,并查询应用程序。这些聊天机器人能够通过智能管理对话和根据来电者的即时响应审查回复来维持上下文。

在下一节中,我们将连接您的 MarketNanny 聊天机器人到呼叫中心,这样用户就可以通过电话说话,并将他们的语音自动转换为文本话语,然后发送到 Lex 聊天机器人。

理解联系流程

联系流程定义了客户在与您的呼叫中心互动时经历的每个体验步骤。您可以通过使用提供的联系流程模板来创建联系流程。您也可以使用创建联系流程编辑器从头开始创建自己的联系流程。

联系流程设计器屏幕提供了一种在拖放环境中可视创建联系流程的方法。联系流程由左侧面板中的节点组成,在设计师区域(在“显示更多流程信息”链接下)可以访问。

节点根据交互设置分支集成终止/转接类别进行分类。可以通过点击类别名称旁边的下拉图标来隐藏或显示每个类别中的节点。您将通过为您的聊天机器人创建联系流程来探索一些可用的节点。

联系流程是用户(通常是主管)逐步刷新框架中每个进入的通话设置的方式,以确保用户听到定制和相关的选项。虽然有许多预设计的联系流程,但您将为您的MarketNanny聊天机器人创建一个新的流程。

联系流程模板

以下是可以使用的模板:

  • 客户队列流程:管理客户在队列中的体验,在连接到客服代表之前。

  • 客户等待流程:管理客户在等待时的体验。

  • 客户旁白流程:管理在加入客服代表之前,客户在电话呼入过程中体验到的内容。

  • 外呼旁白流程:管理在连接到客服代表之前,客户在电话外呼过程中体验到的内容。

  • 客服代表等待流程:监督专家在与客户等待时的体验。使用此流,在客户等待时,至少可以播放一个声音提示到专家,使用 Loop 提示方块。

  • 客服旁白流程:管理客服代表在电话呼入过程中,在加入客户之前体验到的内容。

  • 转接到客服代表流程:管理客服代表在转接到另一个客服代表时的体验。

  • 转接到队列流程:管理客服代表在转接到另一个队列时的体验。

在下一节中,我们将设置您的呼叫中心,使其能够接受来电,将您的MarketNanny聊天机器人连接到呼叫中心,以便用户可以通过电话说话,并且将用户的语音自动转换为文本话语,该话语将被发送到 Lex 聊天机器人。

聊天机器人随后继续处理话语,查找意图和槽位,并通过您在上一节中设置的 Lambda 函数来满足它。

为了将您的呼叫中心实例与您的聊天机器人连接,您需要暂时返回主屏幕(不是仪表板)。选择联系流程的链接。

练习 20:将呼叫中心连接到您的 Lex 聊天机器人

在这个练习中,您将设置您的呼叫中心,使其能够接受来电,并将您的MarketNanny聊天机器人连接到呼叫中心。以下为完成步骤:

注意

这不是之前的仪表板屏幕。你可能会在那里找到一个联系流程条目,但它不是我们感兴趣的。

  1. 在这里,您将找到一个标题为 Amazon Lex 的部分,在 Lex 机器人下有一个下拉菜单。点击下拉菜单以找到作为条目的MarketNanny机器人,并选择它,然后选择保存 Lex 机器人链接来保存它:图 5.14:带有 Lex 机器人选择下拉菜单的联系流程屏幕

    图 5.14:带有 Lex 机器人选择下拉菜单的联系流程屏幕
  2. 现在,您可以通过选择概览链接并点击登录为管理员按钮来导航回仪表板屏幕。仪表板屏幕将在新的浏览器标签页中打开:图 5.15:登录为管理员屏幕

    图 5.15:登录为管理员屏幕
  3. 在仪表板屏幕上,选择路由图标,当它打开时,选择联系流程图 5.16:从仪表板选择路由、联系流程

    图 5.16:从仪表板选择路由和联系流程
  4. 这将带您到一个联系流程屏幕,而不是我们之前所在的屏幕。这个屏幕是联系流程设计器,您可以在其中设计和创建新的联系流程:图 5.17:联系流程屏幕

    图 5.17:联系流程屏幕
  5. 点击MarketNannyFlow图 5.18:联系流程设计器屏幕

    图 5.18:联系流程设计器屏幕
  6. 你将为你的聊天机器人的联系流程使用的第一个节点是设置声音节点。你可以在设置类别下找到它,并将其拖动到入口点节点右侧的图形视图中,该节点已经显示在视图中。

  7. 通过点击输出圆圈并使用鼠标将其拖动到设置声音节点左侧的输入凸起处,将入口节点输出与设置声音节点输入连接起来:图 5.19:带有设置声音节点的联系流程设计器屏幕

    图 5.19:带有设置声音节点的联系流程设计器屏幕
  8. 接下来,你可以通过点击节点顶部来设置节点的属性。这将弹出一个面板,显示在屏幕的右侧,其中包含你可以设置的相应属性。

  9. 对于此组件,它提供了语言声音属性,这两个属性都可以通过在每个属性标签下的下拉菜单中选择一个值来设置。你可以设置适合你场景的值,然后点击保存按钮:图 5.20:设置声音节点的属性

    图 5.20:设置声音节点的属性
  10. 下一个要添加的节点是 获取客户输入 节点,您可以在交互选项卡下找到它。您可以像连接 设置声音 到入口节点一样,将此节点的输入连接到 设置声音 节点的输出:图 5.21:添加获取客户输入节点

    图 5.21:添加获取客户输入节点
  11. 首先,选择 文本 语音(临时)选项,并点击其下的 输入文本。在输入文本框中,输入以下问候语等:

    Hi this is the Market Nanny chatbot. How may I help you today?
    

    注意

    随意替换为可能更适合您的其他文本。

  12. 这是当 联系中心 应用程序首次接听电话时将转换为语音问候的文字:![图 5.22:获取客户输入属性 图片

    图 5.22:获取客户输入属性
  13. 接下来,向下滚动设置面板并选择 Amazon Lex 子部分,而不是 DTMF 部分。在这里,您将能够配置节点以与您的聊天机器人一起工作。

    注意

    DTMF 部分提供了一种通过电话按键操作与呼叫者进行交互的方法,但今天我们不会涉及这一点。我们更感兴趣的是让我们的聊天机器人与呼叫者进行交互!

  14. 在本节中,在 Lex 机器人下,您可以输入您的聊天机器人的名称和别名。在名称下,输入 MarketNanny,并在 $LATEST 下。

  15. $LATEST 是一个系统定义的别名,它指定联系中心将始终访问最近发布的 MarketNanny 聊天机器人版本:![图 5.23:获取客户输入属性中的 Amazon Lex 属性 图片

    图 5.23:获取客户输入属性中的 Amazon Lex 属性
  16. 最后,在意图部分指定 GetQuote 意图。由于这是我们目前正在处理的唯一意图,请单击 保存 按钮:![图 5.24:获取客户输入节点中的 GetQuote 意图 图片

    图 5.24:获取客户输入节点中的 GetQuote 意图
  17. 您现在可以看到,获取客户输入 节点已更改以显示其属性面板中指定的意图:![图 5.25:完整联系中心流程 图片

    图 5.25:完整联系中心流程
  18. 您可以通过添加两个更多节点来完成流程:

    • 交互 部分选择 播放 提示。在属性面板中,将提示属性设置为文本到语音(临时),并在以下文本框中输入文本:

      "Thanks for using MarketNanny" Feel free to ask me something else.
      
    • 终止/转接 部分的 断开连接/挂断。不要设置任何属性。

  19. 按照之前所示连接节点。

  20. 获取客户输入 中的默认和错误状态输出连接到 断开连接/挂断 节点的输入。

  21. GetQuote 输出连接到播放提示节点。

  22. 播放 提示的输出连接到 设置 声音的输入。这确保了您可以在保持正确提问的情况下与您的聊天机器人进行交互。

  23. 最后,点击屏幕右上角保存按钮旁边的下拉图标,并选择保存和发布以发布联系流程:图 5.26:保存和发布部分

    图 5.26:保存和发布部分
  24. 作为最后一步,你将连接你的呼叫中心电话号码到刚刚创建的新联系流程。

  25. 从屏幕左侧的菜单面板中选择路由菜单,然后从该菜单中选择电话号码项:图 5.27:从仪表板选择路由和电话号码

    图 5.27:从仪表板选择路由和电话号码
  26. 这将打开MarketNanny

  27. 选择电话号码将带你去到编辑电话号码页面:图 5.28:编辑电话号码屏幕

    图 5.28:编辑电话号码屏幕
  28. 在这里,点击MarketNannyFlow下的下拉菜单。

  29. 拨打你的呼叫中心电话号码以验证你是否可以通过与它说话来与你的MarketNanny聊天机器人交互!

活动一:创建自定义机器人和将机器人与 Amazon Connect 连接

在这个活动中,我们将创建一个用于检查账户余额Amazon Lex机器人。该机器人将检查账户余额。一个Amazon Lex机器人通过自动语音识别ASR)和自然语言理解NLU)能力进行控制,这与推动 Amazon Alexa 的类似创新。为此,我们将考虑以下示例:假设用户想要检查他们的账户余额;用户可能会使用我想检查我的账户余额。你可以配置 Amazon Lex 机器人的意图到 Amazon Connect 实例。你可以创建一个联系流程并添加你的 Amazon Lex 机器人。为了确保这正确发生,你需要导航到 Amazon Lex 服务和 Amazon Connect 服务以连接机器人:

  1. 创建一个 Amazon Lex 机器人。

  2. 通过创建意图并添加槽位来配置机器人。

  3. 配置机器人并配置机器人错误处理,例如当呼叫者的言语不被理解时。

  4. 构建和测试机器人。

  5. 发布机器人并创建一个别名。

  6. 将机器人添加到你的 Amazon Connect。

  7. 创建一个联系流并将其包括在内。

  8. 将联系流程分配给电话号码。

    注意

    要参考详细步骤,请参阅本书末尾的附录 A 第 225 页。

摘要

在本章的第一部分,你学习了 Amazon Connect 的基础知识,甚至查看了 Amazon Connect 的免费层版本。后来,我们探讨了使用 Amazon Connect、Lex 和 Lambda 的基于语音的聊天机器人应用程序示例。接下来,我们创建了一个个人呼叫中心。

你还学会了如何为个人呼叫中心获取一个免费电话号码。我们还了解了如何使用 Amazon Lex 聊天机器人和 Amazon Connect 配合联系流程和不同的模板。最后,你学习了如何将呼叫中心连接到你的 Lex 聊天机器人。

在下一章中,你将学习如何使用计算机视觉和 Amazon Rekognition 服务来分析图像。Amazon Rekognition 服务用于检测图像中的物体、场景和文本。它还用于匹配不同图像中的面部,并比较这两张图像之间是如何紧密相连的。

6

第六章:使用计算机视觉分析图像

学习目标

到本章结束时,您将能够:

  • 使用计算机视觉的 Rekognition 服务进行图像分析。

  • 在图像中检测对象和场景。

  • 检测图像中内容审核的需求。

  • 在图像中分析和识别名人面孔。

  • 比较不同图像中的面孔,以查看它们彼此之间匹配的紧密程度。

  • 从图像中提取文本。

本章描述了使用各种技术分析图像内容的 Amazon Rekognition 服务。

简介

在前面的章节中,您使用 Amazon Lex 服务创建了一个名为MarketNanny的聊天机器人。这个聊天机器人接收您关于股票代码的输入,然后,将此信息转发到 Lambda 函数,该函数随后前往外部API检索该信息。Lambda 函数然后将此信息发送回聊天机器人,聊天机器人随后通过对话文本和语音界面将其提供给您。

您之前已经使用过文本界面,在下一章中,您学习了如何使用 Amazon Connect 服务设置基于语音的呼叫中心。您创建了一个联系流程,并用适当的节点和属性填充它,以便这些节点连接到您的MarketNanny聊天机器人,并允许任何人通过拨打本地电话号码通过语音界面与聊天机器人进行对话!

在本章中,您将使用Amazon Rekognition 服务执行各种图像处理任务。首先,您将在图像中识别对象和场景。然后,您将测试图像是否可能被标记为需要内容审核。接下来,您将使用 Rekognition 分析面孔。您还将识别图像中的名人和知名人士。您将比较在不同图像和设置(例如,在群体中或单独)中出现的面孔,并在不同图像中识别相同的人。最后,您将从可能显示文本的图像中提取文本。

Amazon Rekognition 基础知识

Amazon Rekognition 是 AWS 提供的一项服务,允许您使用机器学习进行图像分析。它建立在 AWS 自身的可扩展基础设施之上,并使用深度学习技术,如果需要,每天可以分析数十亿张图像。它也由亚马逊不断更新,学习新的标签和功能。

Amazon Rekognition 的一些用例如下:

  • 使用文本关键词搜索您的图像内容库。

  • 通过比较实时图像与参考图像来确认用户身份。

  • 根据公共图像分析趋势,包括图像中人们的情感和情绪。

  • 检测露骨和暗示性内容,并自动过滤以满足您的需求

  • 从图像中检索文本。

    注意

    Amazon Rekognition 也是医疗应用中符合HIPAA资格的服务。如果您希望在 HIPAA 下保护您的数据,您需要联系亚马逊客户支持并填写业务合作伙伴附加协议(BAA)。有关 HIPAA 的更多信息,请访问以下链接:https://aws.amazon.com/compliance/hipaa-compliance/。

Amazon Rekognition 免费层信息

在这本书中,您将仅使用所提供服务的免费层。然而,了解免费使用的限制和定价是很重要的。对于图像处理,您可以免费获得以下服务:

  • 加入后,新的 Amazon Rekognition 客户最初每年可以分解高达 5,000 张图片。

  • 您可以使用此补充计划利用所有 Amazon Rekognition API,并且还可以免费存储高达 1,000 张面孔。

    注意

    如果您超出免费层的限制,您将根据以下链接中发布的费率向亚马逊付费:https://aws.amazon.com/rekognition/pricing/。

Rekognition 与深度学习

深度学习是机器学习的一个重要子领域,也是人工智能的一个分支。深度学习的工作方式是通过使用具有许多处理层的深度图从原始数据中推断高级抽象。

深度学习结构,例如卷积深度神经网络CNNs)和循环神经网络RNNs),已被连接到计算机视觉、语音识别、自然语言处理和音频识别,以提供结果。

Rekognition 服务在幕后使用深度学习来提供其各种功能。它使用预训练的模型,因此用户无需训练系统。具体的细节是亚马逊的专有和机密信息,但我们可以看到它是如何工作的,以及如何在本章中使用 Rekognition。

在图像中检测对象和场景

Amazon Rekognition 提供了一种功能,可以在图像中检测对象和场景并对其进行标记。标签可能是一个对象、场景或概念,例如人物沙子海滩(场景)和户外(概念)。

每个标签都附带一个置信度分数,该分数衡量服务在 0 到 100 的范围内得到该标签正确答案的概率。这允许您或您的应用程序自行判断允许或丢弃结果的阈值。

Rekognition 支持数千个标签,包括以下表格中显示的类别:

![图 6.1:Amazon Rekognition 支持的标签

![Image_Lesson6_001.jpg]

图 6.1:Amazon Rekognition 支持的标签

此外,亚马逊正在不断训练系统以识别新的面孔,您可以通过Amazon 客户支持请求您可能希望使用的、系统中没有的标签。

要创建一个示例图像的 Amazon Rekognition,您可以执行以下操作:

  1. 在 AWS 控制台中导航到 Amazon Rekognition 服务网页:图 6.2:在 AWS 控制台中选择 Rekognition 服务。

    图 6.2:在 AWS 控制台中选择 Rekognition 服务。
  2. 您可以在机器学习部分找到 Rekognition。当您在 Rekognition 页面时,点击左侧工具栏中的对象和场景检测链接,导航到对象和场景检测页面。

  3. 点击工具栏中的对象 场景检测链接,导航到对象场景检测页面。

  4. 接下来,在使用自己的图像面板下选择文本框https://images.unsplash.com/photo-1540253208288-6a6c32573092?w=800图 6.3:使用图像 URL 输入文本框。

    图 6.3:使用图像 URL 输入文本框。

    图像的结果如下:

    图 6.4:样本图像的结果。

    图 6.4:样本图像的结果。
  5. 您可以看到,在图像中,置信度为 93.1%的检测到的对象如下:

    • 黎明

    • 黄昏

    • 自然

    • 户外

    • 红色天空

    • 天空

  6. 点击显示更多链接以显示具有较低置信水平的更多结果。这将显示检测到的更多对象:图 6.5:样本图像的完整标签集。

    图 6.5:样本图像的完整标签集。
  7. 您可以选择您自己的应用程序中想要截断结果的置信度阈值。

练习 21:使用自己的图像检测对象和场景

在这个练习中,我们将使用 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。

  5. 以下为图片:提供的第一张图片。

    图 6.6:提供的第一张图片。

    注意

    我们从名为 https://unsplash.com/的股票图片网站上收集了图片,这些图片可以免费下载和使用,没有任何限制,用于本书的目的。始终遵守版权法,并注意你所在司法管辖区可能适用的任何限制或许可费用(如果适用)。您可以在以下位置查看 unsplash.com 图片的许可:https://unsplash.com/license。

  6. 您可以在图片右侧的结果面板下查看对象检测的结果。在这种情况下,这是一张相机的图片,结果应如下所示:![图 6.6:提供的第一张图片的结果。 图片 0073

    图 6.7:提供的第一张图片的结果。
  7. 如您所见,结果非常准确。接下来,您可以尝试以下图片,并验证结果是否与每张图片后立即显示的表格中的结果一致。https://images.unsplash.com/photo-1517941875027-6321f98198ed?w=800https://images.unsplash.com/photo-1500111709600-7761aa8216c7?w=800

  8. 以下为图片:

![图 6.7:提供的第二张图片。图片 0084

图 6.8:提供的第二张图片。

![图 6.8:提供的第二张图片的结果。图片 0094

图 6.9:提供的第二张图片的结果。

![图 6.9:提供的第三张图片。图片 0103

图 6.10:提供的第三张图片。

![图 6.10:第三张提供的图片的结果。图片 0114

图 6.11:提供的第三张图片的结果。

图片审查

除了对象和场景检测外,Rekognition 还提供过滤不适当内容的能力。您可以使用审查标签进行逐点子分类,从而让您调整用于确定您认为满意或令人震惊的图片类型的通道。使用 DetectModerationLabels 操作检测图像中的不安全内容。

您可以利用此组件来增强照片分享目的地、聚会、约会应用、青少年内容平台、电子商务平台和购物中心等。在这本书中,我们不会使用任何成人或裸露图片,但我们可以展示使用此功能的内容,这些内容在某些地区可能被认为是色情或暗示性的,例如泳装或夜店服装。

在本节中,图片默认为模糊状态,因此除非您按下“查看内容”按钮,否则无需查看它们。

注意

如果您认为任何色情或暗示性图片令人反感,请根据您个人的、道德的、宗教的或文化规范跳过此部分。

Amazon Rekognition 使用分层分类法对显眼和暗示性内容的类别进行标记。两个顶级类别是显眼裸露暗示性。每个顶级类别都有多个二级类别。使用此功能检测并标记的内容类型如下:

![图 6.11:内容类型类别图片 0123

图 6.12:内容类型类别

要创建一个图片审查的样本图片,您可以执行以下操作:

  1. 导航到 AWS 控制台中的 Amazon Rekognition 服务页面,或直接访问 URL https://console.aws.amazon.com/rekognition。

  2. 点击工具栏中的图片审查链接,导航到图片审查页面。

  3. 接下来,在使用自己的图片面板下选择文本框

  4. 输入以下图像的 URL 以进行分析:https://images.unsplash.com/photo-1512101176959-c557f3516787?w=800.

  5. 你会立即注意到内容被模糊处理了。正在分析的图像是左边的第一张图像,它已经被选中。你会看到服务已正确识别出图像中的女性泳装或内衣类型的建议性内容,置信度为98.4%

![图 6.12:图像审查的结果。图片

图 6.13:图像审查的结果。

练习 22:检测图像中的令人反感的内容

在这个练习中,我们将检测图像中的令人反感的内容。现在,你可以尝试使用自己的图像来使用这项服务。我们已选择了三张我们将尝试使用此功能的图片:

  1. 将以下URL复制粘贴或输入到页面底部的使用图片 URL文本框中,然后按Go按钮以从服务中获得结果:https://images.unsplash.com/photo-1525287957446-e64af7954611?w=800.![图 6.13:使用图片 URL 上传文本框。 图片

    图 6.14:使用图片 URL 上传文本框。
  2. 你应该收到一个结果,表明该服务已找到女性泳装或内衣内容,置信度为98.4%:![图 6.14:服务找到的结果 图片

    图 6.15:服务找到的结果
  3. 要提供给服务的以下图像 URL 是:https://images.unsplash.com/photo-1509670811615-bb8b07cb3caf?w=800.

  4. 就像之前一样,将其输入到使用图片 URL文本框中,然后按Go按钮。这张图片没有令人反感的内容:![图 6.15:图像审查的第一个提供的图像。 图片

    图 6.16:图像审查的第一个提供的图像。
  5. 你应该看到Rekognition正确返回了无结果:图片

    图 6.17:第一个提供的图像的图像审查结果。
  6. 最后,我们将使用一张应该再次返回一些结果的图片:https://images.unsplash.com/photo-1518489913881-199b7c7a081d?w=800.

    这个应该再次被正确识别为包含女性泳装或内衣内容的,置信度为97.1%

![图 6.17:第二个提供的图像的图像审查结果。图片

图 6.18:第二个提供的图像的图像审查结果。

面部分析

Rekognition 还可以对面部进行更详细的分析。给定一张可检测到人脸的图片,它可以判断人脸是男性还是女性,人脸的年龄范围,这个人是否在微笑并看起来很开心,以及他们是否戴眼镜。

它还可以检测更详细的信息,例如眼睛和嘴巴是张开还是闭合,以及这个人是否有胡须或胡子。

要创建样本图像的面部分析,您可以执行以下操作:

注意

点击左侧工具栏中的“面部分析”链接以导航到面部分析页面。

  1. 在“使用您的图像”面板下选择“文本框”。

  2. 输入以下图像的 URL 以进行分析:https://images.unsplash.com/photo-1525943837837-af668e09139d?w=800.

  3. 对于此图像,您会看到主要图像框显示一个边界矩形,它显示了检测到面部所在的区域。在边界框内,还有三个点来标识关键面部图像的位置:嘴巴和鼻子检测。 .图 6.18:面部分析的第一张样本图像。

    图 6.19:面部分析的第一张样本图像。
  4. 在图像右侧的“结果”部分,您可以看到 Rekognition 已经检测到图像中的以下面部属性:图 6.19:面部分析第一张样本图像的结果。

    图 6.20:面部分析第一张样本图像的结果。
  5. 您可以点击“显示更多”链接以显示其他也已识别的属性。

  6. 所有这些识别出的特征都具有极高的置信度,表明该服务对其发现非常自信。

练习 23:分析您自己的图像

在这个练习中,您已经提供了三个图像的链接,以便您可以使用自己的图像尝试该服务:

注意

点击左侧工具栏中的“面部分析”链接以导航到“面部分析”页面。

  1. 要分析的第一张图像的 URL 如下:https://images.unsplash.com/photo-1494790108377-be9c29b29330。

  2. 您可以复制并粘贴或键入此 URL 到页面底部的“使用您的图像”部分下的“使用图像 URL”文本框中,如下所示:图 6.20:图像 URL 输入文本框。

    图 6.21:图像 URL 输入文本框。

    图 6.21:用于面部分析的第一张图像。

    图 6.22:用于面部分析的第一张图像。
  3. 您可以从边界框和点中看出,Rekognition 能够轻松识别面部:图 6.22:用于面部分析的第一张图像的边界框。

    图 6.23:用于面部分析的第一张图像的边界框。
  4. 在“结果”部分,它相当准确地显示了图像中面部属性:图 6.23:用于面部分析的第一张图像的结果。

    图 6.24:用于面部分析的第一张图像的结果。
  5. 第二张图像是另一张不同的面部,也没有微笑。您可以输入此 URL 以将其提供给 Rekognition:https://images.unsplash.com/photo-1488426862026-3ee34a7d66df?w=800.图 6.24:用于面部分析的第二张图像。

    图 6.25:用于面部分析的第二张图像。
  6. Rekognition 再次很好地识别了面部:![图 6.25:为面部分析提供的第二张图像的边界框 图片 0243

    图 6.26:为面部分析提供的第二张图像的边界框
  7. 结果还反映她没有微笑:![图 6.26:为面部分析提供的第二张图像的结果。 图片 0254

    图 6.27:为面部分析提供的第二张图像的结果。
  8. 最后,我们将通过以下链接给 Rekognition 一张男性的图像,看看它的表现如何:https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=1000.![图 6.27:为面部分析提供的第三张图像。 图片 0262

    图 6.28:为面部分析提供的第三张图像。
  9. 如预期,该服务可以识别男性和女性。它通过边界框识别面部:![图 6.28:为面部分析提供的第三张图像的边界框。 图片 0275

    图 6.29:为面部分析提供的第三张图像的边界框。
  10. 它还以高置信度(99.9%)显示结果,表明面部是男性。它还相应地更新了年龄范围:![图 6.29:为面部分析提供的第三张图像的结果。 图片 0283

    图 6.30:为面部分析提供的第三张图像的结果。
  11. 它有 70.9%的信心认为这个男人在微笑,但我们从图像中可以看出,他并没有笑得很开心,如果不是完全不笑的话。

  12. 最后,该服务 100%确信他戴着眼镜,99%确信他没有戴太阳镜,这是对图像的高度准确描述。

名人识别

Rekognition 提供了在图像中识别和标记名人和其他著名人物的能力。这包括在政治、体育、商业、娱乐和媒体等领域中突出的各种人物。

重要的是要记住,Rekognition 只能识别它已经训练过的面部,因此不涵盖完整的、详尽的名人名单。然而,由于亚马逊持续训练系统,它不断向服务中添加新的面部。

注意

点击左侧工具栏中的名人识别链接,导航到名人识别页面。

要创建样本图像的名人识别,您可以执行以下操作:

  1. 在“使用您的图像”面板下选择文本框

  2. 输入以下图像的 URL 以进行分析:https://images.pexels.com/photos/53487/james-stewart-man-person-actor-53487.jpeg.![图 6.30:名人识别的第一个样本图像,包含结果。 图片 0293

    图 6.31:名人识别的第一个样本图像,包含结果。
  3. 点击了解更多链接,您将被带到詹姆斯·斯图尔特的 IMDB 页面:![图 6.31:第一个样本图像的“了解更多”链接。 图片 0302

    图 6.32:第一个样本图像的“了解更多”链接。

    练习 24:在您的图像中识别名人

    在这个练习中,我们将使用另一个拥有更多名人图片集合的网站。您也可以免费无限制地使用这些图片。现在,您可以在自己的图片上尝试这项服务。我们已选择三张图片,我们将使用此功能进行测试。

    您可以在此处查看 pexels.com 图片的许可:https://www.pexels.com/creative-commons-images/

    注意

    点击左侧工具栏中的名人识别链接以导航到名人识别页面。

  4. 将以下URL复制并粘贴或输入到页面底部使用您的图片部分下的使用图片 URL文本框中,然后按Go按钮以从服务中获得结果:![图 6.32:使用图片 URL 输入文本框 图片

    图 6.33:使用图片 URL 输入文本框
  5. 首先输入到文本框中的 URL 是 https://images.pexels.com/photos/276046/pexels-photo-276046.jpeg。![图 6.33:为名人识别提供的第一个图片。 图片

    图 6.34:为名人识别提供的第一个图片。
  6. 这是一张著名女演员查理兹·塞隆的图片。结果部分将显示她的名字和一个了解更多链接,该链接将带您访问她的IMDB页面:![图 6.34:为提供的第一个名人识别图片的“了解更多”链接 图片

    图 6.35:为提供的第一个名人识别图片的“了解更多”链接
  7. 您可以输入到文本框中的第二张图片的 URL 是 https://images.pexels.com/photos/2281/man-person-suit-united-states-of-america.jpg?w=800,这给我们带来了以下图片:![图 6.35:为名人识别提供的第二张图片 图片

    图 6.36:为提供的第二张名人识别图片的“了解更多”链接
  8. 这张图片展示了前美国总统巴拉克·奥巴马。Rekognition 能够轻松地识别他,并在结果部分显示他的名字。了解更多链接再次链接到他的IMDB页面:![图 6.36:为提供的第二张名人识别图片的“了解更多”链接。 图片

    图 6.37:为提供的第二张名人识别图片的“了解更多”链接。
  9. 最后一张图片包含多位名人。您可以将以下 URL 输入到 Rekognition 中:https://images.pexels.com/photos/70550/pope-benedict-xvi-president-george-bush-laura-bush-andrews-afb-70550.jpeg?w=800,这给我们带来了以下图片:![图 6.37:为名人识别提供的第三张图片,有三个边界框 图片

    图 6.38:为名人识别提供的第三张图片,有三个边界框。
  10. 您可以在结果部分看到,Rekognition 识别了图片中的三位名人:

    • 乔治·W·布什

    • 保罗·本尼迪克特十六世

    • 劳拉·布什

以下图片显示了名人识别的结果:

![图 6.38:为名人识别提供的第三张图片的结果。图片

图 6.39:为名人识别提供的第三张图片的结果。
  1. 在他们的名字下点击“了解更多”链接,会跳转到各自的 IMDB 页面。正如我们之前所做的那样,您可以通过点击它们来验证这一点。

Face 对比

Rekognition 允许您比较两张图像中的面孔。这主要是为了识别两张图像中哪些面孔是相同的。作为一个用例示例,这也可以用于将人们的照片与他们的个人照片进行比较。

本节展示了行业标准,以便您可以使用 Amazon Rekognition 分析包含不同面孔的图片中的面孔。当您指定参考面孔(源)和比较面孔(目标)图片时,Rekognition 会考虑源图片中最大的面孔(即参考面孔),最多识别目标图片中的 100 个面孔(即比较面孔),然后发现源图片中的面孔与目标图片中的面孔的匹配程度。每个比较的接近度得分在结果表中显示。

本功能的使用有一些限制如下:

  • 如果源图像包含多个面孔,则使用最大的一个与目标图像进行比较。

  • 目标图像可以包含多达 15 个面孔。源图像中检测到的面孔将与目标图像中检测到的每个面孔进行比较。

    注意

    点击左侧工具栏中的“Face 对比”链接,导航到 Face 对比页面。

使用面部对比功能时,有两个图像部分并排显示。您可以选择将左侧部分的图像与右侧部分的图像进行比较。要创建样本图像的面部分析,您可以执行以下操作:

  1. 在左侧的“使用自己的图像”面板下选择文本框

  2. 输入以下图像的 URL 以进行分析:https://images.unsplash.com/photo-1524788038240-5fa05b5ee256?w=800。

  3. 在右侧的“使用自己的图像”面板下选择文本框

  4. 输入以下图像的 URL 以进行分析:https://images.unsplash.com/photo-1524290266577-e90173d9072a?w=800:![图 6.39:提供的第一批样本图像的 Face 对比。

    ![img/image0372.jpg]

    图 6.40:提供的第一批样本图像的 Face 对比。
  5. 使用默认选择,您可以在结果部分看到,它以97%的置信度在右侧识别出左侧图像中的女孩:

![图 6.40:提供的第一批样本图像的 Face 对比结果。

![img/image0381.jpg]

图 6.41:提供的第一批样本图像的 Face 对比结果。

活动一:在 Rekognition 中创建和分析不同的面孔

在这个活动中,你可以使用自己的图像尝试 Rekognition。例如,我们提供了两组显示相同人物的图像的链接。你可以通过使用使用图像 URL文本框将图像集输入左侧(比较)和右侧(比较)两侧。记住,这次有两个,所以有两个Go按钮要按。这些图像的链接是 https://images.unsplash.com/photo-1484691065994-f1b2f364d7a6?w=800https://images.unsplash.com/photo-1485463598028-44d6c47bf23f?w=800。为了确保你正确这样做,你需要导航到 Amazon Rekognition 服务:

  1. 将第一组图像上传到 Rekognition,以便它可以识别面部。

  2. 按以下参数比较第一组图像:

    • 置信度

    • 比较不同角度

    • 光照

    • 眼镜在脸上的位置

  3. 将第二组图像上传到 Rekognition。

  4. 比较第二组图像以确定面部相似度。

图像中的文本

图像中的文本是 Amazon Rekognition 的一项功能,允许你在图像中检测和识别文本,如街道名称字幕产品名称车辆牌照。此功能专门设计用于与真实世界的图像而不是文档图像一起工作。

对于提供的每一张图像,该服务返回一个文本标签和边界框,以及一个置信度分数。这对于在图像集合中搜索文本可以非常有用。每张图像可以根据此结果和其他服务功能的结果标记相应的文本元数据。

目前,支持的文本是拉丁字母和数字(西文)。每张图像可以识别多达 50 个字符序列。文本必须是水平的,旋转+/- 90 度。

注意

点击左侧工具栏中的“图像中的文本”链接以导航到“图像中的文本”页面。

要识别样本图像中的文本,你可以这样做:

  1. 在左侧的“使用自己的图像”面板下选择文本框

  2. 输入以下图像的 URL 以进行分析:https://images.unsplash.com/photo-1527174744973-fc9ce02c141d?w=800,你将看到以下图像:图 6.41:为图像中的文本提供的第一个样本图像。

    图 6.42:为图像中的文本提供的第一个样本图像。
  3. Rekognition 用边框包围检测到的文本,以便你可以识别它已识别的文本区域。你可以在结果部分看到文本提取的结果:图 6.42:为图像中的文本提供的第一个样本图像的结果。

    图 6.43:为图像中的文本提供的第一个样本图像的结果。
  4. 你可以看到,Rekognition 已经从图像中提取了文本,单词之间用分隔符|分隔,分别在不同的区域。

练习 25:从你的图像中提取文本

在这个练习中,你将从自己的图像中提取文本。我们为你提供了三张免费使用的图像:

注意

点击左侧工具栏中的“图像中的文本”链接以导航到图像中的文本页面。

  1. 将网址复制并粘贴或输入到页面底部“使用自己的图片”部分下的“使用图片 URL”文本框中:https://images.unsplash.com/photo-1521431974017-2521d1cdcd65?w=800,你将看到以下图片:图 6.43:为图像中的文本提供的第一张图片

    图 6.44:为图像中的文本提供的第一张图片
  2. 你可以看到围绕图像的边界框,这表示 Rekognition 已经识别出图像中的文本。结果可以在图像右侧的结果面板中查看:图 6.44:为图像中的文本提供的第一张图片的结果

    图 6.45:为图像中的文本提供的第一张图片的结果
  3. 下一张图片的网址如下。像之前一样,将其复制并粘贴或输入到“使用图片 URL”文本框中:https://images.unsplash.com/photo-1528481958642-cd4b4efb1ae1?w=800,你将看到以下图片:图 6.45:为图像中的文本提供的第二张图片。

    图 6.46:为图像中的文本提供的第二张图片。
  4. 你可以看到 Rekognition 已经识别出商店窗口中的主要文本:OCEAN GIFTS SPORTFISHING WHALE WATCHING

  5. 然而,它还在图像左侧模糊文本周围放置了一个矩形。当你查看结果时,你将在文本输出中看到额外的文本:图 6.46:为图像中的文本提供的第二张图片的结果

    图 6.47:为图像中的文本提供的第二张图片的结果
  6. 它已经从模糊文本中识别出ac,没有更多。这是你应该注意并留意在结果中的事情。Rekognition 可能会混淆并返回虚假的结果。

  7. 最后,将以下网址复制并粘贴或输入到“使用图片 URL”文本框中:https://images.unsplash.com/photo-1456668609474-b579f17cf693?w=800,你将看到以下图片:图 6.47:为图像中的文本提供的第三张图片。

    图 6.48:为图像中的文本提供的第三张图片。
  8. 这又是车牌的一个例子。然而,如果你仔细看,你可能会看到该服务不仅在车牌周围放置了边界框,还在汽车上部的格栅上的其他文本周围放置了边界框,它认为它能够识别。结果如下:图 6.48:为图像中的文本提供的第三张图片的结果。

    图 6.49:为图像中的文本提供的第三张图片的结果。
  9. 除了车牌文本外,它还识别了它所划定的区域中的文本“e”。再次强调,当依赖结果时,这是需要注意的事情,并且在这种情况下,手动验证过程显然是有益的。

    注意

    要参考详细步骤,请参阅本书末尾的附录 A,第 232 页。

摘要

在本章中,您学习了如何使用 Amazon Rekognition 服务的各种功能,并将其应用于图像。首先,您使用该服务识别图像中的物体和场景。接下来,您通过使用 Rekognition 识别图像中的不适当内容,来对可能含有不适当内容的图像进行审查。

您能够使用 Rekognition 分析面部,并且还能识别他们的性别、年龄范围、是否在微笑以及是否佩戴眼镜。

您还使用该服务识别名人及知名人士,并比较不同图像中的面部是否相同。最后,您能够提取图像中显示的文本。

这些类型的功能在几年前似乎是不可思议的。机器学习和人工智能的本质在于,最近、今天以及可预见的未来,计算机能够做到的事情取得了巨大的进步——AWS 将能够为您提供和您的应用程序这些服务!

附录 A

关于

本节包含的内容旨在帮助学生执行书中提到的活动。它包括学生需要执行的详细步骤,以完成并实现本书的目标。

第一章:Amazon Web Services 简介

活动一:使用 CLI 将数据导入和导出到 S3。

  1. 通过执行"aws s3 ls"来验证配置是否正确,以输出您的存储桶名称(存储桶名称将是唯一的):图 1.34:命令行

    图 1.34:命令行
  2. 执行"aws s3 ls "以输出存储桶中的文本文件pos_sentiment__leaves_of_grass.txt图 1.35:命令行

    图 1.35:命令行
  3. 使用以下命令创建一个新的 S3 存储桶(请注意:您的存储桶名称必须是唯一的。有关具体细节,请参阅 S3 "存储桶命名规则"):图 1.36:命令行

    图 1.36:命令行
  4. 在命令提示符中,导航到"neg_sentiment__dracula.txt"的位置。执行"aws s3 cp neg_sentiment__dracula.txt"以将文本文件导入到您的 S3 存储桶。图 1.37:命令行

    图 1.37:命令行
  5. 使用您的命令行导航到"peter_pan.txt"文件的位置。使用以下命令将文件"peter_pan.txt"导入到您的 S3 存储桶(在本例中命名为"aws-test-ml-and-ai-two"):图 1.38:命令行

    图 1.38:命令行
  6. 在命令行中导航到您的桌面。使用命令"mkdir s3_exported_files"创建一个名为"s3_exported_files"的新本地文件夹图 1.39:命令行

    图 1.39:命令行
  7. 接下来,使用"- -recursive"参数递归地从 S3 存储桶将两个文件("neg_sentiment__dracula.txt"和"peter_pan.txt")导出到您的本地目录。下面是命令执行的示例。图 1.40:命令行

    图 1.40:命令行
  8. 使用"dir"命令(见下文)验证对象是否已成功导出到您的本地文件夹:

图 1.8:输出

图 1.41:输出

活动二:测试 Amazon Comprehends API 功能。

在本节中,我们将学习如何使用 API 探索器中的部分文本文件输入来分析显示文本输出。我们将探索 API 的技能,通过确保输出符合项目所需格式来节省开发时间。因此,我们将测试 Comprehend 的文本分析功能。

我们将考虑一个例子,假设你是一位正在创建聊天机器人的企业家。你确定了一个商业主题和相应的文本文档,其中包含的内容可以使聊天机器人使你的业务成功。你的下一步是确定/验证 AWS 服务以解析文本文档进行情感、语言、关键词和实体的分析。在投入时间编写完整的程序之前,你希望通过 AWS 管理控制台的界面测试 AWS 服务的功能。为了确保它正确发生,你需要在网上搜索一篇文章(用英语或西班牙语撰写),其中包含你感兴趣的主题(体育、电影、时事等)。此外,AWS 管理控制台可通过根用户账户访问。

你知道探索 API 是一种节省开发时间的技能,通过确保输出符合你项目的期望格式。

  1. 在 AWS 服务搜索栏中点击以搜索服务名称。图 1.42: AWS 服务搜索

    图 1.42: AWS 服务搜索
  2. 搜索 Amazon Comprehend 选项并选择你将被引导的选项。开始屏幕。图 1.10: 选择服务

    图 1.43: 选择服务
  3. 您将被引导到 API 探索器。导航到主题建模和文档。中间是一个图形用户界面,用于探索 API,右侧提供文本输入的实时输出。图 1.44: API 探索器

    图 1.44: API 探索器
  4. 点击清除文本以清除所有默认服务。在新标签页中打开以下 URL www.gutenberg.org/cache/epub/1322/pg1322.txt图 1.45: API 探索器屏幕

    图 1.45: API 探索器屏幕
  5. 复制第一首诗,然后在资源管理器中粘贴并点击分析以查看输出图 1.46: 分析输出

    图 1.46: 分析输出
  6. 查看屏幕右侧的实体、关键词、语言,并向下滚动以查看情感。

图 1.47: 结果

图 1.47: 结果

你现在知道如何探索 API,以及如何显示相同的情感输出。

第二章:使用 NLP 概述文本文档

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

  1. 接下来,我们将上传 "test_s3trigger_configured.txt" 文件到我们的 S3 存储桶以验证 lambda s3_trigger 函数配置成功。

  2. 导航到 s3 页面:console.aws.amazon.com/s3/

  3. 点击你正在使用的存储桶名称以测试 s3_trigger 函数(在我的情况下:"aws-ml-s3-trigger")。图 2.37: S3 存储桶列表

    图 2.37: S3 存储桶列表
  4. 点击 上传。图 2.38: S3 存储桶列表上传屏幕

    图 2.38: S3 存储桶列表上传屏幕
  5. 将显示以下屏幕。图 2.39:S3 上传存储桶“添加文件”屏幕

    图 2.39:S3 上传存储桶“添加文件”屏幕。
  6. 点击添加文件。图 2.40:S3 添加文件选择屏幕

    图 2.40:S3 添加文件选择屏幕。
  7. 导航到"test_s3trigger_configured.txt"文件的位置。选择文件。

  8. 导航到文本文件的位置并打开文件。文件包含以下文本:

  9. "我是一个测试文件,用于验证 s3 触发器是否成功配置!"

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

    注意

    "test_s3trigger_configured.txt"可在以下 GitHub 仓库中找到:github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson2/topic_c/test_s3trigger_configured.txt

  11. 点击上传图 2.41:S3 文件添加到存储桶以进行 Lambda 触发器测试

    图 2.41:S3 文件添加到存储桶以进行 Lambda 触发器测试
  12. 返回到s3_trigger点击监控图 2.42:选择监控选项卡

    图 2.42:选择监控选项卡
  13. 点击在 CloudWatch 中查看日志。图 2.43:选择在 CloudWatch 中查看日志

    图 2.43:在 CloudWatch 中选择查看日志
  14. 点击日志流图 2.44:选择日志流

    图 2.44:选择日志流
  15. 选择文本旁边的圆形选项以展开输出:图 2.9:点击圆形选项以展开 lambda 输出

    图 2.9:点击圆形选项以展开 lambda 输出
  16. 下面是输出的前几行,要查看整个输出,您需要向下滚动以查看所有结果(见下文)。我们将在下一步解释总输出。图 2.45:s3_trigger 输出的顶部部分

    图 2.45:s3_trigger 输出的顶部部分
  17. Sentiment_response -> 被分类为 60.0%可能是正面

  18. 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}],

第三章:执行主题建模和主题提取

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

  1. 导航到以下链接以获取包含负面评论的文本数据文件github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/activity/localfoldernegative_movie_review_files/cv000_29416.txt

  2. 导航到 S3:s3.console.aws.amazon.com/s3/home

  3. 点击"input-for-topic-modeling"的存储桶。图 3.43:'input-for-topic-modeling'的 S3 主屏幕

    图 3.43:'input-for-topic-modeling'的 S3 主屏幕
  4. 点击创建文件夹。图 3.44:点击创建文件夹

    图 3.44:点击创建文件夹
  5. 输入"negative_movie_review_files",然后点击text_files_to_s3.py并将其粘贴到编辑器中。源代码可在以下 GitHub 仓库中找到:github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/activity/text_files_to_s3.py

  6. 首先,你将使用以下注释导入 os 和 boto3 包

    import os
    import boto3
    
  7. 接下来,输入你独特的存储桶名称。

    BUCKET_NAME = '<insert a unique bucket name>' 
    BUCKET_FOLDER = 'negative_movie_review_files/' 
    
  8. 接下来,获取文本文件的本地路径的工作目录:

    LOCAL_PATH = os.getcwd() +'\\local_folder__negative_movie_review_files\\'
    
  9. 创建所有文本文件的列表:

    text_files_list = [f for f in os.listdir(LOCAL_PATH) if f.endswith('.txt')]
    
  10. 遍历所有文件,并将每个文件上传到 s3:

    for filename in text_files_list:
        s3.upload_file(LOCAL_PATH + filename, BUCKET_NAME, BUCKET_FOLDER + filename)
    
  11. 接下来,在你的命令提示符中,导航到"activity__topic_modeling_on_documents"目录,并执行以下代码:python text_files_to_s3.py

  12. 结果是将 1000 个文本文件上传到 S3 的negative_movie_review_files文件夹。下面是 S3 的顶级输出(见下文):图 3.47:S3 中的 negative_movie_review_files

    图 3.47:S3 中的 negative_movie_review_files
  13. 接下来,导航到 AWS Comprehend。点击 comprehend 链接:console.aws.amazon.com/comprehend/home图 3.48:Amazon Comprehend 主屏幕

    图 3.48:Amazon Comprehend 主屏幕
  14. 现在,点击组织图 3.49:选择组织

    图 3.49:选择组织
  15. 现在,点击创建作业。图 3.50:点击创建作业

    图 3.50:点击创建作业
  16. 现在,在名称输入字段中输入"unknown_topic_structure_job"。图 3.51:输入'unknown_topic_strucutre_job'

    图 3.51:输入'unknown_topic_strucutre_job'
  17. 现在,滚动到选择输入数据部分,并点击搜索。图 3.52:选择搜索按钮

    图 3.52:选择搜索按钮
  18. 点击所选存储桶旁边的箭头以输入用于主题建模的文件(aws-ml-input-for-topic-modeling)。图 3.53:展开 S3 存储桶子文件夹

    图 3.53:展开 S3 存储桶子文件夹
  19. 点击“negative_movie_review_files”文件夹旁边的圆圈。图 3.54:选择 negative_movie_review_files 文件夹

    图 3.54:选择 negative_movie_review_files 文件夹
  20. 现在,点击选择以选择文件。图 3.55:点击选择按钮

    图 3.55:点击选择按钮
  21. 你将被重定向到 Amazon Comprehend 主页面。从输入格式下拉菜单中选择“每文件一个文档”选项。图 3.56:选择每文件一个文档选项

    图 3.56:选择每文件一个文档选项
  22. 接下来,在主题数量输入字段中输入 40。图 3.57:输入 40 个主题

    图 3.57:输入 40 个主题
  23. 滚动到选择输出位置,并点击搜索图 3.58:点击搜索

    图 3.58:点击搜索
  24. 选择为主题建模输出唯一命名的输出存储桶。图 3.59:选择用于主题建模输出的 S3 存储桶

    图 3.59:选择用于主题建模输出的 S3 存储桶
  25. 点击选择按钮。图 3.60:通过点击选择按钮确认

    图 3.60:通过点击选择按钮确认
  26. 点击下拉菜单并选择“AmazonComprehendServiceRole-myTopicModeingRole” IAM 角色。图 3.61:选择现有的 IAM 角色

    图 3.61:选择现有的 IAM 角色
  27. 点击创建作业按钮。图 3.62:点击创建作业

    图 3.62:点击创建作业
  28. 主题建模作业状态将首先显示“已提交”。图 3.63:状态‘已提交’

    图 3.63:状态‘已提交’
  29. 主题建模作业状态将随后显示“进行中”。主题建模作业持续时间约为 6 分钟。图 3.64:“进行中”状态

    图 3.64:“进行中”状态
  30. 当状态变为“完成。”时,点击“unknown_topic_structure_job”链接。图 3.65:选择超链接的主题建模链接

    图 3.65:选择超链接的主题建模链接
  31. 滚动并点击主题建模输出超链接(*你的将显示不同的唯一主题建模作业字母数字字符串)。图 3.66:点击主题建模输出 S3 位置

    图 3.66:点击主题建模输出 S3 位置
  32. 你将被导向主题建模作业的 S3 输出文件夹。点击超链接文件夹。图 3.67:超链接文件夹位置

    图 3.67:超链接文件夹位置
  33. 点击输出文件夹。图 3.68:点击输出

    图 3.68:点击输出
  34. 点击output.tar.gz文件。图 3.69:点击 output.tar.gz 文件

    图 3.69:点击 output.tar.gz 文件
  35. 点击下载为。图 3.70:点击下载为

    图 3.70:点击下载为
  36. 右键点击output.tar.gz文件,点击保存链接为…图 3.71:选择保存链接为...

    图 3.71:选择保存链接为...
  37. 选择桌面并点击保存。图 3.72:点击保存

    图 3.72:点击保存
  38. 导航到桌面。右键点击 output.tar.gz 文件,选择提取到此处。右键点击 output.tar 文件,选择提取到此处图 3.73:选择提取到此处

    图 3.73:选择提取到此处
  39. 结果是两个 CSV 文件:doc-topics.csvtopic-terms.csv。点击并下载主题建模输出。

    作为参考,提取的 CSV 文件可通过以下 GitHub 目录获取:

    github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/activity/SOLUTION__topic_modeling_output/doc-topics.csv

    github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/activity/SOLUTION__topic_modeling_output/topic-terms.csv

    注意

    对于这一步,你可以跟随练习并输入代码,或者从文件local_csv_to_s3_for_analysis.py中的源代码文件夹中获取它,并将其粘贴到编辑器中。为了参考,源代码可通过以下 GitHub 仓库获取:github.com/TrainingByPackt/Machine-Learning-with-AWS/blob/master/lesson3/activity/local_csv_to_s3_for_analysis.py

  40. 首先,我们将导入 boto3 库

    import boto3
    
  41. 接下来,导入 pandas 库

    import pandas as pd 
    
  42. 创建 S3 客户端对象。

    s3 = boto3.client('s3')
    
  43. 接下来,为存储源 CSV 文件创建一个唯一的 S3 存储桶名称。这里选择了"unknown-tm-analysis",但你需要创建一个唯一的名称。

    bucket_name = '<insert a unique bucket name>' #  
    
  44. 接下来,创建一个新的存储桶。

    s3.create_bucket(Bucket=bucket_name)
    
  45. 创建一个 CSV 文件名列表以导入。

    filenames_list = ['doc-topics.csv', 'topic-terms.csv']
    
  46. 遍历每个要上传到 S3 的文件

    for filename in filenames_list:
        s3.upload_file(filename, bucket_name, filename)
    
  47. 接下来,检查文件名是否为"doc-topics.csv"

        if filename == 'doc-topics.csv':
    
  48. 现在,获取doc-topics.csv文件对象并将其分配给'obj'变量。

    obj = s3.get_object(Bucket=bucket_name, Key=filename)
    
  49. 接下来,读取 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'])
    
  50. 在主题列上合并文件以获取每个文档的最常见术语。

    merged_df = pd.merge(doc_topics, topic_terms, on='topic')
    
  51. merged_df打印到控制台

    print(merged_df) 
    
  52. 接下来,在命令提示符中导航到 CSV 文件的位置,并使用以下命令执行代码:

    "python local_csv_to_s3_for_analysis.py"
    
  53. 控制台输出是一个合并的数据框,提供了文档名称及其相应的术语和术语的权重(见下文):

图 3.74:活动合并主题建模输出

图 3.74:活动合并主题建模输出

第四章:使用自然语言创建聊天机器人

活动 5:创建自定义机器人和配置机器人

  1. 如果你正在创建你的第一个机器人,请选择“开始”。否则,选择“机器人”,然后选择“创建”。

  2. 在“创建”你的 Lex 机器人 页面上,选择“自定义机器人”并提供以下信息:

    • 应用名称:PizzaOrderingBot

    • 输出语音:Salli

    • 会话超时:5 分钟。

    • 儿童导向:选择适当的响应。

  3. 选择“创建”。

  4. 控制台向 Amazon Lex 发送创建新机器人的请求。Amazon Lex 将机器人版本设置为 $LATEST。创建机器人后,Amazon Lex 显示机器人“编辑标签页”:图 4.50:编辑标签页

    图 4.50:编辑标签页
  5. 在 Amazon Lex 控制台中,选择“意图”旁边的加号(+),然后选择“创建”新意图。

  6. OrderPizza(),然后选择“添加”。

  7. 在左侧菜单中,选择“槽类型”旁边的加号(+)。在“添加槽类型”对话框中,添加以下内容:

    • 槽类型名称:饼皮

    • 描述 – 可用饼皮。

  8. 选择“限制到槽值和同义词”。

    • – 输入 thick。按 Tab 键,然后在“同义词”字段中输入 stuffed。选择加号(+)。输入 thin,然后再次选择加号(+)。

      对话应如下所示:

图 4.51:槽对话框

图 4.51:槽对话框
  1. 选择“添加槽到意图”。

  2. slotOnecrust 之间,将提示更改为“你想要什么类型的饼皮?”?

  3. 使用以下表中的值重复步骤 1 到 4:图 4.53:槽和提示的值

    图 4.53:槽和提示的值
  4. OrderPizza 配置页面上,按以下方式配置意图:

  5. 样例语句 – 输入以下字符串。大括号 {} 包含槽名称。

    • 我想要点披萨

    • 我想要点披萨

    • 我想要点一个 {pizzaKind} 披萨

    • 我想点一个 {size} {pizzaKind} 的披萨

    • 我想要一个 {size} {crust} 饼皮的 {pizzaKind} 披萨

    • 我可以点个披萨吗?

    • 我可以点一个 {pizzaKind} 披萨吗?

    • 我可以点一个 {size} {pizzaKind} 披萨吗?

  6. Lambda 初始化和验证 – 保持默认设置。

  7. 确认提示 – 保持默认设置。

  8. Lambda 函数

  9. 选择 PizzaOrderProcessor

  10. 如果 OrderPizza 意图权限调用 PizzaOrderProcessorLambda 函数。

  11. 不选择“”。

    意图应如下所示:

图 4.54:语句和槽编辑器

图 4.54:语句和槽编辑器
  1. 配置 PizzaOrderingBot 机器人的错误处理。

  2. 导航到 PizzaOrderingBot 机器人。选择“编辑”。然后选择“错误处理”。图 4.55:机器人编辑器

    图 4.55:机器人编辑器
  3. 使用“编辑”标签页来配置机器人错误处理。

    • 你在“澄清提示”中提供的信息映射到机器人的 clarificationPrompt 配置。

    • 当 Amazon Lex 无法确定用户意图时,该服务会返回包含以下信息的响应

    • 你在挂断短语中提供的信息映射到机器人的 abortStatement 配置。

    • 如果在连续请求一定次数后,服务无法确定用户的意图,Amazon Lex 会返回包含以下信息的响应。

  4. 保持默认设置。

  5. 要构建PizzaOrderingBot机器人,请选择构建

  6. Amazon Lex 为机器人构建机器学习模型。当你测试机器人时,控制台使用运行时 API 将用户输入发送回 Amazon Lex。然后,Amazon Lex 使用机器学习模型来解释用户输入。构建可能需要一些时间。

  7. 要测试机器人,在“测试机器人”窗口中,开始与你的 Amazon Lex 机器人进行交流。例如,你可能说或输入:图 4.56:测试机器人

    图 4.56:测试机器人
  8. 使用你在OrderPizza意图中配置的示例语句来测试机器人。例如,以下是你为PizzaOrder意图配置的示例语句之一:

I want a {size} {crust} crust {pizzaKind} pizza

要测试它,请输入以下内容:

I want a large thin crust cheese pizza

当你输入"I want to order a pizza"时,Amazon Lex 会检测到意图(OrderPizza)。然后,Amazon Lex 会请求槽位信息。在你提供所有槽位信息后,Amazon Lex 会调用你为该意图配置的 Lambda 函数。Lambda 函数向 Amazon Lex 返回一条消息("Okay, I have ordered your ..."),Amazon Lex 再将此消息返回给你。

检查响应

在聊天窗口下方有一个面板,允许你检查 Amazon Lex 的响应。面板提供有关你的机器人状态的全面信息,这些信息会随着你与机器人的交互而变化。

面板内容显示了操作的当前状态。

对话状态 – 与用户对话的当前状态。它可以是 ElicitIntent、ElicitSlot、ConfirmIntent 或 Fulfilled。

摘要 – 显示对话的简化视图,显示正在满足的意图的槽位值,以便你可以跟踪信息流。它显示了意图名称、槽位数量和已填充槽位数量,以及所有槽位及其相关值的列表。

图 4.57:摘要检查响应

图 4.57:摘要检查响应

详细 – 显示来自聊天机器人的原始 JSON 响应,以提供更深入的了解机器人交互和测试和调试聊天机器人时的对话当前状态。如果你在聊天窗口中输入,检查面板会显示来自PostText操作的 JSON 响应。如果你对聊天窗口说话,检查面板会显示来自PostContent操作的响应头。

图 4.58:详细检查响应

图 4.58:详细检查响应

第五章:使用语音与聊天机器人交互

活动 6:创建自定义机器人并将其与 Amazon Connect 连接

创建 Amazon Lex 机器人

创建一个自定义机器人来演示与 Amazon Connect 的 Press 或 Say 集成。机器人提示呼叫者按或说出一个与任务菜单选项匹配的数字以完成任务。在这种情况下,输入是检查他们的账户余额。

  1. 打开Amazon Lex 控制台

  2. 如果你正在创建你的第一个机器人,请选择开始。否则,选择机器人创建

  3. 创建您的 Lex 机器人页面,选择自定义机器人并提供以下信息:

    • 机器人名称 – 对于这个演示,将机器人命名为 AccountBalance。

    • 输出语音 – 选择机器人与呼叫者通话时使用的语音。Amazon Connect 的默认语音是 Joana。

    • 会话超时 – 选择机器人等待从呼叫者那里获取输入多长时间后结束会话。

    • COPPA – 选择机器人是否受儿童在线隐私保护法约束。

    • 用户语句存储 – 选择存储

  4. 选择创建

配置 Amazon Lex 机器人

通过提供意图、示例语句、输入槽位和错误处理来确定机器人如何响应客户。

  1. AccountLookup

  2. 创建另一个意图,并将其命名为SpeakToAgent

  3. AccountLookup意图。

  4. 添加一个示例语句,例如“检查我的账户余额”(不包括引号),然后选择+图标。

  5. 添加第二个语句,“”(不带引号),然后选择+图标。

    这将把“一”的语句或“1”的按键分配给 AccountLookup 意图。

图 5.29:示例语句

图 5.29:示例语句
  • 选择SpeakToAgent

  • 添加一个示例语句,例如“与代理通话”,然后选择+

  • 添加第二个语句,“”(不带引号),然后选择+图标。

  1. “请使用您的按键式电话键盘输入您的账户号码。”

  2. 确保已选中必需复选框,并选择+图标。

图 5.30:槽位添加

图 5.30:槽位添加
  1. AccountLookup意图。

  2. 响应部分,添加机器人对客户说的话。例如,“您的账户余额为$2,586.34。”

  3. 选择保存意图

  4. 对于 SpeakToAgent 意图,添加一条消息,让呼叫者知道他们的电话正在连接到代理。例如,“好的,很快就会有代理与您联系。”

  5. 选择保存意图

  6. 构建并测试 Amazon Lex 机器人

    在创建您的机器人后,在发布之前确保它按预期工作。

    • 要启用测试机器人窗口,请选择构建。这可能需要一分钟左右。

    • 当构建完成时,选择测试聊天机器人图 5.31:发布机器人

图 5.31:发布机器人
  • 测试聊天机器人面板中,在聊天窗口中输入消息。

  • 要测试 AccountLookup 意图,请输入“1”(不带引号),然后输入一个账户号码。

图 5.32:测试机器人

图 5.32:测试机器人
  • 要确认“SpeakToAgent”意图是否正常工作,请输入“2”(不带引号)。
  1. 发布 Amazon Lex 机器人并创建别名

    • 接下来,发布机器人以便您可以在 Amazon Connect 中的联系流程中添加它。

    • 选择发布

    • 为您的机器人提供一个别名。使用别名在联系流程中指定此版本的机器人,例如,博客。

    • 选择发布

图 5.33:发布机器人

图 5.33:发布机器人
  1. 将 Amazon Lex 机器人添加到 Amazon Connect 实例

    • 要在您的联系流程中使用机器人,请将机器人添加到您的 Amazon Connect 实例。您只能添加在同一个 AWS 账户和与您的实例相同的区域中创建的机器人。

    • 打开Amazon Connect 控制台

    • 选择要添加机器人的实例的“实例别名”。

    • 选择“联系流程”。

    • 在“Amazon Lex”下,选择AccountBalance机器人并选择“保存 Lex 机器人”。如果您在打开实例设置后发布了机器人,请重新加载页面以使其显示。

  2. 创建联系流程并添加您的 Amazon Lex 机器人

    接下来,创建一个新的联系流程,该流程使用您的 Amazon Lex 机器人。在创建联系流程时,您可以配置播放给呼叫者的消息。

    • 使用具有联系流程和 Amazon Lex 机器人权限的账户登录到您的 Amazon Connect 实例。

    • 选择路由联系流程创建联系流程,并输入名称。

    • 在“交互”下,将一个“获取客户输入”块拖到设计器中,并将其连接到“入口点”块。

    • 打开“获取客户输入”块,并选择“文本到语音(临时)”,输入文本。

    • 输入一条消息,为呼叫者提供有关他们可以做什么的信息。例如,使用与机器人中使用的意图相匹配的消息,例如“要检查您的账户余额,请按或说 1。要与代理交谈,请按或说 2。”

  3. 将 Amazon Lex 机器人添加到您的联系流程

    机器人被定义为获取客户输入的方法。

    • 在“获取客户输入”块中,选择“Amazon Lex”。

    • 对于“名称”,使用AccountBalance。对于“别名”,使用博客

    • 要指定意图,请在“意图”下选择“添加参数”。

    • 输入 AccountLookup,并选择“添加另一个参数”。

    • 输入 SpeakToAgent,然后选择保存。

  4. 完成联系流程

    • 在呼叫者与机器人交互后,完成联系流程以完成客户的呼叫。

    • 如果呼叫者按下 1 以获取其账户余额,请使用“提示”块播放消息并断开通话。

    • 如果呼叫者按下 2 以与代理交谈,请使用“设置队列”块来设置队列并将呼叫者转移到队列,从而结束联系流程。

    • 要完成“AccountLookup”意图:

    • 在“交互”下,将一个“播放提示”块拖到设计器中,并将“获取客户输入”块的“AccountLookup”节点连接到它。在客户从 Amazon Lex 机器人获取其账户余额后,“播放提示”块中的消息将播放。

    • 在“终止/转移”下,将一个“断开/挂断”块拖到设计器中,并将播放提示块连接到它。在播放提示信息后,通话将被断开。

    • 要完成“SpeakToAgent”意图:

    • 添加一个“设置队列”块并将其连接到“获取客户输入”块的SpeakToAgent节点。

    • 添加一个“转移到队列”块并将“设置队列”块的“成功”和“错误”节点连接到它。您还可以添加一条消息,当无法转移通话因为队列已满或发生错误时播放。

    • 选择保存发布

      您完成的接触流程看起来大致如下:

图 5.34:接触流程

图 5.34:接触流程
  1. 将接触流程分配给一个电话号码

    • 当呼叫者拨打到您的接触中心时,他们被发送的接触流程是分配给他们拨打的电话号码的。为了使新的接触流程生效,请将其分配给您的实例的电话号码。

    • 打开 Amazon Connect 仪表板。

    • 选择查看电话号码

    • 选择要分配接触流程的电话号码。

    • 添加一个描述。

    • 在“接触流程/IVR”菜单中,选择您刚刚创建的接触流程。

    • 选择保存

第六章:使用计算机视觉分析图像

活动 7:比较您自己的图像中的人脸

图 6.49:用于人脸比较的第一组提供的图像

图 6.49:用于人脸比较的第一组提供的图像
  1. Rekognition 能够以 98% 的置信度识别出人脸是同一个人,即使在不同角度、光照和眼镜位置下图 6.50:用于人脸比较的第一组提供的图像的结果

    图 6.50:用于人脸比较的第一组提供的图像的结果
  2. 第二组图像是:images.unsplash.com/photo-1526510747491-58f928ec870f?w=600images.unsplash.com/photo-1529946179074-87642f6204d7?w=600 .图 6.51:用于人脸比较的第二组提供的图像

    图 6.51:用于人脸比较的第二组提供的图像
  3. 再次,Rekognition 以 96% 的置信度识别出人脸,即使在不同角度下。

图 6.52:用于人脸比较的第二组提供的图像的结果

图 6.52:用于人脸比较的第二组提供的图像的结果
posted @ 2025-09-03 09:53  绝不原创的飞龙  阅读(17)  评论(0)    收藏  举报