之前,我们曾有篇文章介绍了中文命名实体识别(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。
设置转换脚本
要在计算机上设置转换脚本,请完成以下操作步骤:
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 _
7.输入以下代码:
`$ git clone `
在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:///raw/
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/groundtruth/doc-01.txt s3:///raw/
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/groundtruth/doc-02.txt s3:///raw/
这批样本数据可以缩短注释时间,由于不追求模型性能最大化,因此无需进行深度优化。
运行NER标记作业
此步骤涉及三项手动操作:
1.创建一个内部工作组。
2.创建一项标记作业。
3.进行数据注释。
我们可以在不同作业中重复使用这个内部工作组。
在作业完成之后,它会将结果写出为一个output.manifest
文件,并由Lambda函数自动进行内容提取。该函数会将此manifest文件转换为两个文件:.csv格式与.txt格式。假设输出manifest为s3://_
t,则这两个Amazon Comprehend文件将位于s3://_
之下。
创建一个内部工作组
在本用例中,我们将创建一个内部工作组,并使用自己的电子邮件地址作为唯一工作人员。Ground Truth也允许我们使用Amazon Mechanical Turk或其他供应商提供的注释人员。
1.在Amazon SageMaker控制台的Ground Truth之下,选择Labeling workforces。
2.在Private选项卡中,选择Create private team。
创建一项标记作业
下一步就是创建NER标记作业。本文将重点介绍其中的各关键步骤。关于更多详细信息,请参阅使用Amazon SageMaker Ground Truth添加数据标记工作流以进行命名实体识别。
为了缩短注释时间,这里请直接使用复制至S3存储桶内的示例语料库作为Ground Truth作业的输入。
1.在Amazon SageMaker控制台的Ground Truth之下,选择Labeling jobs。
2.选择Create labeling job。
标记数据
使用本示例中的推荐语料库,标记流程将在数分钟内完成。
在作业创建完毕后,内部工作组将通过标记门户查看列出的任务,并根据具体分配的工作内容进行数据标记。
复核
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://__/gt/__/manifests/output/output.manifest结果:
s3:///gt-output//manifests/output/comprehend/output.csv
s3:///gt-output//manifests/output/comprehend/output.txt
我们可以通过检查Lambda 函数添加至output.manifest的标签,在CloudWatch Logs中进一步跟踪Lambda的执行上下文。此项操作可在Amazon S3控制台或AWS CLI中实现。
要通过Amazon S3控制台进行跟踪,请完成以下操作步骤:
1.在Amazon S3控制台上,导航至该输出结果。
2.选择output.manifest。
要使用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:///gt//manifests/output/comprehend/documents/
$ aws s3 cp s3://aws-ml-blog/artifacts/blog-groundtruth-comprehend-ner/sample-data/comprehend/output-x112.csv s3:///gt//manifests/output/comprehend/annotations/
我们的s3://_
我们的s3://_
文件夹应该包含output.csv
与output-x112.csv
。
现在,大家可以开始自定义NER模型的训练流程了。
1.在Amazon Comprehend控制台的Customization下,选择Custom entity recognition。
2.选择Train recognizer。
资源清理
在完成本轮演练之后,请通过以下步骤清理资源:
1.清空S3存储桶(或者直接删除该存储桶)。
2.终止CloudFormation栈。
结论
到这里,大家已经了解如何使用Ground Truth以构建NER训练数据集,以及如何将生成的增强manifest文件自动转换为Amazon Comprehend能够直接处理的格式。