基于ERNIE3.0的中文评论分类

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

一、基于ERNIE3.0的中文评论分类

  • 数据集下载脚本: ERNIE/applications/tasks/text_classification/data/download_data.sh
  • 就分2类,正向和负向评论
  • 其中train数据集400条, test数据200条

二、ERNIE 3.0介绍

文心大模型ERNIE是百度发布的产业级知识增强大模型,涵盖了NLP大模型和跨模态大模型。2019年3月,开源了国内首个开源预训练模型文心ERNIE 1.0,此后在语言与跨模态的理解和生成等领域取得一系列技术突破,并对外开源与开放了系列模型,助力大模型研究与产业化应用发展。提醒: ERNIE老版本代码已经迁移至repro分支,欢迎使用我们全新升级的基于动静结合的新版ERNIE套件进行开发。另外,也欢迎上EasyDLBML体验更丰富的功能。

三、模型选择

  • 选择具体的模型训练文本分类任务,文心预置了3类模型训练文本分类任务,具体分为:BOW、ERNIE、ERNIE-M 等模型

文心预置的可用于文本分类的模型源文件在./applications/tasks/text_classification/model目录下,各个模型的特点如下所示(后面章节会依次展示使用方法):

网络名称(py文件的类名) 简介 支持类型 支持预训练模型 备注
BowClassification(bow_classification.py) 词袋模型,不考虑语法和语序,用一组无序单词来表达一段文本。 单标签分类
ErnieClassification(ernie_classification.py) 基于ERNIE预训练模型的最简单的分类模型,在ERNIE的embedding输出层之后直接添加FC(全链接层)降维到标签数量的纬度,loss使用交叉熵。网络结构简单,效果好。 单标签分类 ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium、ERNIE-M
MultiLabelClassification(multi_label_classification.py) 处理多标签分类任务的网络结构,在ErnieClassification的基础上,loss由二分类交叉熵更换为 sigmoid cross entropy 多标签分类 ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium、ERNIE-M
ErnieDocClassification(ernie_doc_classification.py) 长文本分类任务的网络 单标签分类 ERNIE-Doc

此次选择最简单的ErnieClassification模型。

四、模型训练

1.环境构建

!unzip -qoa data/data158935/ERNIE3.zip

2. 选择 ERNIE(ErnieClassification)模型

  • 进入分类任务的目录./applications/tasks/text_classification
%cd ~/ERNIE/applications/tasks/text_classification
/home/aistudio/ERNIE/applications/tasks/text_classification

3.预训练模型准备

  • 模型均存放于./applications/models_hub文件夹下,进入该文件夹下载对应ERNIE模型
%cd ../../models_hub
!bash ./download_ernie_3.0_base_ch.sh
%cd ../tasks/text_classification
/home/aistudio/ERNIE/applications/models_hub
/home/aistudio/ERNIE/applications/tasks/text_classification

4.训练的配置文件

  • 配置文件:./examples/cls_ernie_fc_ch.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_3.0_base_ch_dir/vocab.txt",
          "max_seq_len": 512,
          "truncation_type": 0,
          "padding_id": 0
        },
        {
          "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": false,
        "batch_size": 8,
        "epoch": 5,
        "sampling_rate": 1.0,
        "need_data_distribute": true,
        "need_generate_examples": false
      }
    },
    "test_reader": {
      "name": "test_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_3.0_base_ch_dir/vocab.txt",
          "max_seq_len": 512,
          "truncation_type": 0,
          "padding_id": 0
        },
        {
          "name": "label",
          "data_type": "int",
          "need_convert": false,
          "reader": {
            "type": "ScalarFieldReader"
          },
          "tokenizer": null,
          "vocab_path": "",
          "max_seq_len": 1,
          "truncation_type": 0,
          "padding_id": 0,
          "embedding": null
        }
      ],
      "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
      }
    }
  },
  "model": {
    "type": "ErnieClassification",
    "is_dygraph": 1,
    "optimization": {            ## 优化器设置,文心ERNIE推荐的默认设置。
      "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": {
      "config_path": "../../models_hub/ernie_3.0_base_ch_dir/ernie_config.json"
    },
    "num_labels": 2
  },
  "trainer": {
    "type": "CustomDynamicTrainer",
    "PADDLE_PLACE_TYPE": "gpu",
    "PADDLE_IS_FLEET": 1,
    "train_log_step": 10,
    "use_amp": true,         # 是否开启混合精度训练,默认开启。
    "is_eval_dev": 0,
    "is_eval_test": 1,
    "eval_step": 100,
    "save_model_step": 200,
    "load_parameters": "",    ## 加载包含各op参数值的训练好的模型,用于热启动。此处填写checkpoint路径。不填则表示不使用热启动。
    "load_checkpoint": "",     ## 加载包含学习率等所有参数的训练模型,用于热启动。此处填写checkpoint路径。不填则表示不使用热启动。
    "pre_train_model": [
      {
        "name": "ernie_3.0_base_ch",
        "params_path": "../../models_hub/ernie_3.0_base_ch_dir/params"
      }
    ],
    "output_path": "./output/cls_ernie_3.0_base_fc_ch_dy",
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }

    }
  }
}

5.数据查看

数据位于:ERNIE/applications/tasks/text_classification/data 目录下,分别为 train 、 test 目录

!pwd
! head ./data/train_data/train.txt
/home/aistudio/ERNIE/applications/tasks/text_classification
选择 珠江花园 的 原因 就是 方便 , 有 电动 扶梯 直接 到达 海边 , 周围 餐馆 、 食廊 、 商场 、 超市 、 摊位 一应俱全 。 酒店 装修 一般 , 但 还算 整洁 。   泳池 在 大堂 的 屋顶 , 因此 很 小 , 不过 女儿 倒是 喜欢 。   包 的 早餐 是 西式 的 , 还算 丰富 。   服务 吗 , 一般	1
15.4寸 笔记本 的 键盘 确实 爽 , 基本 跟 台式机 差不多 了 , 蛮 喜欢 数字 小 键盘 , 输 数字 特 方便 , 样子 也 很 美观 , 做工 也 相当 不错	1
房间 太 小 。 其他 的 都 一般 。 。 。 。 。 。 。 。 。	0
1 . 接 电源 没有 几分钟 , 电源适配器 热 的 不行 .   2 . 摄像头 用 不 起来 .   3 . 机盖 的 钢琴漆 , 手 不能 摸 , 一摸 一个 印 .   4 . 硬盘 分区 不好 办 .	0
今天 才 知道 这 书 还有 第6卷 , 真 有点 郁闷 : 为什么 同一 套书 有 两种 版本 呢 ? 当当网 是不是 该 跟 出版社 商量 商量 , 单独 出 个 第6卷 , 让 我们 的 孩子 不会 有所 遗憾 。	1
机器 背面 似乎 被 撕 了 张 什么 标签 , 残 胶 还在 。 但是 又 看 不 出 是 什么 标签 不见 了 , 该 有 的 都 在 , 怪	0
呵呵 , 虽然 表皮 看上去 不错 很 精致 , 但是 我 还是 能 看得出来 是 盗 的 。 但是 里面 的 内容 真 的 不错 , 我 妈 爱 看 , 我自己 也 学 着 找 一些 穴位 。	0
这本书 实在 是 太烂 了 , 以前 听 浙大 的 老师 说 这本书 怎么 怎么 不对 , 哪些 地方 都是 误导 的 还 不 相信 , 终于 买 了 一本 看一下 , 发现 真是 ~ ~ ~ 无语 , 这种 书 都 写 得 出来	0
地理 位置 佳 , 在 市中心 。 酒店 服务 好 、 早餐 品种 丰富 。 我 住 的 商务 数码 房 电脑 宽带 速度 满意 , 房间 还算 干净 , 离 湖南路小吃街 近 。	1
5.1 期间 在 这 住 的 , 位置 还 可以 , 在 市委 市政府 附近 , 要 去 商业区 和 步行街 得 打车 , 屋里 有 蚊子 , 虽然 空间 挺 大 , 晚上 熄灯 后 把 窗帘 拉 上 简直 是 伸手 不见 五指 , 很 适合 睡觉 , 但是 会 被 该死 的 蚊子 吵醒 ! 打死 了 两只 , 第二天早上 还是 发现 又 没 打死 的 , 卫生间 挺 大 , 但是 设备 很 老旧 。	1
! wc -l ./data/train_data/train.txt
400 ./data/train_data/train.txt
! wc -l ./data/test_data/test.txt
200 ./data/test_data/test.txt

可见数据由 tab 分割,标签用数字从0开始标识。

6.训练ERNIE模型

  • 训练模型保存于./output/cls_ernie_3.0_base_fc_ch_dy文件夹下(可在配置文件./examples/cls_ernie_fc_ch.json中修改输出路径),其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件
  • 训练模型的日志文件保存于./log文件夹下
!python run_trainer.py --param_path ./examples/cls_ernie_fc_ch.json

训练日志

INFO: 07-19 23:57:56: custom_dynamic_trainer.py:96 * 140071493568256 epoch 4 progress 113/400 current learning rate: 8.2e-06
INFO: 07-19 23:57:56: base_cls.py:88 * 140071493568256 phase = training loss = 0.0010867760283872485 acc = 1.0 precision = 1.0 step = 210 time_cost = 6.1986
INFO: 07-19 23:57:57: custom_dynamic_trainer.py:96 * 140071493568256 epoch 4 progress 193/400 current learning rate: 6.2e-06
INFO: 07-19 23:57:57: base_cls.py:88 * 140071493568256 phase = training loss = 0.001071672304533422 acc = 1.0 precision = 1.0 step = 220 time_cost = 1.1624
INFO: 07-19 23:57:59: custom_dynamic_trainer.py:96 * 140071493568256 epoch 4 progress 273/400 current learning rate: 4.2e-06
INFO: 07-19 23:57:59: base_cls.py:88 * 140071493568256 phase = training loss = 0.0012139356695115566 acc = 1.0 precision = 1.0 step = 230 time_cost = 1.2228
INFO: 07-19 23:58:00: custom_dynamic_trainer.py:96 * 140071493568256 epoch 4 progress 353/400 current learning rate: 2.2e-06
INFO: 07-19 23:58:00: base_cls.py:88 * 140071493568256 phase = training loss = 0.0015250792494043708 acc = 1.0 precision = 1.0 step = 240 time_cost = 1.2102
INFO: 07-19 23:58:01: custom_dynamic_trainer.py:96 * 140071493568256 epoch 4 progress 400/400 current learning rate: 2e-07
INFO: 07-19 23:58:01: base_cls.py:88 * 140071493568256 phase = training loss = 0.0010427245870232582 acc = 1.0 precision = 1.0 step = 250 time_cost = 1.0204
INFO: 07-19 23:58:01: custom_dynamic_trainer.py:123 * 140071493568256 Final test result: 
INFO: 07-19 23:58:02: base_cls.py:93 * 140071493568256 phase = test acc = 0.895 precision = 0.894 time_cost = 1.2272 step = 25
INFO: 07-19 23:58:02: custom_dynamic_trainer.py:157 * 140071493568256 eval step = 25
INFO: 07-19 23:58:05: dynamic_trainer.py:170 * 140071493568256 save path: ./output/cls_ernie_3.0_base_fc_ch_dy/save_inference_model/inference_step_251
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py:400: UserWarning: do not use standalone executor in fleet by default
  warnings.warn("do not use standalone executor in fleet by default")
INFO: 07-19 23:58:06: run_trainer.py:108 * 140071493568256 end of run train and eval .....

7.开始预测

  • 配置文件 ./examples/cls_ernie_fc_ch_infer.json
  • 在配置文件./examples/cls_ernie_fc_ch_infer.json中需要更改 inference.inference_model_path 为上面训练过程中所保存的预测模型的路径
{
  "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]",
            "params": null
          },
          "need_convert": true,
          "vocab_path": "../../models_hub/ernie_3.0_base_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": {
    "type": "CustomInference",
    # 结果保存文件
    "output_path": "./output/predict_result.txt",
    "PADDLE_PLACE_TYPE": "cpu",
    "num_labels": 2,
    "thread_num": 2,
    "inference_model_path": "./output/cls_ernie_3.0_base_fc_ch_dy/save_inference_model/inference_step_251/",
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }

    }
  }
}
! cp ~/cls_ernie_fc_ch_infer.json ./examples/cls_ernie_fc_ch_infer.json
! python ./run_infer.py  --param_path ./examples/cls_ernie_fc_ch_infer.json

预测日志:

INFO: 07-20 00:18:13: run_infer.py:50 * 140535793329920 ('这酒店太烂了,左、右及后边是3个大型的娱乐场所,吵闹声一直到凌晨3点多,酒店隔音很差。房间装修很俗,中央空调声音很响。 宾馆反馈 2008年7月15日 : 尊贵的客人,谢谢您对本酒店提出宝贵的意见。我们非常地抱歉在您入住本酒店期间给您带来的不便,对于您提出空调响的问题,我们酒店管理层非常重视,马上找专业人员改善空调的问题,今后我们将不断改进我们的不足,为您及所有宾客提供更优质服务,再次感谢您,并期待您的下次光临,谢谢!', '[0.9969472289085388, 0.0030527461785823107]')
INFO: 07-20 00:18:13: run_infer.py:50 * 140535793329920 ('酒店生意清淡,大堂里都没几个客人。 房间倒是不小,但觉得被褥窗帘都灰蒙蒙的有股味道,不知道多久没人用了。 酒店里的娱乐设施,包括游泳池,台球等等,都要收费。 白天房间里没有空调。晚上的热水,要先放10 分钟才会来。 优点么,就是位置不错,出门就是老街,吃饭逛街还算方便。', '[0.011279764585196972, 0.9887202382087708]')
INFO: 07-20 00:18:13: run_infer.py:50 * 140535793329920 ('是因为陈丹青在谈鲁迅时的推荐,才留意这本书并找来看的,确实很生动、有趣,应该感谢胡颂平先生(尽管他很谦逊),为后人记录了这些精彩的片段,在大师人生的最后几年。过他的记录,才感觉到,原来“胡适”并不只是一个高高在上、后人激赏抑或针砭的名人,而是真真切切的离我们很近很近的一位智者,一位有血有肉的大师。', '[0.0014486766885966063, 0.9985513091087341]')
INFO: 07-20 00:18:13: run_infer.py:50 * 140535793329920 ('看了几页就没有看下去的欲望了,作者一直在吹牛。一会说某某某太太一直治不好什么病,经过他一看,用了几位药,或者按了几下,马上就好了。要么就是什么哪个医生一直治不好什么病,找他帮忙。而关于真正的东西,根本没有详细说明。烂书~', '[0.9988927245140076, 0.0011072783963754773]')
INFO: 07-20 00:18:13: run_infer.py:50 * 140535793329920 ('和其他netbook比起来, 这款机器还是有点贵的. 另外大陆始终没有引进高分屏的版本, 很遗憾. 升级内存需要拆键盘, 对一般用户可能会是个问题.', '[0.9644924998283386, 0.03550752252340317]')
INFO: 07-20 00:18:13: run_infer.py:50 * 140535793329920 ('如果你处在18岁以下,那么,建议你可以尝试一下这本被有些人喜欢的书。买了来浏览了一两页就再也不想看它第二眼了!说说书中的内容吧。这么说,找个夜市的书摊,随便翻开一本什么“成功的秘诀”、“人际关系的艺术”之类的书,都可以找到这本书的蛛丝马迹。。。也就是说,这本书,和市面上流行的各种励志书没有任何的差别!里面无非是些教条的说教罢了,对于一个心智成熟的人来说,这些东西完全就是……', '[0.012408033944666386, 0.9875919222831726]')
  • 预测结果保存于./output/predict_result.txt文件中(可在./examples/cls_ernie_fc_ch_infer.json中修改输出路径)。
# 查看输出
!head ./output/predict_result.txt
这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般	[0.9985451698303223, 0.0014548496110364795]
怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片!开始还怀疑是不是赠送的个别现象,可是后来发现每张DVD后面都有!真不知道生产商怎么想的,我想看的是猫和老鼠,不是米老鼠!如果厂家是想赠送的话,那就全套米老鼠和唐老鸭都赠送,只在每张DVD后面添加一集算什么??简直是画蛇添足!!	[0.9974921941757202, 0.002507762983441353]
还稍微重了点,可能是硬盘大的原故,还要再轻半斤就好了。其他要进一步验证。贴的几种膜气泡较多,用不了多久就要更换了,屏幕膜稍好点,但比没有要强多了。建议配赠几张膜让用用户自己贴。	[0.9977949857711792, 0.002205039607360959]
交通方便;环境很好;服务态度很好 房间较小	[0.0007406083168461919, 0.9992594122886658]
不错,作者的观点很颠覆目前中国父母的教育方式,其实古人们对于教育已经有了很系统的体系了,可是现在的父母以及祖父母们更多的娇惯纵容孩子,放眼看去自私的孩子是大多数,父母觉得自己的孩子在外面只要不吃亏就是好事,完全把古人几千年总结的教育古训抛在的九霄云外。所以推荐准妈妈们可以在等待宝宝降临的时候,好好学习一下,怎么把孩子教育成一个有爱心、有责任心、宽容、大度的人。	[0.0038633965887129307, 0.9961366057395935]
有了第一本书的铺垫,读第二本的时候开始进入状态。基本上第二本就围绕主角们的能力训练展开,故事的主要发生场地设置在美洲的亚马逊丛林。心里一直疑惑这和西藏有什么关系,不过大概看完全书才能知道内里的线索。其中描述了很多热带雨林中特有的神秘动植物以及一些生存技巧和常识,受益匪浅。能够想像出要写这样一部书,融合这样许多的知识,作者需要花费多少心血来搜集和整理并成文。	[0.0013136795023456216, 0.9986863732337952]
前台接待太差,酒店有A B楼之分,本人check-in后,前台未告诉B楼在何处,并且B楼无明显指示;房间太小,根本不像4星级设施,下次不会再选择入住此店啦。	[0.9987788796424866, 0.0012211622670292854]
1. 白色的,很漂亮,做工还可以; 2. 网上的软件资源非常丰富,这是我买它的最主要原因; 3. 电池不错,昨天从下午两点到晚上十点还有25分钟的剩余时间(关闭摄像头,无线和蓝牙)主要拷贝东西,看起来正常使用八小时左右没问题; 4. 散热不错,CPU核心不过40~55度,很多小本要上到80度了; 5. 变压器很小巧,很多小本的电源都用的是大本的电源,本倒是很轻,可旅行重量还是比较重。	[0.0006128939567133784, 0.9993871450424194]
在当当上买了很多书,都懒于评论。但这套书真的很好,3册都非常精彩。我家小一的女儿,认字多,非常喜爱,每天睡前必读。她还告诉我,学校的语文课本中也有相同的文章。我还借给我的同事的女儿,我同事一直头疼她女儿不爱看书,但这套书,她女儿非常喜欢。两周就看完了。建议买。很少写评论,但忍不住为这套书写下。也给别的读者参考下。	[0.0010379371233284473, 0.9989620447158813]
19天硬盘就罢工了~~~算上运来的一周都没用上15天~~~可就是不能换了~~~唉~~~~你说这算什么事呀~~~	[0.9968897700309753, 0.003110223449766636]

五、其他

猜你喜欢

转载自juejin.im/post/7124965072245358600
今日推荐