通用文本打标解决方案
随着UGC等用户生成内容不断涌现,对从文本提取标签用于细粒度分析的需求不断涌现,PAI提供了通用文本打标解决方案。本文为您介绍如何基于人工智能算法,快速构建符合业务场景的文本打标模型和算法,助力您快速从文本中识别各种类型的文本标签,服务于下游推荐或其他应用场景。
背景信息
诸多生产内容的场景(例如评论、博客、商品介绍)中都包含大量具有丰富语义的标签,对理解文本语义、精确建模用户兴趣和需求有重要作用。针对该问题,阿里云机器学习PAI借助人工智能算法,提出了如下解决方案,帮助您快速抽取文本蕴含的标签。
解决方案
基于iTAG平台和PAI数据集管理,对目标场景的文本进行快捷标注和样本管理。
基于PAI提供的文本打标模型和算法,针对自己的文本打标场景,在可视化建模平台Designer上进行模型Fine-Tune,从而构建具体场景的NLP文本打标模型。
基于PAI提供,或者用户自行Fine-Tune的文本打标模型,在可视化建模平台Designer上进行批量离线推理。
将模型进行EAS在线部署,形成完整的端到端流程,从而自动抽取文本中的各种标签。
方案架构
通用文本打标解决方案的架构图如下所示。

前提条件
已开通PAI(Designer、DSW、EAS)后付费,详情请参见开通。
已开通工作空间,并添加MaxCompute计算资源,详情请参见创建工作空间。
已开通MaxCompute,用于存储预测数据。关于如何开通MaxCompute,请参见通过查询编辑器使用MaxCompute。
已创建OSS存储空间(Bucket),用于存储原始数据、标签列表文件及训练获得的模型文件。关于如何创建存储空间,请参见创建存储空间。
已创建EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,请参见创建资源组。
操作流程
基于阿里云机器学习PAI平台,构建文本打标解决方案的流程如下:
基于iTAG进行原始数据标注,然后将获得的训练集和测试集上传到数据仓库MaxCompute中,用于后续的模型训练。
在可视化建模平台Designer中,基于海量大数据语料预训练获得的NLP预训练模型,构建文本NER模型。
在可视化建模平台Designer中,基于海量大数据语料预训练获得的NLP预训练模型,构建文本细粒度标签分类模型。
在可视化建模平台Designer中,对海量用户产生的文本数据进行离线批量文本打标。
通过模型在线服务EAS,您可以将训练好的文本打标模型部署为在线服务,并在实际的生产环境中调用,从而进行推理。
准备数据
首先基于iTAG进行原始数据标注,然后将获得的训练集和测试集上传到数据仓库MaxCompute中,用于后续的模型训练。在文本打标解决方案中,支持训练文本NER模型和文本细粒度标签分类模型,您可以根据实际需求,训练需要的模型,得到定制化的文本打标结果,您也可以使用PAI默认提供的模型直接进行预测,在这种情况下,您无需准备数据。
根据您的定制化需求,需要准备的数据如下:
定制模块 | 需要准备的数据 | 数据格式示例 |
关键词抽取-关键词 | 自定义的词表 | |
NER-人名、地名、机构等 | 文本NER模型的训练集和测试集 | |
文本细粒度分类-文本主题 | 文本细粒度分类模型的训练集和测试集 | |
自定义文本标签体系 |
数据准备的步骤如下:
根据格式要求,准备数据。
如果您需要在关键词抽取模块中使用自定义的词表,则需要进行数据准备,并将数据存放在OSS目录下。
示例请参见user_dict.txt,其中,文件的每一行都是一个关键词。
如果您需要定制NER或文本细粒度分类模型,需要准备对应的训练集和测试集。
将原始数据分为训练集和测试集,分别按照iTAG的标注数据格式,生成.manifest格式的数据集。文件格式请参见textDemo.manifest。
创建数据集。
在PAI的数据集管理模块,通过本地上传方式将准备好的.manifest数据集上传,详情请参见创建数据集。
创建打标任务并完成打标任务处理。
通过iTAG管理员控制台,创建标注任务,详情请参见创建标注任务。
通过iTAG标注员控制台,进行数据标注,详情请参见标注图像(打标,质检及验收)。
获取并处理打标结果。
在智能标注(iTAG)页面的任务中心页签,单击标注完成的任务操作列下的获取标注结果,得到存放在指定OSS目录下的标注结果数据集。
将获得的标注结果数据集转换为模型构建需要的训练集和测试集的CSV格式数据表。
文本NER模型的示例训练集请参见ner_train.csv,示例测试集请参见ner_dev.csv。
文本细粒度标签分类模型的示例训练集请参见cate_train.csv,示例测试集请参见cate_dev.csv
说明您只需要标注二级类目即可。
通过MaxCompute客户端的Tunnel命令将训练数据集和测试数据集上传至MaxCompute。
关于MaxCompute客户端的安装及配置请参见MaxCompute客户端(odpscmd),关于Tunnel命令详情请参见Tunnel命令。
本案例使用的示例命令如下所示。
# NER建表语句。 CREATE TABLE nlp_ner_train(content STRING, label STRING); CREATE TABLE nlp_ner_dev(content STRING, label STRING); # NER上传语句。 tunnel upload /Users/xxx/xxx/ner_train.csv nlp_ner_train -fd '\t'; tunnel upload /Users/xxx/xxx/ner_dev.csv nlp_ner_dev -fd '\t'; # 细粒度标签分类建表语句。 CREATE TABLE nlp_cate_train(content STRING, label STRING); CREATE TABLE nlp_cate_dev(content STRING, label STRING); # 细粒度标签分类上传语句。 tunnel upload /Users/xxx/xxx/cate_train.csv nlp_cate_train -fd '\t'; tunnel upload /Users/xxx/xxx/cate_dev.csv nlp_cate_dev -fd '\t';
如果您需要训练文本细粒度标签分类模型,您还需要准备对应的文本标签体系sample_category.json,并存放在OSS目录下。
文本标签体系由两层概念类目组成,分别为一级类目和二级类目,一级类目更加抽象,二级类目更加具体。这一文本标签体系组织成JSON格式,如下所示。
{ "翻唱": "音乐", "手办": "二次元", "火锅": "美食" }
构建文本NER模型
登录PAI控制台。
在Designer页面创建一个空白工作流,分别拖入以下组件,并根据下文的组件参数配置组件。
创建工作流即组件配置的操作请参见创建及管理工作流。
区域
描述
①
配置实验的训练数据集,即配置读数据表组件的表名参数为MaxCompute的训练表。例如nlp_ner_train。
②
配置实验的评估数据集,即配置读数据表组件的表名参数为MaxCompute的评估表。例如nlp_ner_dev。
③
配置序列标注模型训练的参数。序列标注训练组件的配置详情请参见下文的表 1。
表1. 序列标注组件的配置
页签
参数
描述
本案例使用的示例值
字段设置
文本列选择
进行序列标注的内容在输入表中对应的列名。
content
标签列选择
标签在输入表中对应的列名。
label
标签枚举值
标签列内容的枚举值,多个值之间使用半角逗号(,)分隔。
B-LOC,B-ORG,B-PER,I-LOC,I-ORG,I-PER,O
样本权重列
特定列样本的数据增强,非必选。
无需填写
模型存储路径
训练得到的模型的OSS存储路径。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/text_mark/ner_model/
参数设置
优化器选择
优化器的类型,支持以下取值:
adam
adagrad
lamb
adam
batchSize
训练过程中的批处理大小。如果使用多机多卡,则表示每个GPU上的批处理大小。
32
sequenceLength
序列整体最大长度,取值范围为1~512。
64
numEpochs
训练总Epoch的数量。
1
学习率
模型构建过程中的学习率。
1e-5
pretrainModelNameOrPath
选择使用的预训练语言模型。
pai-bert-base-zh
模型额外参数
用户自定义参数,您无需填写。
执行调优
指定Worker数
分布式服务器的数量,默认值表示1个Worker。
1
指定Worker的CPU卡数
每个Worker下的GPU卡数量。
1
指定Worker的GPU卡数
每个Worker下的CPU卡数量。
1
分布式策略
分布式策略,支持以下取值:
MirroredStrategy:单机多卡。
ExascaleStrategy:多机多卡。
MirroredStrategy
构建文本细粒度标签分类模型
登录PAI控制台。
在Designer页面创建一个空白工作流,分别拖入以下组件,并根据下文的组件参数配置组件。
创建工作流即组件配置的操作请参见创建及管理工作流。
区域
描述
④
配置实验的训练数据集,即配置读数据表组件的表名参数为MaxCompute的训练表。例如nlp_cate_train。
⑤
配置实验的评估数据集,即配置读数据表组件的表名参数为MaxCompute的评估表。例如nlp_cate_dev。
⑥
配置文本分类模型训练的参数。文本分类训练组件的配置详情请参见下文的表 2。
表2. 文本分类组件的配置
页签
参数
描述
本案例使用的示例值
字段设置
文本列选择
进行文本分类的内容在输入表中对应的列名。
content
标签列选择
标签在输入表中对应的列名。
label
标签枚举值
标签列内容的枚举值,多个值之间使用半角逗号(,)分隔。
翻唱,手办,火锅
样本权重列
特定列样本的数据增强,非必选。
无需填写
模型存储路径
训练得到的模型的OSS存储路径。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/text_mark/cate_model/
参数设置
优化器选择
优化器的类型,支持以下取值:
adam
adagrad
lamb
adam
batchSize
训练过程中的批处理大小。如果使用多机多卡,则表示每个GPU上的批处理大小。
32
sequenceLength
序列整体最大长度,取值范围为1~512。
64
numEpochs
训练总Epoch的数量。
1
学习率
模型构建过程中的学习率。
1e-5
pretrainModelNameOrPath
选择使用的预训练语言模型。
pai-bert-base-zh
模型额外参数
用户自定义参数,可以配置是否训练多标签分类模型multi_label,
支持以下取值:
True
False
在本解决方案中,必须填写为True。
multi_label=True
执行调优
指定Worker数
分布式服务器的数量,默认值表示1个Worker。
1
指定Worker的CPU卡数
每个Worker下的GPU卡数量。
1
指定Worker的GPU卡数
每个Worker下的CPU卡数量。
1
分布式策略
分布式策略,支持以下取值:
MirroredStrategy:单机多卡。
ExascaleStrategy:多机多卡。
MirroredStrategy
离线批量预测
准备并上传待打标文件。
将需要打标的文本转换为CSV格式数据表,示例测试集请参见test.csv。
通过MaxCompute客户端的Tunnel命令将训练数据集和测试数据集上传至MaxCompute。
关于MaxCompute客户端的安装及配置请参见MaxCompute客户端(odpscmd),关于Tunnel命令详情请参见Tunnel命令。本案例使用的示例命令如下所示。
# 建表语句。 CREATE TABLE nlp_text_test(content STRING); # 上传语句。 tunnel upload /Users/xxx/xxx/test.csv nlp_text_test;
在Designer页面创建一个空白工作流,分别拖入以下组件,并根据下文的组件参数配置组件。
创建工作流即组件配置的操作请参见创建及管理工作流。
区域
描述
⑦
配置实验的测试数据集,即配置读数据表组件的表名参数为MaxCompute的训练表。例如nlp_text_test。
⑧
配置文本打标预测的参数。文本打标预测组件的配置详情请参见下文的表 3。
⑨
配置实验的测试输出数据表,即配置写数据表组件的表名参数为MaxCompute的输出表。例如nlp_text_test_out。
表3. 文本打标预测组件的配置
页签
参数
描述
本案例使用的示例值
参数设置
Buckets
填写用户模型和其他配置文件所在的OSS Buckets。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/
文本列序号
填写需要打标的文本在输入表的列序号(从0开始)。
0
是否执行默认实体识别
是否使用PAI默认的模型进行实体识别,支持以下取值:
True
False
True
是否执行关键词抽取
是否开启关键词抽取功能,支持以下取值:
True
False
True
是否执行默认细粒度标签预测
是否使用PAI默认的模型进行细粒度标签预测,支持以下取值:
True
False
True
用户自定义NER模型路径
用户自定义NER模型的OSS路径。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/text_mark/ner_model/deployment/
用户自定义关键词字典
用户自定义关键词字典的OSS路径。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/text_mark/cate_model/deployment/user_dict.txt
关键词抽取参数Alpha
关键词抽取参数Alpha取值在0-1之间,用于平衡TFIDF和TextRank这两个关键词抽取算法的权重。
0.5
抽取关键词数
算法抽取关键词数量上限。
10
用户自定义标签预测模型路径
用户自定义标签预测模型路径的OSS路径。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/text_mark/cate_model/deployment/
用户自定义标签配置
用户自定义标签配置的OSS路径。
oss://easynlp-sh.oss-cn-shanghai-internal.aliyuncs.com/text_mark/cate_model/deployment/sample_category.json
标签预测阈值
标签预测阈值取值在0-1之间,当某标签预测概率大于该阈值则进行输出。
0.5
是否输出根节点
是否输出预测的二级类目对应的一级类目,
支持以下取值:
True
False
False
执行调优
Worker数量
分布式服务器的数量,默认值表示1个Worker。
1
Batch Size
每个Batch的大小。
16
Sequence Length
文本序列长度。
128
预测完成后查看输出表。输出表的Schema比输入表增加以下列。
keyword:如果选择执行关键词抽取,在此列中显示关键词抽取结果。
default_ner:如果选择执行默认实体识别,在此列中显示使用PAI默认的NER模型识别实体的结果。
user_ner:如果填写用户自定义NER模型路径,在此列中显示使用自定义NER模型识别实体的结果。
default_text_label:如果选择执行默认细粒度标签预测,在此列中显示使用PAI默认的细粒度标签预测模型的预测结果。
user_text_label:如果填写用户自定义标签预测模型路径和用户自定义标签配置,在此列中显示使用自定义的细粒度标签预测模型的预测结果。
部署及调用模型服务
通过模型在线服务EAS,您可以将训练好的文本NER和文本标签分类模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践,具体操作步骤如下。
进入PAI-EAS 模型在线服务页面。
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择 ,进入PAI-EAS 模型在线服务页面。
部署模型服务。
在推理服务页签,单击部署服务。
在部署服务页面,配置参数。
如果您需要部署文本NER模型,模型配置示例参数如下。
{ "metadata": { "instance": 1 }, "model_config": { "type": "sequence_labeling_bert" }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c4g1.xlarge" } }, "processor": "easytransfer_gpu", "model_path": "文本NER模型路径", "name": "您的服务名称" }
如果您需要部署文本标签模型,模型配置示例参数如下。
{ "metadata": { "instance": 1 }, "model_config": { "type": "text_classify_bert" }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c4g1.xlarge" } }, "processor": "easytransfer_gpu", "model_path": "文本标签分类模型路径", "name": "您的服务名称" }
您可以将以上JSON文件内容粘贴到对应配置编辑下的文本框中。其中:
name:需要替换为您自己的服务名称,您可以直接在控制台模型服务信息区域修改该参数。
model_path:需要替换为模型配置参数配置的OSS Bucket路径,您可以直接在控制台模型服务信息区域修改该参数。
单击部署,等待一段时间即可完成模型部署。
调试模型服务。
在PAI-EAS 模型在线服务页面,单击目标服务操作列下的在线调试。
在调试页面的在线调试请求参数区域的Body处填写如下内容。
{ "id": "文本id", "first_sequence": "需要预测的文本内容", "sequence_length": 128 }
单击发送请求,即可在调试信息区域查看预测结果,如下图所示。
查看模型服务的公网地址和访问Token。
在PAI-EAS 模型在线服务页面,单击目标服务服务方式列下的调用信息。
在调用信息对话框的公网地址调用页签,查看公网调用的访问地址和Token。
使用脚本进行批量调用。
创建调用模型服务的Python脚本eas_predict.py。
#!/usr/bin/env python #encoding=utf-8 from eas_prediction import PredictClient from eas_prediction import StringRequest if __name__ == '__main__': #下面的client = PredictClient()入参需要替换为实际的访问地址。 client = PredictClient('http://1664xxxxxxxxxxx.cn-hangzhou.pai-eas.aliyuncs.com', 'eas_predict') #下面的Token需要替换为实际值。 client.set_token('MTgxNjE1NGVmMDdjNDRkY2Q5NWE4xxxxxxxxxxxxxxxxxxxxxxx') client.init() #输入请求需要根据模型进行构造,此处仅以字符串作为输入输出的程序为例。 request = StringRequest('{"id": "文本id","first_sequence": "需要预测的文本内容","sequence_length": 128}') for x in range(0, 50000): resp = client.predict(request) # print(str(resp.response_data, 'utf8')) print("test ending")
将eas_predict.py的Python脚本上传至您的任意环境,并在脚本上传后的当前目录执行如下调用命令。
python3 <eas_predict.py>
其中<eas_predict.py>需要替换为实际的Python脚本名称。
监控服务指标。调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。
在PAI-EAS 模型在线服务页面,单击已调用服务服务监控列下的
图标。
在服务监控页签,即可查看模型调用的指标水位。从下面的服务监控水位图中可以看到,本案例部署的模型时延在100ms左右。您自己的模型时延以实际为准。