【NLP】 BERT微博评论情感分类

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

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

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

文本处理

import pandas as pd
import numpy as np

df = pd.read_csv("weibo_senti_100k.csv", encoding="gbk")
df.head()

在这里插入图片描述

在这里插入图片描述

import re

df.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 torch

device = 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_split

X_train, X_test, y_train, y_test = train_test_split(df['sentence'].values, # ndarray
                                                    df['label'].values,
                                                    train_size=0.7,
                                                    random_state=100)
from torch.utils.data import Dataset, DataLoader
import torch

class MyDataset(Dataset):
    def __init__(self, X, y):
        self.X = X
        self.y = y

    def __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 tqdm

num_class=2

class BertClassificationModel(nn.Module):
    def __init__(self,hidden_size=768): # bert默认最后输出维度为768
        super(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 = False
        self.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_out

model=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 = 0
    total = 0
    for 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')

在这里插入图片描述

BERT(Bidirectional Encoder Representations from Transformers)是谷歌推出的一种基于Transformer的预训练语言表示模型,它在很多自然语言处理任务中取得了突破性的成绩,包括情感分析。在微博情感分析任务中,我们可以使用BERT来理解微博文本的情感倾向,例如判断一条微博是正面的、负面的还是中性的。 在Python中实现BERT微博情感分析,你需要安装transformers库,这是一个由Hugging Face团队维护的自然语言处理模型库,它提供了BERT等模型的实现。以下是一个简化的代码示例,展示如何使用Python和BERT进行微博情感分析: ```python from transformers import BertTokenizer, BertForSequenceClassification import torch # 加载预训练模型和分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertForSequenceClassification.from_pretrained('bert-base-chinese') # 微博文本 weibo_text = "这条微博内容非常精彩!" # 对微博文本进行编码 encoded_input = tokenizer(weibo_text, return_tensors='pt') # 使用模型进行预测 with torch.no_grad(): output = model(**encoded_input) # 获取预测结果 predictions = torch.nn.functional.softmax(output.logits, dim=-1) print(predictions) # 根据预测结果输出情感 # 假设模型输出的两个类别分别是正面和负面 sentiment = "正面" if predictions[0][0] > predictions[0][1] else "负面" print(f"情感分析结果:{sentiment}") ``` 在运行上述代码之前,请确保已经安装了`transformers`和`torch`库。你可以使用以下命令进行安装: ```bash pip install transformers torch ``` 注意:上述代码仅作为演示使用BERT模型进行情感分析的示例,并没有使用具体的微博情感分析数据集来训练模型。实际上,你需要一个专门针对微博情感分析的数据集来训练BERT模型,使其适应这一特定任务。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值