资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

情感分析任务

简介

  • 相比于通用预训练中主要关注事实型文本(如新闻、百科 等),情感分析更侧重于分析主观型文本中蕴涵的情感和观点,因此有必要专门面向情感分析研发情感预训练模型。
  • 为此,我们提出了基于情感知识增强的情感预训练算法 SKEP。此算法采用无监督方法自动挖掘情感知识,然后利用情感知识构建预训练目标,从而让机器学会理解情感语义。该方法被NLP会议ACL 2020收录,论文地址SKEP: Sentiment Knowledge Enhanced Pre-training for Sentiment Analysis。
  • 具体来说,我们基于ERNIE模型应用SKEP方法再次预训练,对模型进行进一步提升并将预训练模型提供到文心中供大家使用。

环境安装

详见:快速使用-> 环境安装

目录结构

情感分析任务位于wenxin_appzoo/tasks/sentiment_analysis

├── data        ## 示例数据文件夹,包括各任务所需训练集、测试集、验证集和预测集 
│   ├── dev_data
│   │   └── part1.txt
│   ├── download_data.sh   ## 全量的开源数据集下载脚本
│   ├── predict_data
│   │   └── infer.txt
│   ├── test_data
│   │   └── part1.txt
│   └── train_data
│       └── part1.txt
├── examples
│   ├── cls_ernie_fc_ch_infer.json    ## 对fine tune之后的模型进行预测的配置文件 
│   └── cls_ernie_fc_ch.json    ## 对ERNIE-2.0-base进行fine tune训练的配置文件
├── inference
│   ├── custom_inference.py
│   └── __init__.py
├── __init__.py
├── model
│   ├── ernie_fc_classification.py
│   └── __init__.py
├── run_infer.py
├── run_trainer.py
└── trainer
    ├── custom_dynamic_trainer.py
    ├── custom_trainer.py
    └── __init__.py

准备工作

  • 下载ERNIE-2.0-Base预训练模型

    # 在wenxin_appzoo/models_hub/目录下下载管理ERNIE-Sentiment-1.0预训练模型,下载成功会看到名为ernie_sentiment_1.0_ch的目录,里面存放了ERNIE-Sentiment-1.0预训练模型对应的参数文件。
    # 进入到 models_hub目录
    cd  wenxin_appzoo/models_hub/
    # 执行下载脚本
    sh download_ernie_sentiment_1.0_ch.sh
  • 准备数据:由于使用ERNIE系列模型进行fine tune,所以不需要用户自己切词和提供词表文件。

    • 训练集、测试集和验证集的数据格式相同,如下所示。数据分为两列,列与列之间用\t进行分隔。第一列为文本,第二列为标签。

      房间太小。其他的都一般。。。。。。。。。         0
      我看过朋友的还可以,但是我订的书迟迟未到已有半个月,都没有收到打电话也没有用,以后你们订书一定要考虑好!当当实在是太慢了         1
      还不错,设施稍微有点旧但是可以接收,但是606的价格还不含早餐有点高了。楼下的商场和超市很方便。下次来还会选择这家。         0
    • 预测集数据:每个样本占一行,一行一列(只有一个text)

      差得要命,很大股霉味,勉强住了一晚,第二天大早赶紧溜
      acer的品质、服务都很不错,而且本品很超值。样子也算漂亮,基本性能只要不玩大游戏全能应付。
      跟住招待所没什么太大区别。 绝对不会再住第2次的酒店!

开始训练

  • 参数配置:demo配置文件为./examples/cls_ernie_fc_ch.json,用户需要自己配置的参数为:trainer_reader、test_reader、dev_reader这三个reader对应的数据集路径、batch-size、trainer_reader的epoch;model中的is_dygraph、optimization;trainer中的PADDLE_PLACE_TYPE、PADDLE_IS_FLEET、output_path、几个step设置等,如下图中的json注释所示:

    {
      "dataset_reader": {
        "train_reader": {
          "name": "train_reader",
          "type": "BasicDataSetReader",
          "fields": [
            {
              "name": "text_a",
              "data_type": "string",
              "reader": {
                "type": "ErnieTextFieldReader"
              },
              "tokenizer": {
                "type": "FullTokenizer",
                "split_char": " ",
                "unk_token": "[UNK]"
              },
              "need_convert": true,
              "vocab_path": "../../models_hub/ernie_sentiment_1.0_ch_dir/vocab.txt",
              "max_seq_len": 512,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            },
            {
              "name": "label",
              "data_type": "int",
              "reader": {
                "type": "ScalarFieldReader"
              },
              "tokenizer": null,
              "need_convert": false,
              "vocab_path": "",
              "max_seq_len": 1,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            }
          ],
          "config": {
            "data_path": "./data/train_data",   ## 填写自己的训练集路径即可,写到文件夹目录。
            "shuffle": true,                    ## 训练过程中是否要打乱数据顺序
            "batch_size": 8,                ## 可以根据自己的硬件显存或者内存大小进行调整
            "epoch": 10,                    ## 根据需要自己调整
            "sampling_rate": 1.0,
            "need_data_distribute": true,   ## 是否需要按卡进行数据分发,多卡训练的时候训练集需要设置为true,确保每张卡拿到不一样的数据
            "need_generate_examples": false ## 数据处理的时候需要将明文原始样本进行分true发,默认是false,当预测的时候如果需要返回明文原始样本的时候,设置为true
          }
        },
        "test_reader": {
          "name": "test_reader",
          "type": "BasicDataSetReader",
           ....
          "config": {
            "data_path": "./data/test_data",    ## 填写自己的测试集路径即可,写到文件夹目录。
            "shuffle": false,										## 不需要打乱数据顺序
            "batch_size": 8,                    ## 可以根据自己的硬件显存或者内存大小进行调整
            "epoch": 1,
            "sampling_rate": 1.0,
            "need_data_distribute": false,
            "need_generate_examples": false
          }
        },
        "dev_reader": {
          "name": "dev_reader",
          "type": "BasicDataSetReader",
          ....
          "config": {
            "data_path": "./data/dev_data",   ## 填写自己的测试集路径即可,写到文件夹目录。
            "shuffle": false,                 ## 不需要打乱数据顺序
            "batch_size": 8,                  ## 可以根据自己的硬件显存或者内存大小进行调整
            "epoch": 1,
            "sampling_rate": 1.0,
            "need_data_distribute": true,
            "need_generate_examples": false
          }
        }
      },
      "model": {
        "type": "ErnieFcClassification",
        "is_dygraph": 1,
        "optimization": {
          "learning_rate": 5e-05,
          "use_lr_decay": true,
          "warmup_steps": 0,
          "warmup_proportion": 0.1,
          "weight_decay": 0.01,
          "use_dynamic_loss_scaling": false,
          "init_loss_scaling": 128,
          "incr_every_n_steps": 100,
          "decr_every_n_nan_or_inf": 2,
          "incr_ratio": 2.0,
          "decr_ratio": 0.8
        },
        "embedding": {
          "type": "ErnieTokenEmbedding",
          "emb_dim": 1024,
          "use_fp16": false,
          "config_path": "../../models_hub/ernie_sentiment_1.0_ch_dir/ernie_config.json",
          "other": ""
        },
        "num_labels": 2
      },
      "trainer": {
        "type": "CustomDynamicTrainer",  ## 设置训练器类型,和model中的is_dygraph参数配合使用,动态图使用CustomDynamicTrainer,is_dygraph设置为1,静态图使用CustomTrainer,is_dygraph设置为0
        "PADDLE_PLACE_TYPE": "gpu",  ## 训练时使用的硬件类型,可以选择gpu、cpu
        "PADDLE_IS_FLEET": 1,      ## 是否使用fleet模型训fleet训练,多卡或者多机必须使用fleet模式
        "PADDLE_IS_FLEET": 1,      ## 是否进行单机训练,1表示单机训练,0表示分布式训练
        "train_log_step": 10,      ## 训练时打印训练日志的间隔步数。
        "is_eval_dev": 1,    ## 是否在训练的时候评估验证集,1为需评估,此时必须配置dev_reader。
        "is_eval_test": 1,   ## 是否在训练的时候评估测试集,1为需评估,此时必须配置test_reader。
        "eval_step": 100,    ## 进行测试集或验证集评估的间隔步数。
        "save_model_step": 500,  ## 保存模型时的间隔步数,建议设置为eval_step的整数倍。
        "load_parameters": "",   ## 加载已训练好的模型的op参数值,不会加载训练步数、学习率等训练参数,可用于加载预训练模型。如需使用填写具体文件夹路径即可。
        "load_checkpoint": "",   ## 加载已训练好的模型的所有参数,包括学习率等,可用于热启动。如需使用填写具体文件夹路径即可。
        "use_fp16": 0,
        "pre_train_model": [
          {
            "name": "ernie_sentiment_1.0_ch",  ## ernie_sentiment_1.0_ch 预训练模型加载时使用的名称,不要修改
            "params_path": "../../models_hub/ernie_sentiment_1.0_ch_dir/params"  ## ernie_sentiment_1.0_ch预训练模型的参数目录
          }
        ],
        "output_path": "./output/sa_ernie_sentiment_1.0_ch_dy",  ## 保存模型的输出路径,若为空则默认。为"./output"
        "extra_param": {
          "meta":{
            "job_type": "sentiment_analysis"
          }
        }
      }
    }
  • 启动训练

    如您使用镜像开发套件,您可直接进入下一步骤。

    python run_trainer.py --param_path=./examples/cls_ernie_fc_ch.json

    训练运行的日志会自动保存在./log/test.log文件中;

    训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件。

开始预测

  • 参数配置:demo配置文件为./examples/cls_ernie_fc_ch_infer.json,用户需要自己配置的参数为:predict_reader对应的数据集路径、batch-size;inference中的PADDLE_PLACE_TYPE、output_path、inference_model_path,如下图中的json注释所示:

    {
      "dataset_reader": {
        "predict_reader": {
          "name": "predict_reader",
          "type": "BasicDataSetReader",
          "fields": [
            {
              "name": "text_a",
              "data_type": "string",
              "reader": {
                "type": "ErnieTextFieldReader"
              },
              "tokenizer": {
                "type": "FullTokenizer",
                "split_char": " ",
                "unk_token": "[UNK]"
              },
              "need_convert": true,
              "vocab_path": "../../models_hub/ernie_sentiment_1.0_ch_dir/vocab.txt",
              "max_seq_len": 512,
              "truncation_type": 0,
              "padding_id": 0,
              "embedding": null
            }
          ],
          "config": {
            "data_path": "./data/predict_data",  ## 填写你自己的预测数据集路径即可,写到文件夹目录
            "shuffle": false,
            "batch_size": 8,                    ## 可以根据自己的硬件显存或者内存大小进行调整
            "epoch": 1,
            "sampling_rate": 1.0,
            "need_data_distribute": false,  
            "need_generate_examples": true
          }
        }
      },
       "inference": {
        "output_path": "./output/predict_result.txt",   ## 预测结果存放路径
        "PADDLE_PLACE_TYPE": "gpu",   ## 是否使用GPU,1表示使用GPU
        "num_labels": 2,  ## 类别数量
        "thread_num": 2,  ## 线程数量配置,cpu模式下使用
        "inference_model_path":   "./output/sa_ernie_sentiment_1.0_ch_dy/save_inference_model/inference_step_126/",  ## 待预测的模型路径。
        "extra_param": {
          "meta":{
            "job_type": "sentiment_analysis"
          }
        }
      }
    }
  • 启动预测

    如您使用镜像开发套件,您可直接进入下一步骤。

    python run_infer.py --param_path=./examples/cls_ernie_fc_ch_infer.json

    预测运行的日志会自动保存在./output/predict_result.txt文件中。预测结果为每个类别对应的概率值,每个样本的所有类别概率值相加之和为1。

上一篇
开始训练和预测(ERNIE百亿&15亿模型)
下一篇
金融负面信息识别