陕西商城网站建设,大连门户网站开发,长春国企招聘网官网,哪个网站可以免费下载电视剧看基于BERT的情感分析
1. 项目背景
情感分析#xff08;Sentiment Analysis#xff09;是自然语言处理的重要应用之一#xff0c;用于判断文本的情感倾向#xff0c;如正面、负面或中性。随着深度学习的发展#xff0c;预训练语言模型如BERT在各种自然语言处理任务中取得了…基于BERT的情感分析
1. 项目背景
情感分析Sentiment Analysis是自然语言处理的重要应用之一用于判断文本的情感倾向如正面、负面或中性。随着深度学习的发展预训练语言模型如BERT在各种自然语言处理任务中取得了显著的效果。本项目利用预训练语言模型BERT构建一个能够对文本进行情感分类的模型。 2. 项目结构
sentiment-analysis/
├── data/
│ ├── train.csv # 训练数据集
│ ├── test.csv # 测试数据集
├── src/
│ ├── preprocess.py # 数据预处理模块
│ ├── train.py # 模型训练脚本
│ ├── evaluate.py # 模型评估脚本
│ ├── inference.py # 模型推理脚本
│ ├── utils.py # 工具函数可选
├── models/
│ ├── bert_model.pt # 保存的模型权重
├── logs/
│ ├── training.log # 训练日志可选
├── README.md # 项目说明文档
├── requirements.txt # 依赖包列表
└── run.sh # 一键运行脚本3. 环境准备
3.1 系统要求
Python 3.6 或以上版本GPU可选但建议使用以加速训练
3.2 安装依赖
建议在虚拟环境中运行。安装所需的依赖包
pip install -r requirements.txtrequirements.txt内容
torch1.7.0
transformers4.0.0
pandas
scikit-learn
tqdm4. 数据准备
4.1 数据格式
数据文件train.csv和test.csv的格式如下
textlabelI love this product.1This is a bad movie.0
text输入文本label目标标签1为正面情感0为负面情感
将数据文件保存至data/目录下。
4.2 数据集划分
可以使用train_test_split将数据划分为训练集和测试集。 5. 代码实现
5.1 数据预处理 (src/preprocess.py)
import pandas as pd
from transformers import BertTokenizer
from torch.utils.data import Dataset
import torchclass SentimentDataset(Dataset):自定义的用于情感分析的Dataset。def __init__(self, data_path, tokenizer, max_len128):初始化Dataset。Args:data_path (str): 数据文件的路径。tokenizer (BertTokenizer): BERT的分词器。max_len (int): 最大序列长度。self.data pd.read_csv(data_path)self.tokenizer tokenizerself.max_len max_lendef __len__(self):返回数据集的大小。return len(self.data)def __getitem__(self, idx):根据索引返回一条数据。Args:idx (int): 数据索引。Returns:dict: 包含input_ids、attention_mask和label的字典。text str(self.data.iloc[idx][text])label int(self.data.iloc[idx][label])encoding self.tokenizer(text, paddingmax_length, truncationTrue, max_lengthself.max_len, return_tensorspt)return {input_ids: encoding[input_ids].squeeze(0), # shape: [seq_len]attention_mask: encoding[attention_mask].squeeze(0), # shape: [seq_len]label: torch.tensor(label, dtypetorch.long) # shape: []}5.2 模型训练 (src/train.py)
import torch
from torch.utils.data import DataLoader
from transformers import BertForSequenceClassification, AdamW, BertTokenizer, get_linear_schedule_with_warmup
from preprocess import SentimentDataset
import argparse
import os
from tqdm import tqdmdef train_model(data_path, model_save_path, batch_size16, epochs3, lr2e-5, max_len128):训练BERT情感分析模型。Args:data_path (str): 训练数据的路径。model_save_path (str): 模型保存的路径。batch_size (int): 批次大小。epochs (int): 训练轮数。lr (float): 学习率。max_len (int): 最大序列长度。# 初始化分词器和数据集tokenizer BertTokenizer.from_pretrained(bert-base-uncased)dataset SentimentDataset(data_path, tokenizer, max_lenmax_len)# 划分训练集和验证集train_size int(0.8 * len(dataset))val_size len(dataset) - train_sizetrain_dataset, val_dataset torch.utils.data.random_split(dataset, [train_size, val_size])# 数据加载器train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)val_loader DataLoader(val_dataset, batch_sizebatch_size)# 初始化模型model BertForSequenceClassification.from_pretrained(bert-base-uncased, num_labels2)# 优化器和学习率调度器optimizer AdamW(model.parameters(), lrlr)total_steps len(train_loader) * epochsscheduler get_linear_schedule_with_warmup(optimizer, num_warmup_steps0, num_training_stepstotal_steps)# 设备设置device torch.device(cuda if torch.cuda.is_available() else cpu)model.to(device)# 训练循环for epoch in range(epochs):model.train()total_loss 0progress_bar tqdm(train_loader, descfEpoch {epoch 1}/{epochs})for batch in progress_bar:optimizer.zero_grad()input_ids batch[input_ids].to(device) # shape: [batch_size, seq_len]attention_mask batch[attention_mask].to(device) # shape: [batch_size, seq_len]labels batch[label].to(device) # shape: [batch_size]outputs model(input_ids, attention_maskattention_mask, labelslabels)loss outputs.lossloss.backward()optimizer.step()scheduler.step()total_loss loss.item()progress_bar.set_postfix(lossloss.item())avg_train_loss total_loss / len(train_loader)print(fEpoch {epoch 1}/{epochs}, Average Loss: {avg_train_loss:.4f})# 验证模型model.eval()val_loss 0correct 0total 0with torch.no_grad():for batch in val_loader:input_ids batch[input_ids].to(device)attention_mask batch[attention_mask].to(device)labels batch[label].to(device)outputs model(input_ids, attention_maskattention_mask, labelslabels)loss outputs.losslogits outputs.logitsval_loss loss.item()preds torch.argmax(logits, dim1)correct (preds labels).sum().item()total labels.size(0)avg_val_loss val_loss / len(val_loader)val_accuracy correct / totalprint(fValidation Loss: {avg_val_loss:.4f}, Accuracy: {val_accuracy:.4f})# 保存模型os.makedirs(os.path.dirname(model_save_path), exist_okTrue)torch.save(model.state_dict(), model_save_path)print(fModel saved to {model_save_path})if __name__ __main__:parser argparse.ArgumentParser(descriptionTrain BERT model for sentiment analysis)parser.add_argument(--data_path, typestr, defaultdata/train.csv, helpPath to training data)parser.add_argument(--model_save_path, typestr, defaultmodels/bert_model.pt, helpPath to save the trained model)parser.add_argument(--batch_size, typeint, default16, helpBatch size)parser.add_argument(--epochs, typeint, default3, helpNumber of training epochs)parser.add_argument(--lr, typefloat, default2e-5, helpLearning rate)parser.add_argument(--max_len, typeint, default128, helpMaximum sequence length)args parser.parse_args()train_model(data_pathargs.data_path,model_save_pathargs.model_save_path,batch_sizeargs.batch_size,epochsargs.epochs,lrargs.lr,max_lenargs.max_len)5.3 模型评估 (src/evaluate.py)
import torch
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
from preprocess import SentimentDataset
from torch.utils.data import DataLoader
from transformers import BertForSequenceClassification, BertTokenizer
import argparse
from tqdm import tqdmdef evaluate_model(data_path, model_path, batch_size16, max_len128):评估BERT情感分析模型。Args:data_path (str): 测试数据的路径。model_path (str): 训练好的模型的路径。batch_size (int): 批次大小。max_len (int): 最大序列长度。# 初始化分词器和数据集tokenizer BertTokenizer.from_pretrained(bert-base-uncased)dataset SentimentDataset(data_path, tokenizer, max_lenmax_len)loader DataLoader(dataset, batch_sizebatch_size)# 加载模型model BertForSequenceClassification.from_pretrained(bert-base-uncased, num_labels2)model.load_state_dict(torch.load(model_path, map_locationtorch.device(cpu)))model.eval()# 设备设置device torch.device(cuda if torch.cuda.is_available() else cpu)model.to(device)all_preds []all_labels []with torch.no_grad():for batch in tqdm(loader, descEvaluating):input_ids batch[input_ids].to(device)attention_mask batch[attention_mask].to(device)labels batch[label].to(device)outputs model(input_ids, attention_maskattention_mask)logits outputs.logitspreds torch.argmax(logits, dim1)all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())accuracy accuracy_score(all_labels, all_preds)precision, recall, f1, _ precision_recall_fscore_support(all_labels, all_preds, averagebinary)print(fAccuracy: {accuracy:.4f})print(fPrecision: {precision:.4f}, Recall: {recall:.4f}, F1-score: {f1:.4f})if __name__ __main__:parser argparse.ArgumentParser(descriptionEvaluate BERT model for sentiment analysis)parser.add_argument(--data_path, typestr, defaultdata/test.csv, helpPath to test data)parser.add_argument(--model_path, typestr, defaultmodels/bert_model.pt, helpPath to the trained model)parser.add_argument(--batch_size, typeint, default16, helpBatch size)parser.add_argument(--max_len, typeint, default128, helpMaximum sequence length)args parser.parse_args()evaluate_model(data_pathargs.data_path,model_pathargs.model_path,batch_sizeargs.batch_size,max_lenargs.max_len)5.4 推理 (src/inference.py)
import torch
from transformers import BertTokenizer, BertForSequenceClassification
import argparsedef predict_sentiment(text, model_path, max_len128):对输入的文本进行情感预测。Args:text (str): 输入的文本。model_path (str): 训练好的模型的路径。max_len (int): 最大序列长度。Returns:str: 预测的情感类别。# 初始化分词器和模型tokenizer BertTokenizer.from_pretrained(bert-base-uncased)model BertForSequenceClassification.from_pretrained(bert-base-uncased, num_labels2)model.load_state_dict(torch.load(model_path, map_locationtorch.device(cpu)))model.eval()# 设备设置device torch.device(cuda if torch.cuda.is_available() else cpu)model.to(device)# 数据预处理inputs tokenizer(text, return_tensorspt, truncationTrue, paddingmax_length, max_lengthmax_len)inputs {key: value.to(device) for key, value in inputs.items()}# 模型推理with torch.no_grad():outputs model(**inputs)logits outputs.logitsprediction torch.argmax(logits, dim1).item()sentiment Positive if prediction 1 else Negativereturn sentimentif __name__ __main__:parser argparse.ArgumentParser(descriptionInference script for sentiment analysis)parser.add_argument(--text, typestr, requiredTrue, helpInput text for sentiment prediction)parser.add_argument(--model_path, typestr, defaultmodels/bert_model.pt, helpPath to the trained model)parser.add_argument(--max_len, typeint, default128, helpMaximum sequence length)args parser.parse_args()sentiment predict_sentiment(textargs.text,model_pathargs.model_path,max_lenargs.max_len)print(fInput Text: {args.text})print(fPredicted Sentiment: {sentiment})6. 项目运行
6.1 一键运行脚本 (run.sh)
#!/bin/bash# 训练模型
python src/train.py --data_pathdata/train.csv --model_save_pathmodels/bert_model.pt# 评估模型
python src/evaluate.py --data_pathdata/test.csv --model_pathmodels/bert_model.pt# 推理示例
python src/inference.py --textI love this movie! --model_pathmodels/bert_model.pt6.2 单独运行
6.2.1 训练模型
python src/train.py --data_pathdata/train.csv --model_save_pathmodels/bert_model.pt --epochs3 --batch_size166.2.2 评估模型
python src/evaluate.py --data_pathdata/test.csv --model_pathmodels/bert_model.pt6.2.3 模型推理
python src/inference.py --textThis product is great! --model_pathmodels/bert_model.pt7. 结果展示
7.1 训练结果
损失下降曲线可以使用matplotlib或tensorboard绘制训练过程中的损失变化。训练日志在logs/training.log中记录训练过程。
7.2 模型评估
准确率Accuracy模型在测试集上的准确率。精确率、召回率、F1-score更全面地评估模型性能。
7.3 推理示例
示例
python src/inference.py --textI absolutely love this! --model_pathmodels/bert_model.pt输出
Input Text: I absolutely love this!
Predicted Sentiment: Positive8. 注意事项
模型保存与加载确保模型保存和加载时的路径正确特别是在使用相对路径时。设备兼容性代码中已考虑CPU和GPU的兼容性确保设备上安装了相应的PyTorch版本。依赖版本依赖的库版本可能会影响代码运行建议使用requirements.txt中指定的版本。 9. 参考资料
BERT论文Hugging Face Transformers文档PyTorch官方文档