【参考:HuggingFace学习2:使用Bert模型训练文本分类任务_呆萌的代Ma的博客-CSDN博客】

数据集:【参考:利用LSTM+CNN+glove词向量预训练模型进行微博评论情感分析(二分类)_你们卷的我睡不着QAQ的博客-CSDN博客】

在colab上使用GPU大概跑了二十分钟

文本处理

import pandas as pd
import numpy as npdf = pd.read_csv("weibo_senti_100k.csv", encoding="gbk")
df.head()

import redf.insert(2, 'sentence', "")  # 新增一列# 因为是判断极性,所以不需要区分句子的先后关系,可以把符号全部去掉
for i in range(len(df)):content = df.loc[i, 'content']  # 行索引,列索引temp = re.sub('[^\u4e00-\u9fa5]+', '', content)  # 去除非汉字df.loc[i, 'sentence'] = temp

df.to_csv('weibo_senti_100k_sentence.csv') # 保存

为节省内存,删除content列

df = df.drop('content', axis=1)

数据封装

import torchdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")print(torch.cuda.is_available())print(device)

True
cuda:0

# 划分数据集
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(df['sentence'].values, # ndarraydf['label'].values,train_size=0.7,random_state=100)
from torch.utils.data import Dataset, DataLoader
import torchclass MyDataset(Dataset):def __init__(self, X, y):self.X = Xself.y = ydef __getitem__(self, idx):return self.X[idx], self.y[idx]def __len__(self):return len(self.X)train_dataset = MyDataset(X_train, y_train)
test_dataset = MyDataset(X_test, y_test)
next(iter(train_dataset))

(‘刘姐回复菩提天泉好可爱哈哈扎西德勒’, 1)

batch_size = 32
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=False)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
# next(iter(train_loader))
for i, batch in enumerate(train_loader):print(batch)break
[
('刘姐回复菩提天泉好可爱哈哈扎西德勒', ...,'玻璃陶瓷家具股引领涨势亮点原来在此哈哈', '如此去三亚的理由是不是更多啦亲们不要放过机会太开心'),
tensor([1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1,1, 0, 1, 1, 0, 0, 1, 1])
]

BERT模型

from torch import nn
from transformers import BertModel, BertTokenizer
from transformers import AdamW
from tqdm import tqdmnum_class=2class BertClassificationModel(nn.Module):def __init__(self,hidden_size=768): # bert默认最后输出维度为768super(BertClassificationModel, self).__init__()model_name = 'bert-base-chinese'# 读取分词器self.tokenizer = BertTokenizer.from_pretrained(pretrained_model_name_or_path=model_name)# 读取预训练模型self.bert = BertModel.from_pretrained(pretrained_model_name_or_path=model_name)for p in self.bert.parameters(): # 冻结bert参数p.requires_grad = Falseself.fc = nn.Linear(hidden_size, num_class)def forward(self, batch_sentences): # [batch_size,1]# 编码sentences_tokenizer = self.tokenizer(batch_sentences,truncation=True,padding=True,max_length=512,add_special_tokens=True)input_ids=torch.tensor(sentences_tokenizer['input_ids']).to(device) # 变量attention_mask=torch.tensor(sentences_tokenizer['attention_mask']).to(device) # 变量bert_out=self.bert(input_ids=input_ids,attention_mask=attention_mask) # 模型last_hidden_state =bert_out[0].to(device) # [batch_size, sequence_length, hidden_size] # 变量bert_cls_hidden_state=last_hidden_state[:,0,:].to(device) # 变量fc_out=self.fc(bert_cls_hidden_state) # 模型return fc_outmodel=BertClassificationModel()
model=model.to(device)
optimizer=AdamW(model.parameters(),lr=1e-4)
loss_func=nn.CrossEntropyLoss()
loss_func=loss_func.to(device)

训练


def train():model.train()for i,(data,labels) in enumerate(tqdm(train_loader)):out=model(data) # [batch_size,num_class]loss=loss_func(out.cpu(),labels)loss.backward()optimizer.step()optimizer.zero_grad()if i%5==0:out=out.argmax(dim=-1)acc=(out.cpu()==labels).sum().item()/len(labels)print(i, loss.item(), acc) # 一个batch的数据train()
0%|          | 1/2625 [00:00<22:30,  1.94it/s] 0 0.6587909460067749 0.59375

测试

def test():model.eval()correct = 0total = 0for i,(data,labels) in enumerate(tqdm(test_loader)):with torch.no_grad():out=model(data) # [batch_size,num_class]out = out.argmax(dim=1)correct += (out.cpu() == labels).sum().item()total += len(labels)print(correct / total)test()
100%|██████████| 1125/1125 [07:35<00:00,  2.47it/s] 0.8822957468677946

注:本次实验只训练了一个epochs,有兴趣的小伙伴可以多训练几个批次,应该是可以达到95%以上的

torch.save(model, 'BertClassificationModel.pth') # 保存模型

预测

# model = torch.load('BertClassificationModel.pth')
text='真不错,讲得非常好'
out=model([text])out
tensor([[-0.2593,  1.1362]], device='cuda:0', grad_fn=<AddmmBackward0>)
out=out.argmax(dim=1)
out
tensor([1], device='cuda:0')

【NLP】HuggingFace BERT 微博评论情感分类相关推荐

  1. 改进BERT的中文评论情感分类模型

    摘要 为了改善现有基于深度学习网络的中文评论情感分类方法,同时提高中文评论情感分类的正确率和效率,基于Tensorflow框架,对传统BERT模型进行改进,以Nlpcc2013和Nlpcc2014公开 ...

  2. 复盘:基于attention的多任务多模态情绪情感识别,基于BERT实现文本情感分类(pytorch实战)

    复盘:基于attention机制的多任务多模态情绪情感识别(pytorch实战),基于BERT实现文本情感分类 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对 ...

  3. 疫情微博文本情感分类 (简化版SMP2020赛题)

    编者按 代码仅供参考,欢迎交流:请勿用于任何形式的课程作业.如有任何错误,敬请批评指正~ Pytorch系列文章: Pytorch实验一:从零实现Logistic回归和Softmax回归 Pytorc ...

  4. 我的实践:pytorch框架下基于BERT实现文本情感分类

    当前,在BERT等预训练模型的基础上进行微调已经成了NLP任务的一个定式了.为了了解BERT怎么用,在这次实践中,我实现了一个最简单的NLP任务,即文本情感分类. 文章目录 1.基于BERT进行情感分 ...

  5. Python_001_旅游评论情感倾向性分析_000_分析(基于深度学习的微博评论情感倾向性分析_胡西祥)论文

    Python_001_旅游评论情感倾向性分析_000_分析论文-2020-8-21 知网链接:基于深度学习的微博评论情感倾向性分析 - 中国知网 (cnki.net) ps.只做分析概括 目录 一.论 ...

  6. 学习微博中情感分类的句子表达(NLPCC2013)

    学习微博中情感分类的句子表达(NLPCC2013) Learning sentence representation for emotion classification on microblogs ...

  7. bert中文文本情感分类 微博评论挖掘之Bert实战应用案例-文本情感分类

    Bert模型全称Bidirectional Encoder Representations from Transformers,主要分为两个部分:1训练语言模型(language model)的预训练 ...

  8. 利用LSTM+CNN+glove词向量预训练模型进行微博评论情感分析(二分类)

    先上代码和数据集 https://pan.baidu.com/s/1tpEKb0nCun2oxlBXGlPvxA 提取码:cryy 里面所需要的,都在文件里, 数据是微博评论(共12万,没记错的话,0 ...

  9. 微博评论情感分析(NLP,LSTM)

    一.一些说明 主要工作就是通过对120000条微博评论的数据集训练模型,预测评论的情绪倾向,将情绪结果简单的分为积极情绪和消极情绪. 虽然在训练集和测试集上表现的不错,但是经过自己的手动测试发现效果不 ...

  10. python微博评论情感分析_Python采集微博热评进行情感分析祝你狗年脱单

    Ps: 重要的事情说三遍!!! 结尾有彩蛋,结尾有彩蛋,结尾有彩蛋. 如果自己需要爬(cai)虫(ji)的数据量比较大,为了防止被网站封Ip,可以分时段爬取,另外对于爬到的数据一般是用来存储数据库,这 ...

最新文章

  1. 2021年新高考八省联考成绩查询福建,2021福建八省联考成绩查询时间
  2. Distributed TensorFlow
  3. 3pc在mysql的实现_面试官:了解分布式事务?讲讲你理解的2PC和3PC原理
  4. kali linux之edb--CrossFire缓冲区溢出
  5. c语言switch scanf语句,C语言中scanf函数与switch语句
  6. 九章算法 | Facebook 面试题 : Backpack VI 背包算法
  7. Linux基本操作——VI和VIM
  8. airpassengers数据集_12个Pandas amp;amp; Numpy函数:数据分析提速50%不是问题!
  9. java 蓝桥杯算法训练 s01串(题解)
  10. java okhttp设置超时_Java OkHttpClient.setWriteTimeout方法代码示例
  11. 在windows xp下,一块网卡绑定多个ip
  12. CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图
  13. Struts2.x教程(一) Struts2介绍
  14. 万有引力(Law of universal gravitation)
  15. java修改request的paramMap
  16. 【精选】OCR精选10个问题 百度paddleocr
  17. ubb转换html,UBB代码转换成HTML代码
  18. 1000+常用Python库一览
  19. 如何解决DNS解析错误
  20. 一个程序员的科幻小说

热门文章

  1. 中国教育行业市场行情动态及投资潜力研究报告(2022-2028年)
  2. 天天说大数据但不知怎么用?读完这篇你就懂了
  3. 自己做量化交易软件(26)小白量化事件回测之MetaTrader5自动回测
  4. 思科ASA防火墙部署和基本配置
  5. 720s ideapad 黑苹果_Hackintosh 黑苹果长期维护机型 EFI 及安装教程整理
  6. 巴特沃斯归一化数字低通滤波器参数、原理及使用方法
  7. Flash遮罩之溜光字制作一
  8. 机器人动力学——拉格朗日法
  9. 74HC20中WR讲解
  10. 如何在数学建模比赛中稳拿奖——个人100%获奖经验分享