首页 人工智能平台 PAI 实践教程 通用方案 通用文本打标解决方案

通用文本打标解决方案

更新时间: 2023-10-31 17:34:12

随着UGC等用户生成内容不断涌现,对从文本提取标签用于细粒度分析的需求不断涌现,PAI提供了通用文本打标解决方案。本文为您介绍如何基于人工智能算法,快速构建符合业务场景的文本打标模型和算法,助力您快速从文本中识别各种类型的文本标签,服务于下游推荐或其他应用场景。

背景信息

诸多生产内容的场景(例如评论、博客、商品介绍)中都包含大量具有丰富语义的标签,对理解文本语义、精确建模用户兴趣和需求有重要作用。针对该问题,阿里云机器学习PAI借助人工智能算法,提出了如下解决方案,帮助您快速抽取文本蕴含的标签。

  • 解决方案

  1. 基于iTAG平台和PAI数据集管理,对目标场景的文本进行快捷标注和样本管理。

  2. 基于PAI提供的文本打标模型和算法,针对自己的文本打标场景,在可视化建模平台Designer上进行模型Fine-Tune,从而构建具体场景的NLP文本打标模型。

  3. 基于PAI提供,或者用户自行Fine-Tune的文本打标模型,在可视化建模平台Designer上进行批量离线推理。

  4. 将模型进行EAS在线部署,形成完整的端到端流程,从而自动抽取文本中的各种标签。

  • 方案架构

通用文本打标解决方案的架构图如下所示。

image.png

前提条件

  • 已开通PAI(Designer、DSW、EAS)后付费,详情请参见开通

  • 已开通工作空间,并添加MaxCompute计算资源,详情请参见创建工作空间

  • 已开通MaxCompute,用于存储预测数据。关于如何开通MaxCompute,请参见通过查询编辑器使用MaxCompute

  • 已创建OSS存储空间(Bucket),用于存储原始数据、标签列表文件及训练获得的模型文件。关于如何创建存储空间,请参见创建存储空间

  • 已创建EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,请参见创建资源组

操作流程

基于阿里云机器学习PAI平台,构建文本打标解决方案的流程如下:

  1. 准备数据

基于iTAG进行原始数据标注,然后将获得的训练集和测试集上传到数据仓库MaxCompute中,用于后续的模型训练。

  1. 构建文本NER模型

在可视化建模平台Designer中,基于海量大数据语料预训练获得的NLP预训练模型,构建文本NER模型。

  1. 构建文本细粒度标签分类模型

在可视化建模平台Designer中,基于海量大数据语料预训练获得的NLP预训练模型,构建文本细粒度标签分类模型。

  1. 离线批量预测

在可视化建模平台Designer中,对海量用户产生的文本数据进行离线批量文本打标。

  1. 部署及调用模型服务

通过模型在线服务EAS,您可以将训练好的文本打标模型部署为在线服务,并在实际的生产环境中调用,从而进行推理。

准备数据

首先基于iTAG进行原始数据标注,然后将获得的训练集和测试集上传到数据仓库MaxCompute中,用于后续的模型训练。在文本打标解决方案中,支持训练文本NER模型和文本细粒度标签分类模型,您可以根据实际需求,训练需要的模型,得到定制化的文本打标结果,您也可以使用PAI默认提供的模型直接进行预测,在这种情况下,您无需准备数据。

根据您的定制化需求,需要准备的数据如下:

定制模块

需要准备的数据

数据格式示例

关键词抽取-关键词

自定义的词表

user_dict.txt

NER-人名、地名、机构等

文本NER模型的训练集和测试集

ner_train.csv

ner_dev.csv

文本细粒度分类-文本主题

文本细粒度分类模型的训练集和测试集

cate_train.csv

cate_dev.csv

自定义文本标签体系

sample_category.json

数据准备的步骤如下:

  1. 根据格式要求,准备数据。

    1. 如果您需要在关键词抽取模块中使用自定义的词表,则需要进行数据准备,并将数据存放在OSS目录下。

      示例请参见user_dict.txt,其中,文件的每一行都是一个关键词。

    2. 如果您需要定制NER或文本细粒度分类模型,需要准备对应的训练集和测试集。

    3. 将原始数据分为训练集和测试集,分别按照iTAG的标注数据格式,生成.manifest格式的数据集。文件格式请参见textDemo.manifest

  2. 创建数据集。

    在PAI的数据集管理模块,通过本地上传方式将准备好的.manifest数据集上传,详情请参见创建数据集

  3. 创建打标任务并完成打标任务处理。

    1. 通过iTAG管理员控制台,创建标注任务,详情请参见创建标注任务

    2. 通过iTAG标注员控制台,进行数据标注,详情请参见标注图像(打标,质检及验收)

  4. 获取并处理打标结果。

    1. 智能标注(iTAG)页面的任务中心页签,单击标注完成的任务操作列下的获取标注结果,得到存放在指定OSS目录下的标注结果数据集。

    2. 将获得的标注结果数据集转换为模型构建需要的训练集和测试集的CSV格式数据表。

      1. 文本NER模型的示例训练集请参见ner_train.csv,示例测试集请参见ner_dev.csv

      2. 文本细粒度标签分类模型的示例训练集请参见cate_train.csv,示例测试集请参见cate_dev.csv

        说明

        您只需要标注二级类目即可。

  5. 通过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';
  6. 如果您需要训练文本细粒度标签分类模型,您还需要准备对应的文本标签体系sample_category.json,并存放在OSS目录下。

    文本标签体系由两层概念类目组成,分别为一级类目和二级类目,一级类目更加抽象,二级类目更加具体。这一文本标签体系组织成JSON格式,如下所示。

    {
        "翻唱": "音乐",
        "手办": "二次元", 
        "火锅": "美食"
    }

构建文本NER模型

  1. 登录PAI控制台

  2. 在Designer页面创建一个空白工作流,分别拖入以下组件,并根据下文的组件参数配置组件。

    创建工作流即组件配置的操作请参见创建及管理工作流image.png

    区域

    描述

    配置实验的训练数据集,即配置读数据表组件的表名参数为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

构建文本细粒度标签分类模型

  1. 登录PAI控制台

  2. 在Designer页面创建一个空白工作流,分别拖入以下组件,并根据下文的组件参数配置组件。

    创建工作流即组件配置的操作请参见创建及管理工作流image.png

    区域

    描述

    配置实验的训练数据集,即配置读数据表组件的表名参数为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

离线批量预测

  1. 准备并上传待打标文件。

    1. 将需要打标的文本转换为CSV格式数据表,示例测试集请参见test.csv

    2. 通过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;
  2. 在Designer页面创建一个空白工作流,分别拖入以下组件,并根据下文的组件参数配置组件。

    创建工作流即组件配置的操作请参见创建及管理工作流image.png

    区域

    描述

    配置实验的测试数据集,即配置读数据表组件的表名参数为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

  3. 预测完成后查看输出表。输出表的Schema比输入表增加以下列。

    • keyword:如果选择执行关键词抽取,在此列中显示关键词抽取结果。

    • default_ner:如果选择执行默认实体识别,在此列中显示使用PAI默认的NER模型识别实体的结果。

    • user_ner:如果填写用户自定义NER模型路径,在此列中显示使用自定义NER模型识别实体的结果。

    • default_text_label:如果选择执行默认细粒度标签预测,在此列中显示使用PAI默认的细粒度标签预测模型的预测结果。

    • user_text_label:如果填写用户自定义标签预测模型路径和用户自定义标签配置,在此列中显示使用自定义的细粒度标签预测模型的预测结果。

部署及调用模型服务

通过模型在线服务EAS,您可以将训练好的文本NER和文本标签分类模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践,具体操作步骤如下。

  1. 进入PAI-EAS 模型在线服务页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署 > 模型在线服务(EAS),进入PAI-EAS 模型在线服务页面。

  2. 部署模型服务。

    1. 推理服务页签,单击部署服务

    2. 部署服务页面,配置参数。

      • 如果您需要部署文本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路径,您可以直接在控制台模型服务信息区域修改该参数。

    3. 单击部署,等待一段时间即可完成模型部署。

  3. 调试模型服务。

    1. PAI-EAS 模型在线服务页面,单击目标服务操作列下的在线调试

    2. 在调试页面的在线调试请求参数区域的Body处填写如下内容。

      {
          "id": "文本id",
          "first_sequence": "需要预测的文本内容",
          "sequence_length": 128
      }
    3. 单击发送请求,即可在调试信息区域查看预测结果,如下图所示。image

  4. 查看模型服务的公网地址和访问Token。

    1. PAI-EAS 模型在线服务页面,单击目标服务服务方式列下的调用信息

    2. 调用信息对话框的公网地址调用页签,查看公网调用的访问地址和Token

  5. 使用脚本进行批量调用。

    1. 创建调用模型服务的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")
    2. eas_predict.py的Python脚本上传至您的任意环境,并在脚本上传后的当前目录执行如下调用命令。

      python3 <eas_predict.py>

      其中<eas_predict.py>需要替换为实际的Python脚本名称。

  6. 监控服务指标。调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。

    1. PAI-EAS 模型在线服务页面,单击已调用服务服务监控列下的图标。

    2. 服务监控页签,即可查看模型调用的指标水位。从下面的服务监控水位图中可以看到,本案例部署的模型时延在100ms左右。您自己的模型时延以实际为准。image.png

阿里云首页 人工智能平台 PAI 相关技术圈