文本分类(一)EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现
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最优单模型复现相关推荐
- 基于神经网络的微博情绪分类
本文仅供参考 目录 任务说明 一.基于 Bert 的文本表示及文本分类方法 二.实验原理 三.具体步骤 1.构建句子向量 1.1导入库 1.2加载bert模型 1.3读取数据 1.4获得向量 1.5运 ...
- 基于 Word2Vec 的微博情绪分类
本文仅供参考 文章目录 任务说明 一.基于 Word2Vec 的文本表示及文本分类方法 二.实验原理 三.具体步骤 1.引入库 2.读入数据 3.数据清洗 4.生成word2vec模型 5.文本表示 ...
- 微博情绪分析评测(SMP2020-EWECT) 参赛总结
点击下面卡片,关注我呀,每天给你送来AI技术干货! 知乎:白胡子小生.thinking慢羊羊 地址:https://zhuanlan.zhihu.com/p/222138885 机构:苏州大学 SUD ...
- 2022年iFLYTEKA.I.开发者大赛疫情微博情绪识别挑战赛
自然语言技术 零基础入门NLP - 新闻文本分类 基于word2vec的word相似度 疫情微博情绪识别挑战赛 自然语言技术 背景 一.赛事任务 二.使用步骤 1.README 2.数据下载 3.模型 ...
- 人脸表情识别和情绪分类 | Python+TensorFlow(框架)+Keras+PyQt5
人脸表情识别 | Python+Keras+PyQt5 参考学习文章: Keras|基于深度学习的人脸表情识别系统 PyQt5+QtDesigner编写摄像头界面程序(一)--pyqt5.qtdesi ...
- 机器学习-文本处理之电影评论多分类情感分析
一.背景 文本处理是许多ML应用程序中最常见的任务之一.以下是此类应用的一些示例 语言翻译:将句子从一种语言翻译成另一种语言 情绪分析:从文本语料库中确定对任何主题或产品等的情绪是积极的.消极的还是中 ...
- 学习微博情感分类的特定情感词嵌入(A14, ACL2014)*
Learning sentiment-specific word embedding for twitter sentiment classification 学习微博情感分类的特定情感词嵌入(A14 ...
- 【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. 小 ...
- 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 ...
最新文章
- C语言获得数组长度的函数
- 1114. Family Property (25)
- boost::phoenix::ref相关的测试程序
- 什么是防火墙?防火墙的设计主要有哪些类型?
- idea中配置maven仓库
- 服务器系统是选择CentOS,还是选择Ubuntu
- winafl 源码分析
- 抖音用计算机弹曲子,抖音计算机乐谱有哪些?抖音计算机乐谱大全分享
- 敏捷开发中史诗故事与用户故事的颗粒度
- 关于node的聊天室错误
- 三角网格表面高斯曲率的计算与可视化
- android判断进程是否是意外退出
- paip.接入支付接口功能流程总结
- Unity2021.2.0版本汉化
- PSS E v33.40 1CD(大型电力系统仿真计算软件)
- linux美元符号进入井号,MyBatis中井号与美元符号的区别
- 从智慧零售,看腾讯的数字化转型之道
- C#.NET PrintDocument 自定义报表数据打印
- Android 视频 美颜SDK对比
- C++Primer第五版——习题答案详解(六)