之前,咱们曾有篇文章介绍了中文命名实体辨认(Named Entity Recognition,NER)方面的艰难,以及 Amazon SageMaker 的解决之道。感兴趣的童鞋欢送点击这里温习一下:相比英文,中文命名实体的辨认难在哪?又该如何解决。
本文,咱们打算谈谈 NER 模型自身在构建方面可能遇到的艰难。
命名实体辨认(NER)的外围,在于筛选文本数据以查找名词短语(即命名实体),并应用人、组织或品牌等标签对其进行分类。例如,在「我最近订阅了 Amazon Prime」这句话中,Amazon Prime 就是一项命名实体,能够归类为品牌。但构建精确的外部自定义实体识别器往往非常复杂,须要筹备大量手动正文的训练文档,同时抉择正确的算法与参数以实现模型训练。
本文探讨了如何通过一条端到端管道,应用 Amazon SageMaker Ground Truth 与 Amazon Comprehend 构建起一套自定义 NER 模型。
Amazon SageMaker Ground Truth 能够帮忙咱们高效、精确地标记训练机器学习零碎所必须的数据集。Ground Truth 提供内置标记工作流,帮忙人类标记员逐渐实现数据正文工作。此外,Ground Truth 还蕴含多种工具,可能高效精确构建带正文 NER 数据集以实现机器学习零碎训练。
Amazon Comprehend 是一项自然语言解决(NLP)服务,应用机器学习查找文本中的洞见与关系。Amazon Comprehend 可能解决任何 UTF- 8 格局的文本文件。通过辨认文件中的实体、要害短语、语言、情感以及其余常见元素,Comprehend 即可胜利汇总出剖析洞见。要应用这项自定义实体辨认采取行动,咱们须要筹备一套用于模型训练的数据集,保障其中蕴含一组带有正文的文档或实体列表及其类型标签(例如 PERSON,人),外加一组用于包容各实体的文档。以此为根底,Comprehend 即可自动测试算法与参数的最佳与最精确组合,进而实现模型训练。
下图所示,为这套解决方案的根本架构。
整个端到端流程如下所示:
1. 将一组文本文件上传至 Amazon Simple Storage Service (Amazon S3)。
2. 在 Ground Truth 中创立一个外部工作组与 NER 标记作业。
3. 该外部工作组负责对所有文本文档进行标记。
4. 实现之后,Ground Truth 在 Amazon S3 中创立名为 manifest 的加强清单。
5. 解析加强输入 manifest 文件,并以 CSV 格局创立正文与文档文件,而后将其交付至 Amazon Comprehend 以供解决。咱们次要关注用于主动转换加强输入 manifest 文件的管道,此管道可通过 AWS CloudFormation 实现一键式部署。此外,咱们还将展现如何应用 Amazon Comprehend GitHub repo 提供的 onvertGroundtruthToComprehendERFormat.sh 脚本解析该加强输入 manifest 文件,并以 CSV 格局创立正文与文档文件。尽管大家在理论应用中往往只须要一种转换方法,但咱们强烈建议尝试这两种办法。
6. 在 Amazon Comprehend 管制台上,启动一项自定义 NER 训练作业,且应用由 AWS Lambda 生成的数据集。
为了尽可能缩短本文示例中用于手动正文方面的工夫,倡议间接应用随附的小型语料库示例。尽管由此训练出的模型可能性能无限,但能够借此疾速体验整个端到端流程,积攒到后续应用更大语料库的实践经验,甚至能够应用其余 AWS 服务代替 Lambda 函数。
设置流程
大家须要在计算机上安装 AWS 命令行界面(AWS CLI)。对于具体操作阐明,请参阅装置 AWS CLI。
接下来须要创立一个 CloudFormation 栈,该栈负责创立 S3 存储桶与转换管道。尽管这条管道能够主动实现转换,但大家也能够间接应用转换脚本,具体操作阐明咱们将在后文中进行介绍。
设置转换管道
本文提供一套 CloudFormation 模板,可帮忙大家执行多项初始设置工作:
- 创立一个新的 S3 存储桶。
- 应用 Python 3.8 运行时创立一项 Lambda 函数,以及用于实现其余依赖关系的 Lambda 层。
- 配置 S3 存储桶,依据接管到的 output.manifest 文件主动触发该 Lambda 函数。
管道源代码托管在 GitHub repo 当中。要通过模板进行部署,请在新的浏览器窗口或选项卡中登录至 us-east- 1 区域中的 AWS 账户。
启动以下栈:
实现以下操作步骤:
1. 在 Amazon S3 URL 局部,输出该模板的 URL。
2. 抉择 Next。
3. 在 Stack name 局部,输出栈名称。
4. 在 S3 Bucket Name 局部,为新存储桶输出名称。
5. 其余参数间接应用默认值。
6. 抉择 Next。
7. 在 Configure stack options 页面中,抉择 Next。
8. 审查栈细节信息。
9. 勾选三个复选框,确认由 AWS CloudFormation 创立其余资源与性能。
10. 抉择 Create stack。
CloudFormation 当初将开始创立咱们的栈。在实现之后,大家应看到以下截屏内容。
设置转换脚本
要在计算机上设置转换脚本,请实现以下操作步骤:
1. 在计算机上下载并装置 Git。
2. 指定您在本地设施上保留该 Repo 的具体位置。倡议创立一个专用文件夹,借此轻松应用命令提示符导航至该地位。
3. 在浏览器中,导航至 Amazon Comprehend GitHub repo。
4. 在 Contributors 局部,抉择 Clone or download。
5. 在 Clone with HTTPS 局部,抉择剪贴板图标以复制 repo URL。
要应用 SSH 密钥克隆该 Repo,包含由组织内 SSH 证书颁发机构颁发的证书,请抉择 Use SHH 并抉择剪贴板图、将 Repo URL 复制至剪贴板。
6. 在终端内,导航至之前保留克隆 Repo 的地位。咱们能够间接输出 $ cd _<directory>_返回该地位。
7. 输出以下代码:
`$ git clone <repo-url>`
在 Repo 克隆操作实现之后,依据 README 文件中的步骤应用脚本将 Ground Truth NER 标记作业与 Amazon Comprehend 自定义实体辨认集成起来。
将未标记样本上传至语料库
运行以下命令,将样本数据文件复制至 S3 存储桶:
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/groundtruth/doc-00.txt s3://<your-bucket>/raw/
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/groundtruth/doc-01.txt s3://<your-bucket>/raw/
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/groundtruth/doc-02.txt s3://<your-bucket>/raw/
这批样本数据能够缩短正文工夫,因为不谋求模型性能最大化,因而无需进行深度优化。
运行 NER 标记作业
此步骤波及三项手动操作:
1. 创立一个外部工作组。
2. 创立一项标记作业。
3. 进行数据正文。
咱们能够在不同作业中重复使用这个外部工作组。
在作业实现之后,它会将后果写出为一个 output.manifest
文件,并由 Lambda 函数主动进行内容提取。该函数会将此 manifest 文件转换为两个文件:.csv 格局与.txt 格局。假如输入 manifest 为 s3://_<your-bucket>_/gt/_<gt-jobname>_/manifests/output/output.manifes
t,则这两个 Amazon Comprehend 文件将位于s3://_<your-bucket>_/gt/_<gt-jobname>_/manifests/output/comprehend/
之下。
创立一个外部工作组
在本用例中,咱们将创立一个外部工作组,并应用本人的电子邮件地址作为惟一工作人员。Ground Truth 也容许咱们应用 Amazon Mechanical Turk 或其余供应商提供的正文人员。
1. 在 Amazon SageMaker 控制台的 Ground Truth 之下,抉择 Labeling workforces。
2. 在 Private 选项卡中,抉择 Create private team。
3. 在 Team name 局部,输出工作组名称。
4. 在 Add workers 局部,抉择 Invite new workers by email。
5. 在 Email addresses 局部,输出电子邮件地址。
6. 在 Organization name 局部,输出组织名称。
7. 在 Contact email 局部,输出电子邮件。
8. 抉择 Create private team。
9. 返回新的外部工作组,找到标记门户的 URL。
如果这是第一次被增加至工作组内,或者设置了 Amazon Simple Notification Service (Amazon SNS)告诉性能,咱们还将收到蕴含 URL、用户名以及长期明码的注册电子邮件。
10. 登录至标记 URL。
11. 将长期明码更换为新密码。
创立一项标记作业
下一步就是创立 NER 标记作业。本文将重点介绍其中的各关键步骤。对于更多详细信息,请参阅应用 Amazon SageMaker Ground Truth 增加数据标记工作流以进行命名实体辨认。
为了缩短正文工夫,这里请间接应用复制至 S3 存储桶内的示例语料库作为 Ground Truth 作业的输出。
1. 在 Amazon SageMaker 控制台的 Ground Truth 之下,抉择 Labeling jobs。
2. 抉择 Create labeling job。
3. 在 Job name 局部,输出一项作业名称。
4. 抉择 I want to specify a label attribute name different from the labeling job name。
5. 在 Label attribute name 局部,输出 ner。
6. 抉择 Create manifest file。
通过这一步,Ground Truth 将主动把文本语料库转换为 manifest 文件,并会显示一个弹窗。
7. 在 Input dataset location 局部,输出 Amazon S3 地位。
8. 在 Data type 局部,抉择 Text。
9. 抉择 Create。
这时咱们会看到提示信息称 manifest 文件曾经创立实现。
10. 在 manifest 文件创建实现后,抉择 Create。
咱们也能够本人提供输出 manifest。请留神,NER 标记作业要求其输出 manifest 为 {"source": "embedded text"} 格局
,而非援用款式中的{"source-ref": "s3://bucket/prefix/file-01.txt"}
格局。另外,生成的输出 manifest 会自动检测到换行符 n,并在各个文档中的每一行生成一条 JSON 行;如果自行生成此行,则可在各文档中只保留一个 JSON 行(但可能仍须要保留 n 换行符以供上游应用)。
11. 在 IAM role 局部,抉择 CloudFormation 模板此前创立的角色。
12. 在 Task selection 局部,抉择 Named entity recognition。
13. 抉择 Next。
14. 在 Select workers and configure tool 页面中的 Worker types 局部,抉择 Private。
15. 在 Private teams 局部,抉择之前创立实现的外部工作组。
16. 在 Number of workers per dataset object 局部,保障工作人员的数量(1)与外部工作组的理论规模相匹配。
17. 在文本框中,输出标记操作方法。
18. 在 Labels 下增加心愿应用的标签。参考以下截屏中为举荐语料库提供的标签。
19. 抉择 Create。
在作业创立实现后,当初咱们能够在 Labeling jobs 页面上跟踪各项标记工作的具体状态。
以下截屏所示,为该作业的详细信息。
标记数据
应用本示例中的举荐语料库,标记流程将在数分钟内实现。
在作业创立结束后,外部工作组将通过标记门户查看列出的工作,并依据具体调配的工作内容进行数据标记。
以下截屏所示,为工作人员 UI。
在全副标记工作实现之后,标记作业状态将显示为 Completed。
复核
CloudFormation 模板将对示例中的 S3 存储桶进行配置,在蕴含 manifests/output/output.manifest 前缀的新对象传入特定 S3 存储桶时向 Amazon S3 提交一项指向 Lambda 函数 put 事件。最近,AWS 还为标记作业增加了 Amazon CloudWatch Events 反对性能,咱们能够将其作为触发转换操作的另一种机制选项。对于更多详细信息,请参阅 Amazon SageMaker Ground Truth 现已反对多标签图像与文本分类、以及 Amazon CloudWatch Events。
该 Lambda 函数会加载加强 manifest 文件,并将该文件转换为 comprehend/output.csv 与 comprehend/output.txt,且二者皆具备与 output.manifest 雷同的前缀。请参考以下示例中的
s3://_<your_bucket>_/gt/_<gt-jobname>_/manifests/output/output.manifest 后果:s3://<your_bucket>/gt-output/<gt-jobname>/manifests/output/comprehend/output.csv
s3://<your_bucket>/gt-output/<gt-jobname>/manifests/output/comprehend/output.txt
咱们能够通过查看 Lambda 函数增加至 output.manifest 的标签,在 CloudWatch Logs 中进一步跟踪 Lambda 的执行上下文。此项操作可在 Amazon S3 控制台或 AWS CLI 中实现。
要通过 Amazon S3 控制台进行跟踪,请实现以下操作步骤:
1. 在 Amazon S3 管制台上,导航至该输入后果。
2. 抉择 output.manifest。
3. 在 Properties 选项卡中,抉择 Tags。
4. 查看由该 Lambda 函数增加的标签。
要应用 AWS CLI,请输出以下代码(其中日志流标签__LATEST_xxx 代表 CloudWatch 日志流 [$LATEST]xxx。因为[$] 不是 Amazon S3 标签中的无效字符,因而会被 Lambda 函数替换掉):
$ aws s3api get-object-tagging --bucket gtner-blog --key gt/test-gtner-blog-004/manifests/output/output.manifest
{
"TagSet": [
{
"Key": "lambda_log_stream",
"Value": "2020/02/25/__LATEST_24497900b44f43b982adfe2fb1a4fbe6"
},
{
"Key": "lambda_req_id",
"Value": "08af8228-794e-42d1-aa2b-37c00499bbca"
},
{
"Key": "lambda_log_group",
"Value": "/aws/lambda/samtest-ConllFunction-RRQ698841RYB"
}
]
}
当初,咱们能够返回 CloudWatch 控制台并跟踪理论日志分组、日志流与 RequestId,详见以下截屏内容。
在 Amazon Comprehend 上训练一套自定义 NER 模型
Amazon Comprehend 要求输出语料库遵循各实体的以下最低要求:
- 1000 个样本
- 语料库大小为 5120 字节
- 蕴含 200 条正文
这里,咱们在 Ground Truth 中应用的示例语料库无奈满足上述最低要求。因而,咱们为大家筹备了其余预生成的 Amazon Comprehend 输出。此样本数据将帮忙大家疾速开始训练自定义模型,但并未针对模型性能做出充沛优化。
在咱们的计算机上,输出以下代码将之前生成的数据上传至存储桶:
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/comprehend/output-x112.txt s3://<your_bucket>/gt/<gt-jobname>/manifests/output/comprehend/documents/
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/comprehend/output-x112.csv s3://<your_bucket>/gt/<gt-jobname>/manifests/output/comprehend/annotations/
咱们的 s3://_<your_bucket>_/gt/_<gt-jobname>_/manifests/output/comprehend/documents/ 文件夹应以两个文件结尾:output.txt 与 output-x112.txt。
咱们的 s3://_<your_bucket>_/gt/_<gt-jobname>_/manifests/output/comprehend/annotations/
文件夹应该蕴含 output.csv
与output-x112.csv
。
当初,大家能够开始自定义 NER 模型的训练流程了。
1. 在 Amazon Comprehend 控制台的 Customization 下,抉择 Custom entity recognition。
2. 抉择 Train recognizer。
3. 在 Recognizer name 局部,输出一个名称。
4. 在 Custom entity type 局部,输出标签。
请保障自定义实体类型与咱们在 Ground Truth 作业中应用的类型相匹配。
5. 在 Training type 局部,抉择 Using annotations and training docs。
6. 为正文与训练文档输出 Amazon S3 地位。
7. 在 IAM role 局部,如果这是第一次应用 Amazon Comprehend,请抉择 Create an IAM role。
8. 在 Permissions to access 局部,请抉择 Input and output (if specified) S3 bucket。
9. 在 Name suffix 局部,输出一个后缀。
10. 抉择 Train。
至此,咱们能够查看列出的识别器了。
以下截屏所示,为训练实现后的视图,整个过程最多可能须要 1 个小时。
资源清理
在实现本轮演练之后,请通过以下步骤清理资源:
1. 清空 S3 存储桶(或者间接删除该存储桶)。
2. 终止 CloudFormation 栈。
论断
到这里,大家曾经理解如何应用 Ground Truth 以构建 NER 训练数据集,以及如何将生成的加强 manifest 文件主动转换为 Amazon Comprehend 可能间接解决的格局。