亚马逊AWS官方博客

使用 Amazon Comprehend 构建自定义分类器

Original URL:https://amazonaws-china.com/blogs/machine-learning/building-a-custom-classifier-using-amazon-comprehend/

Amazon Comprehend 是一项使用机器学习 (ML) 在文本中发现见解和关系的自然语言处理 (NLP) 服务。Amazon Comprehend 可识别文本的语言;提取关键短语、地点、人物、品牌或事件;以及理解文本的正面或负面程度。有关 Amazon Comprehend 所有功能的更多信息,请参阅 Amazon Comprehend 功能

您可能需要贴合自身需求的开箱即用型 NLP 功能,而无须领导一个研究阶段。这使您能够识别实体类型并执行业务特有的文档分类,例如识别行业特定术语并将客户反馈分为不同的类别。

Amazon Comprehend 是这些用例的理想选择。2018 年 11 月,Amazon Comprehend 新增了识别自定义实体并执行自定义分类的训练功能。有关更多信息,请参阅在 AWS 上构建自己的自然语言模型(无需 ML 经验)

本博文演示了如何构建可为给定文本分配特定标签的自定义文本分类器。无需先前具备 ML 专业知识。

关于本博文
完成时间 对于精简数据集,需要 1 小时;对于完整数据集,需要 2 小时
完成费用 对于精简数据集,需要约 50 美元;对于完整数据集,需要约 150 美元
其中包括训练、推理和模型管理,有关更多详细信息,请参阅 Amazon Comprehend 定价
学习水平 高级 (300)
AWS 服务 Amazon Comprehend
Amazon S3
AWS Cloud9

先决条件

要完成此演练,您需要一个 AWS 账户并且有权在该账户的 AWS IAMAmazon S3、Amazon Comprehend 和 AWS Cloud9 中创建相关资源。

本博文使用由 Xiang Zhang 和 Yann LeCun 在论文从头开始理解文本中引用的 Yahoo 问答语料库。AWS 开放数据注册表中提供了此数据集。

您也可以使用自己的数据集。建议通过为每个标签使用最多 1,000 个训练文档来训练您的模型,并且在选择标签时,建议使用清晰且含义不重叠的标签。有关更多信息,请参阅训练自定义分类器

解决方案概览

该演练包含以下步骤:

  1. 准备您的环境
  2. 创建 S3 存储桶
  3. 设置 IAM
  4. 准备数据
  5. 训练自定义分类器
  6. 收集结果

有关如何构建自定义实体识别器以从文档中提取人员和组织名称、位置、时间表达式、数值等信息的更多信息,请参阅使用 Amazon Comprehend 构建自定义实体识别器

准备您的环境

在本博文中,您将会多次使用 AWS CLI 来加快实验速度。

AWS Cloud9 是一种基于云的集成开发环境 (IDE),允许您使用浏览器编写、运行和调试代码。其包括代码编辑器、调试程序和终端。AWS Cloud9 预先打包了适用于热门编程语言的基本工具,并且预装了 AWS CLI,因此您无需为此演练安装文件或配置笔记本电脑。

您的 AWS Cloud9 环境可以访问与登录到 AWS 管理控制台的用户相同的 AWS 资源。

要准备您的环境,请完成以下步骤:

  1. 在控制台的服务下,选择 AWS Cloud9
  2. 选择创建环境
  3. 对于名称,输入 CustomClassifier
  4. 选择下一步
  5. 环境设置下,将实例类型更改为 t2.large
  6. 将其他设置保留为默认设置。
  7. 选择下一步
  8. 检查环境设置,然后选择创建环境

您的环境可能需要几分钟的时间来准备。当环境准备就绪时,您的 IDE 将打开一个欢迎屏幕,其中包含终端提示符。

您可以在此提示符处运行 AWS CLI 命令,如同在本地计算机上一样。

  1. 要验证用户是否已登录,请输入以下命令:
Admin:~/environment $ aws sts get-caller-identity

您将获得以下指示账户和用户信息的输出:

{
    "Account": "123456789012",
    "UserId": "AKIAI53HQ7LSLEXAMPLE",
    "Arn": "arn:aws:iam::123456789012:user/Colin"
}
  1. 记录账户 ID,它将在下一步中被使用。

在整个演练过程中,始终在选项卡中打开 AWS Cloud9 IDE。

创建 S3 存储桶

使用在上一步中获得的帐户 ID 创建全局唯一的存储桶名称,例如 123456789012-comprehend。在 AWS Cloud9 终端提示符处输入以下命令:

Admin:~/environment $ aws s3api create-bucket --acl private --bucket '123456789012-comprehend' --region us-east-1

输出将显示您创建的存储桶的名称:

{
    "Location": "/123456789012-comprehend"
}

设置 IAM

要授予 Amazon Comprehend 在训练或推理期间执行存储桶读取和写入操作的权限,您必须授予 Amazon Comprehend 对创建的 S3 存储桶的访问权限。您将在账户中创建数据访问角色以信任 Amazon Comprehend 服务主体。

要设置 IAM,请完成以下步骤:

  1. 在控制台的服务下,选择 IAM
  2. 选择角色
  3. 选择创建角色
  4. 选择 AWS 服务作为受信任实体的类型。
  5. 选择 Comprehend 作为使用此角色的服务。
  6. 选择下一步: 权限

名为 ComprehendDataAccessRolePolicy 已自动附加。

  1. 选择下一步: 审核
  2. 对于角色名称,请输入 ComprehendBucketAccessRole
  3. 选择创建角色
  4. 记录角色 ARN

在启动自定义分类器的训练时,您需要使用此 ARN。

准备数据

在此步骤中,您需要下载语料库并准备数据,以匹配 Amazon Comprehend 期望的训练和推理格式。本博文提供了一个脚本来帮助您完成数据集的数据准备。

或者,为了更方便起见,您也可以通过输入以下两个命令行来下载准备好的数据:

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/comprehend-test.csv

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/comprehend-train.csv

如果按照前面的步骤操作,请跳过后续步骤,并直接转到本节末尾的上传部分。

如果想要完成本演练的数据集准备,或者要使用自己的数据,请执行后续步骤:

在 AWS Cloud9 终端提示符处输入以下命令,以从 AWS 开放数据注册表中下载它:

Admin:~/environment $ aws s3 cp s3://fast-ai-nlp/yahoo_answers_csv.tgz

您将看到一个进度条和以下输出:

download: s3://fast-ai-nlp/yahoo_answers_csv.tgz to ./yahoo_answers_csv.tgz

使用以下命令进行解压缩:

Admin:~/environment $ tar xvzf yahoo_answers_csv.tgz

由于您在 AWS Cloud9 环境中的可用空间有限,因此可以删除存档。使用以下命令:

Admin:~/environment $ rm -f yahoo_answers_csv.tgz

您将看到一个文件夹 yahoo_answers_csv,其中包含以下四个文件:

  • classes.txt
  • readme.txt
  • test.csv
  • train.csv

文件 train.csv 和 test.csv 包含采用逗号分隔值格式的训练示例。其中包含四列,分别对应于类索引(1 到 10)、问题标题、问题内容和最佳答案。文本字段使用双引号 (“) 进行转义,而任何内部双引号则使用两个双引号 (“”) 进行转义。新行使用反斜杠后跟“n”字符进行转义,即“\n”。

以下代码是文件内容的概述:

“5”,”why doesn’t an optical mouse work on a glass table?”,”or even on some surfaces?”,”Optical mice use an LED

“6”,”What is the best off-road motorcycle trail ?”,”long-distance trail throughout CA”,”i hear that the mojave

“3”,”What is Trans Fat? How to reduce that?”,”I heard that tras fat is bad for the body.  Why is that? Where ca

“7”,”How many planes Fedex has?”,”I heard that it is the largest airline in the world”,”according to the www.fe

“7”,”In the san francisco bay area, does it make sense to rent or buy ?”,”the prices of rent and the price of b

文件 classes.txt 包含可用的标签。

train.csv 文件包含 1,400,000 行,而 test.csv 则包含 60,000 行。Amazon Comprehend 使用所提交的 10–20% 的训练文档来测试自定义分类器。

以下命令指示数据呈均匀分布:

Admin:~/environment $ awk -F '","' '{print $1}'  yahoo_answers_csv/train.csv | sort | uniq -c

您应该通过为每个标签使用最多 1,000 个训练文档来训练您的模型,而最多不超过 1,000,000 个文档。

在 1,000,000 个文档中有 20% 用于测试,因此仍有大量数据可以训练您的自定义分类器。

可以使用精简版本的 train.csv 来训练您的自定义 Amazon Comprehend 模型,并使用 test.csv 进行验证并查看自定义模型的性能如何。

为进行训练,文件格式必须符合以下要求:

  • 文件必须在每行中包含一个标签和一个文本,共2 列
  • 无标题行
  • 格式为 UTF-8,换行符为“\n”。

标签必须大写,可以是多字段,可以有空格,由下划线或连字符连接的多个单词组成,甚至可以包含逗号(只要可以正确转义)。

下表包含建议用于训练的格式化标签。

索引

原始

用于训练

1

Society & Culture

SOCIETY_AND_CULTURE

2

Science & Mathematics

SCIENCE_AND_MATHEMATICS

3

Health

HEALTH

4

Education & Reference

EDUCATION_AND_REFERENCE

5

Computers & Internet

COMPUTERS_AND_INTERNET

6

Sports

SPORTS

7

Business & Finance

BUSINESS_AND_FINANCE

8

Entertainment & Music

ENTERTAINMENT_AND_MUSIC

9

Family & Relationships

FAMILY_AND_RELATIONSHIPS

10

Politics & Government

POLITICS_AND_GOVERNMENT

如果您希望自定义 Amazon Comprehend 模型以异步方式确定与给定文本对应的标签,则文件格式必须符合以下要求:

  • 文件必须在每行中包含一个文本
  • 无标题行
  • 格式为 UTF-8,换行符为“\n”。

本博文包含用于加快数据准备速度的脚本。输入以下命令以将脚本复制到本地 AWS Cloud9 环境:

Admin:~/environment $ aws s3 cp s3://aws-ml-blog/artifacts/comprehend-custom-classification/prepare_data.py

要启动数据准备,请输入以下命令:

Admin:~/environment $ sudo pip-3.6 install pandas tqdm
Admin:~/environment $ python3 prepare_data.py

此脚本与Yahoo 语料库绑定,并使用 pandas 库来格式化训练和测试数据集,以满足 Amazon Comprehend 的期望。您可以根据自己的数据集进行调整,或者更改训练数据集和验证数据集中的条目数。

该脚本执行完成后(对于完整数据集,它应在 t2.large 实例上运行大约 11 分钟,而对于精简数据集则不到 5 分钟),您的环境中将包含以下新文件:

  • comprehend-train.csv
  • comprehend-test.csv

使用以下命令将准备好的数据(下载的数据或准备好的数据)上传到您创建的存储桶:

Admin:~/environment $ aws s3 cp comprehend-train.csv s3://123456789012-comprehend/

Admin:~/environment $ aws s3 cp comprehend-test.csv s3://123456789012-comprehend/

训练自定义分类器

您已经准备好启动自定义文本分类器训练。输入以下命令,并将角色 ARN 和存储桶名称替换为您自己的名称:

Admin:~/environment $ aws comprehend create-document-classifier –document-classifier-name “yahoo-answers” –data-access-role-arn arn:aws:iam::123456789012:role/ComprehendBucketAccessRole –input-data-config S3Uri=s3://123456789012-comprehend/comprehend-train.csv –output-data-config S3Uri=s3://123456789012-comprehend/TrainingOutput/ –language-code en

您将获得以下输出,它将自定义分类器 ARN 命名为:

{
    "DocumentClassifierArn": "arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers"
}

这是一个异步调用。可以使用以下命令跟踪训练进度:

Admin:~/environment $ aws comprehend describe-document-classifier --document-classifier-arn arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers

您将获得以下输出:

{
    "DocumentClassifierProperties": {
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "Status": "TRAINING",
        "LanguageCode": "en",
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole",
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-train.csv"
        },
        "SubmitTime": 1571657958.503,
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/TrainingOutput/123456789012-CLR-b205910479f3a195124bea9b70c4e2a9/output/output.tar.gz"
        }
    }
}

训练完成后,您将获得以下输出:

{
    "DocumentClassifierProperties": {
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "Status": "TRAINED",
        "LanguageCode": "en",
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole",
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-train.csv"
        },
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/TrainingOutput/123456789012-CLR-b205910479f3a195124bea9b70c4e2a9/output/output.tar.gz"
        },
        "SubmitTime": 1571657958.503,
        "EndTime": 1571661250.482,
        "TrainingStartTime": 1571658140.277
        "TrainingEndTime": 1571661207.915,
        "ClassifierMetadata": {
            "NumberOfLabels": 10,
            "NumberOfTrainedDocuments": 989873,
            "NumberOfTestDocuments": 10000,
            "EvaluationMetrics": {
                "Accuracy": 0.7235,
                "Precision": 0.722,
                "Recall": 0.7235,
                "F1Score": 0.7219
            }
        },
    }
}

训练持续时间可能有所不同;在本例中,对于完整数据集,训练时间大约为一小时(对于精简数据集,训练时间为 20 分钟)。

对完整数据集执行的训练输出显示,您的模型的召回率为 0.72 — 换句话说,它正确识别了 72% 的给定标签。

以下屏幕截图显示了控制台的视图(Comprehend > 自定义分类 > yahoo-answers)。

收集结果

现在,您可以启动推理作业以测试分类器的性能。输入以下命令:

Admin:~/environment $ aws comprehend start-document-classification-job --document-classifier-arn arn:aws:comprehend:us-east-1:123456789012:document-classifier/yahoo-answers --input-data-config S3Uri=s3://123456789012-comprehend/comprehend-test.csv,InputFormat=ONE_DOC_PER_LINE --output-data-config S3Uri=s3://123456789012-comprehend/InferenceOutput/ --data-access-role-arn arn:aws:iam::123456789012:role/ComprehendBucketAccessRole

您将获得以下输出:

{
    "JobStatus": "SUBMITTED",
    "JobId": "cd5a6ee7f490a353e33f50d866d0317a"
}

与您为跟踪训练进度所执行的操作一样,由于推理是异步的,也可以使用以下命令检查新作业的进度:

Admin:~/environment $ aws comprehend describe-document-classification-job --job-id cd5a6ee7f490a353e33f50d866d0317a

您将获得以下输出:

{
    "DocumentClassificationJobProperties": {
        "InputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/comprehend-test.csv",
            "InputFormat": "ONE_DOC_PER_LINE"
        },
        "DataAccessRoleArn": "arn:aws:iam:: 123456789012:role/ComprehendBucketAccessRole",
        "DocumentClassifierArn": "arn:aws:comprehend:us-east-1: 123456789012:document-classifier/yahoo-answers",
        "JobStatus": "IN_PROGRESS",
        "JobId": "cd5a6ee7f490a353e33f50d866d0317a",
        "SubmitTime": 1571663022.503,
        "OutputDataConfig": {
            "S3Uri": "s3://123456789012-comprehend/InferenceOutput/123456789012-CLN-cd5a6ee7f490a353e33f50d866d0317a/output/output.tar.gz"
        }
    }
}

完成后,JobStatus 状态将更改为COMPLETED。这大约需要几分钟的时间来完成。

通过以下命令使用 OutputDataConfig.S3Uri 路径下载结果:

Admin:~/environment $ aws s3 cp s3://123456789012-comprehend/InferenceOutput/123456789012-CLN-cd5a6ee7f490a353e33f50d866d0317a/output/output.tar.gz。

解压缩输出 (tar xvzf output.tar.gz) 后,您将看到一个 .jsonl 文件。每一行都代表已提交文档对应行的请求分类结果。

例如,以下代码是其中一行预测结果:

{"File": "comprehend-test.csv", "Line": "9", "Classes": [{"Name": "ENTERTAINMENT_AND_MUSIC", "Score": 0.9685}, {"Name": "EDUCATION_AND_REFERENCE", "Score": 0.0159}, {"Name": "BUSINESS_AND_FINANCE", "Score": 0.0102}]}

这表示您的自定义模型以 96.8% 的置信度得分预测以下文本与“Entertainment and music”标签相关。

“What was the first Disney animated character to appear in color? \n Donald Duck was the first major Disney character to appear in color, in his debut cartoon, \”The Wise Little Hen\” in 1934.\n\nFYI: Mickey Mouse made his color debut in the 1935 ‘toon, \”The Band Concert,\” and the first color ‘toon from Disney was \”Flowers and Trees,\” in 1932.”

每行结果还提供第二个和第三个可能的标签。您可以使用这些不同的得分来构建您的应用程序,应用每个得分超过 40% 的标签,或者在没有一个得分超过 70% 的情况下更改模型。

小结

使用完整数据集进行训练和验证,在不到两个小时的时间内,您使用 Amazon Comprehend 学习了 10 个自定义类别 — 在测试中获得了 72% 的召回率,并将该自定义模型应用于 60,000 个文档。

您可以立即在 Amazon Comprehend 控制台试用自定义类别。有关更多信息,请参阅自定义分类。除了分类功能以外,您还可以从其他 AWS 博文中了解其他 Amazon Comprehend 功能,并获得有关如何使用 Amazon Comprehend 的灵感。

Amazon Comprehend 可以帮助您通过 NLP 功能快速为您的应用程序提供支持。实验愉快!


关于作者

Hervé Nivon 是一名解决方案架构师,致力于帮助初创公司客户在 AWS 上发展业务。在加入 AWS 之前,Hervé 是一家公司的首席技术官,该公司通过商用无人机图像为企业提供业务见解。Hervé 还曾在埃森哲咨询公司担任顾问一职。