[TOC]
构建第一个情感分析模型
导入所需库
import torch
from transformers import BertTokenizer, BertForSequenceClassification, AdamW
from torch.utils.data import DataLoader, Dataset, random_split
import pandas as pd
from tqdm import tqdm
import random
CopyInsert
torch
:PyTorch库,用于构建和训练深度学习模型。transformers
:Hugging Face的Transformers库,提供预训练的模型和分词器。DataLoader
,Dataset
:用于处理数据集和生成批量数据的工具。pandas
:用于数据处理和分析的库。tqdm
:用于显示循环进度的库。random
:用于生成随机数和打乱数据。
读取训练数据集
df = pd.read_csv("weibo_senti_100k.csv")
CopyInsert
- 通过
pandas
读取CSV文件中的情感数据集。
加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained('bert-base-chinese')
CopyInsert
- 加载中文BERT分词器和模型,用于序列分类任务(情感分类)。
设置随机种子并打乱数据
random.seed(42)
df = df.sample(frac=1).reset_index(drop=True)
CopyInsert
- 设置随机种子以确保结果的可重复性。
- 随机打乱数据集中的行顺序,有助于提高模型训练的泛化能力。
定义情感数据集类
class SentimentDataset(Dataset):
def __init__(self, dataframe, tokenizer, max_length=128):
self.dataframe = dataframe
self.tokenizer = tokenizer
self.max_length = max_length
def __len__(self):
return len(self.dataframe)
def __getitem__(self, idx):
text = self.dataframe.iloc[idx]['review']
label = self.dataframe.iloc[idx]['label']
encoding = self.tokenizer(text, padding='max_length', truncation=True, max_length=self.max_length, return_tensors='pt')
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
CopyInsert
- 定义了一个
SentimentDataset
类,继承自Dataset
,用于处理和返回单个数据样本及其标签。 __getitem__
方法负责对单个文本进行分词处理。
创建数据集对象
dataset = SentimentDataset(df[:1500], tokenizer)
CopyInsert
- 创建
SentimentDataset
实例,使用前1500个样本作为数据集。
划分训练集和验证集
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])
CopyInsert
- 将数据集划分为80%的训练集和20%的验证集。
创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=8, shuffle=False)
CopyInsert
- 使用
DataLoader
为训练集和验证集创建批量数据加载器。
设置训练参数
optimizer = AdamW(model.parameters(), lr=5e-5)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
CopyInsert
- 使用AdamW优化器,并设置学习率。
- 检测可用的设备(GPU或CPU),并将模型移动到相应设备上。
训练模型
model.train()
for epoch in range(3):
for batch in tqdm(train_loader, desc="Epoch {}".format(epoch + 1)):
...
optimizer.step()
CopyInsert
- 开始训练,进行3个周期(epoch)的训练。
- 每个批次的数据会被传递给模型,通过前向传播计算损失,然后反向传播优化模型参数。
评估模型
model.eval()
total_eval_accuracy = 0
for batch in tqdm(val_loader, desc="Evaluating"):
...
average_eval_accuracy = total_eval_accuracy / len(val_loader)
print("Validation Accuracy:", average_eval_accuracy)
CopyInsert
- 评估模型在验证集上的表现,计算准确率。
定义预测函数
def predict_sentiment(sentence):
...
CopyInsert
- 定义了一个函数用于预测输入句子的情感,并输出正面情感的概率。
测试一个句子
predict_sentiment("气死我了")
CopyInsert
- 使用微调后的模型对一句测试语句进行情感预测。