tensorflow2.0 + transformers EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现

  • 前言
  • 代码部分
    • 训练结果
  • 总结
    • 迭代优化

前言

最近正在实现网易云评论情绪分类,用于评论社区研究,在搜索相关比赛的实现方法,看到了为数不多的单模型也能达到较好效果的情况,因此拿来复现作为第一版模型。
复现模型:微博情绪分析评测(smp2020-ewect)No.3 拿第一导师请吃肯德基 usual语料部分情绪分类最优单模型。
模型结构:


代码部分

tensorflow : 2.0
transformers : 3.1.0

话不多说直接上代码

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn import model_selection
from transformers import *
from tokenizers import BertWordPieceTokenizer, ByteLevelBPETokenizer
from sklearn.metrics import f1_score
from sklearn.model_selection import train_test_split
import os
import tensorflow.keras.backend as Kclass BertNerModel(TFBertPreTrainedModel):dense_layer = 512class_num = 6drop_out_rate = 0.5def __init__(self, config, *inputs, **kwargs):super(BertNerModel,self).__init__(config, *inputs, **kwargs)config.output_hidden_states = Trueself.bert_layer = TFBertMainLayer(config, name='bert')self.bert_layer.trainable = Trueself.liner_layer = tf.keras.layers.Dense(self.dense_layer,activation='relu')self.soft_max = tf.keras.layers.Dense(self.class_num,activation='softmax')self.drop_out = tf.keras.layers.Dropout(self.drop_out_rate)def call(self, inputs):hidden_states = self.bert_layer(inputs)tensor = tf.concat((hidden_states[2][-1][:,0],hidden_states[2][-2][:,0],hidden_states[2][-3][:,0],hidden_states[1]),1,)drop_out_l = self.drop_out(tensor)Dense_l = self.liner_layer(drop_out_l)outputs = self.soft_max(Dense_l)return outputsdef encode_(x,y,tokenizer):train_texts, val_texts, train_tags, val_tags = train_test_split(x,y,test_size=0.2,random_state=888)batch_x1 = tokenizer(train_texts, padding=True, truncation=True, return_tensors="tf",max_length=60)batch_x2 = tokenizer(val_texts, padding=True, truncation=True, return_tensors="tf",max_length=60)label_1  = tf.constant(train_tags)label_2  = tf.constant(val_tags)dataset_train = tf.data.Dataset.from_tensor_slices((dict(batch_x1),label_1))dataset_test = tf.data.Dataset.from_tensor_slices((dict(batch_x2),label_2))return dataset_train,dataset_testclass Metrics(tf.keras.callbacks.Callback):'''定义了一个callbcacks方法,可以在每轮训练结束后计算模型在测试集上的F1_score值,并保存f1_score最大的模型。(选用)'''def __init__(self, valid_data):super(Metrics, self).__init__()self.validation_data = valid_datadef on_train_begin(self, logs=None):self.val_f1s = []self.best_val_f1 = 0def on_epoch_end(self, epoch, logs=None):logs = logs or {}val_predict = np.argmax(self.model(self.validation_data[0]), -1)val_targ = self.validation_data[1]_val_f1 = f1_score(val_targ, val_predict, average='macro')self.val_f1s.append(_val_f1)logs['val_f1'] = _val_f1if _val_f1 > self.best_val_f1:self.model.save_pretrained('./checkpoints/weights-f1={}/'.format(_val_f1), overwrite=True)self.best_val_f1 = _val_f1print("best f1: {}".format(self.best_val_f1))else:print("val f1: {}, but not the best f1".format(_val_f1))returndef focal_loss(label,pred,class_num=6, gamma=2):'''多分类的focal_loss,暂时没有提升效果(选用)'''label = tf.squeeze(tf.cast(tf.one_hot(tf.cast(label,tf.int32),class_num),pred.dtype)) pred = tf.clip_by_value(pred, 1e-8, 1.0)w1 = tf.math.pow((1.0-pred),gamma)L =  - tf.math.reduce_sum(w1 * label * tf.math.log(pred))return Ldef sparse_categorical_crossentropy(y_true, y_pred):y_true = tf.reshape(y_true, tf.shape(y_pred)[:-1])y_true = tf.cast(y_true, tf.int32)y_true = tf.one_hot(y_true, K.shape(y_pred)[-1])return tf.keras.losses.categorical_crossentropy(y_true, y_pred)def loss_with_gradient_penalty(model,epsilon=1):'''对抗训练FGM惩罚梯度损失函数,能提升1个点左右(选用)'''def loss_with_gradient_penalty_2(y_true, y_pred):loss = tf.math.reduce_mean(sparse_categorical_crossentropy(y_true, y_pred))embeddings = model.variables[0]gp = tf.math.reduce_sum(tf.gradients(loss, [embeddings])[0].values**2)return loss + 0.5 * epsilon * gpreturn loss_with_gradient_penalty_2
def main():if not os.path.exists('./checkpoints'):os.makedirs('./checkpoints')   tb_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs', profile_batch=0)#预训练模型加载部分pretrained_path = 'model/'config_path = os.path.join(pretrained_path, 'bert_config.json')vocab_path = os.path.join(pretrained_path, 'vocab.txt')# 加载configconfig = BertConfig.from_json_file(config_path)tokenizer = BertTokenizer.from_pretrained(vocab_path)bert_ner_model = BertNerModel.from_pretrained(pretrained_path,config=config,from_pt=True)#数据处理部分data = pd.read_csv('data_proceed.csv')data = data.dropna()emotion_g2id = {}for i,j in enumerate(set(data['情绪标签'])):emotion_g2id[j]=idata['情绪标签'] = data['情绪标签'].apply(lambda x:emotion_g2id[x])data_size = len(data['情绪标签'])train_size = data_size*0.8train_test = data_size*0.2steps_per_epoch = train_size//16validation_step = train_test//16dataset_train,dataset_test = encode_(list(data['文本']),list(data['情绪标签']),tokenizer)dataset_train = dataset_train.shuffle(999).repeat().batch(16)dataset_test = dataset_test.batch(16)#模型训练部分optimizer = tf.keras.optimizers.Adam(learning_rate=2e-5)bert_ner_model.compile(optimizer=optimizer, loss=[loss_with_gradient_penalty(bert_ner_model,0.5)] ,metrics=['sparse_categorical_accuracy'])#此处可以使用tf自带的 sparse_categorical_crossentropybert_ner_model.fit(dataset_train,epochs=5,verbose=1,steps_per_epoch=steps_per_epoch,validation_data=dataset_test,validation_steps=validation_step)
#     callbacks=[Metrics(valid_data=(batch_x2,label_2)),tb_callback])bert_ner_model.save_pretrained('./my_mrpc_model/') if __name__ == '__main__':main()

训练结果


总结

结果与比赛的结果还有一些差距,因为在数据预处理和模型调优上没有做太多尝试,这里只在3个hidden_layers后接了一个dense直接跟了softmax,可以考虑自己加一些lstm等尝试一下。


迭代优化

之后会用这个模型去对网易云音乐的评论进行推理,选取置信度较高的样本加入到原训练样本中一起学习,有点自学习那味了。

文本分类(一)EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现相关推荐

  1. 基于神经网络的微博情绪分类

    本文仅供参考 目录 任务说明 一.基于 Bert 的文本表示及文本分类方法 二.实验原理 三.具体步骤 1.构建句子向量 1.1导入库 1.2加载bert模型 1.3读取数据 1.4获得向量 1.5运 ...

  2. 基于 Word2Vec 的微博情绪分类

    本文仅供参考 文章目录 任务说明 一.基于 Word2Vec 的文本表示及文本分类方法 二.实验原理 三.具体步骤 1.引入库 2.读入数据 3.数据清洗 4.生成word2vec模型 5.文本表示 ...

  3. 微博情绪分析评测(SMP2020-EWECT) 参赛总结

    点击下面卡片,关注我呀,每天给你送来AI技术干货! 知乎:白胡子小生.thinking慢羊羊 地址:https://zhuanlan.zhihu.com/p/222138885 机构:苏州大学 SUD ...

  4. 2022年iFLYTEKA.I.开发者大赛疫情微博情绪识别挑战赛

    自然语言技术 零基础入门NLP - 新闻文本分类 基于word2vec的word相似度 疫情微博情绪识别挑战赛 自然语言技术 背景 一.赛事任务 二.使用步骤 1.README 2.数据下载 3.模型 ...

  5. 人脸表情识别和情绪分类 | Python+TensorFlow(框架)+Keras+PyQt5

    人脸表情识别 | Python+Keras+PyQt5 参考学习文章: Keras|基于深度学习的人脸表情识别系统 PyQt5+QtDesigner编写摄像头界面程序(一)--pyqt5.qtdesi ...

  6. 机器学习-文本处理之电影评论多分类情感分析

    一.背景 文本处理是许多ML应用程序中最常见的任务之一.以下是此类应用的一些示例 语言翻译:将句子从一种语言翻译成另一种语言 情绪分析:从文本语料库中确定对任何主题或产品等的情绪是积极的.消极的还是中 ...

  7. 学习微博情感分类的特定情感词嵌入(A14, ACL2014)*

    Learning sentiment-specific word embedding for twitter sentiment classification 学习微博情感分类的特定情感词嵌入(A14 ...

  8. 【NLP】12 RNN神经网络应用在情绪分类NLP任务——LSTM(hidden, output)、Attention、Transform Encoder

    LSTM 1. LSTM-hidden 1.1 调试过程 1.2 结果 1.3 全部代码 2. LSTM-output 3. Attention 4. Transformer 5. 全部代码 6. 小 ...

  9. 2020-11-11 吴恩达DL学习-C5 序列模型-W2 自然语言处理与词嵌入(2.9 情绪分类-使用RNN模型,考虑词序)

    1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c 2.详细笔记网站(中文):http://www.ai-sta ...

最新文章

  1. C语言获得数组长度的函数
  2. 1114. Family Property (25)
  3. boost::phoenix::ref相关的测试程序
  4. 什么是防火墙?防火墙的设计主要有哪些类型?
  5. idea中配置maven仓库
  6. 服务器系统是选择CentOS,还是选择Ubuntu
  7. winafl 源码分析
  8. 抖音用计算机弹曲子,抖音计算机乐谱有哪些?抖音计算机乐谱大全分享
  9. 敏捷开发中史诗故事与用户故事的颗粒度
  10. 关于node的聊天室错误
  11. 三角网格表面高斯曲率的计算与可视化
  12. android判断进程是否是意外退出
  13. paip.接入支付接口功能流程总结
  14. Unity2021.2.0版本汉化
  15. PSS E v33.40 1CD(大型电力系统仿真计算软件)
  16. linux美元符号进入井号,MyBatis中井号与美元符号的区别
  17. 从智慧零售,看腾讯的数字化转型之道
  18. C#.NET PrintDocument 自定义报表数据打印
  19. Android 视频 美颜SDK对比
  20. C++Primer第五版——习题答案详解(六)

热门文章

  1. js中的各种宽度计算
  2. 【原创】二级指针中在内存中的样子
  3. Shiro学习(15)单点登录
  4. IDEA启动自动进入最后一个项目
  5. 关于CAShapeLayer的一些实用案例和技巧
  6. dede:arclist 不能调用文章的副栏目或多个副栏目的解决方法
  7. CentOS 6.4 配置LAMP 环境 与安装 phpmyadmin
  8. c#扩展方法奇思妙用变态篇四:string 的翻身革命
  9. SQL Server 2000+ADO.NET实现并发控制
  10. 第二天学习Java的笔记