You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
3 months ago | |
|---|---|---|
| README.md | 3 months ago | |
| predict_demo.py | 3 months ago | |
| stopword.txt | 3 months ago | |
| 微博情感分析GPT5.py | 3 months ago | |
README.md
微博情感分析项目
基于深度学习的中文文本情感分析系统,支持 SVM 和 LSTM 双模型训练与预测。
📁 项目文件说明
主要代码文件
微博情感分析GPT5.py - 核心训练脚本
主要功能:
- 数据加载与预处理(文本清洗、分词、停用词过滤)
- SVM 基线模型训练(TF-IDF + LinearSVC)
- LSTM 深度学习模型训练(Embedding + BiLSTM)
- 词云生成与训练曲线可视化
- 模型评估与结果保存
- GPU 加速与混合精度训练支持
- 智能缓存机制(避免重复分词)
运行方式:
python 微博情感分析GPT5.py
predict_demo.py - 预测演示脚本
主要功能:
- 加载训练好的模型进行预测
- 支持 LSTM 和 SVM 两种模型
- 提供批量预测示例
- 格式化输出预测结果(带 emoji 显示)
运行方式:
python predict_demo.py
数据文件
weibo_senti_100k.csv - 训练数据集
- 内容:119,988 条微博文本及其情感标签
- 格式:CSV 文件,包含
label和review两列 - 标签:0=负面情感,1=正面情感
- 分布:正负样本各约 50%,数据平衡
stopword.txt - 中文停用词表
- 内容:常见中文停用词列表(如"的"、"了"、"在"等)
- 作用:分词后过滤无意义词汇,提升模型效果
- 编码:UTF-8
输出目录结构
outputs/ - 所有输出文件的根目录
outputs/models/ - 训练好的模型文件
| 文件名 | 说明 | 大小 | 用途 |
|---|---|---|---|
best_lstm.keras |
LSTM 模型文件 | ~50-100MB | 深度学习模型权重,用于加载预测 |
lstm_vocab.pkl |
LSTM 词表文件 | ~5-10MB | 包含 word2id、id2word、stopwords、config |
lstm_metadata.json |
LSTM 元数据 | <1KB | 模型架构、训练参数、性能指标 |
svm_model.pkl |
SVM 模型文件 | ~20-50MB | 包含 TF-IDF 向量器和 SVM 分类器 |
加载模型示例:
from tensorflow.keras.models import load_model
model = load_model("outputs/models/best_lstm.keras")
outputs/figs/ - 可视化图表
| 文件名 | 说明 | 预览 |
|---|---|---|
wordcloud.png |
词云图 | 展示训练数据中高频词汇的分布 |
training_history.png |
训练历史曲线 | 包含损失曲线和准确率曲线 |
lstm_model.png |
模型架构图 | LSTM 网络结构可视化(需要 pydot) |
词云图说明:
- 正面词汇用蓝绿色系显示
- 负面词汇用红橙色系显示
- 字体大小表示词频高低
训练曲线说明:
- 左图:训练损失 vs 验证损失
- 右图:训练准确率 vs 验证准确率
- 用于诊断过拟合/欠拟合问题
outputs/cache/ - 数据缓存目录
- 作用:缓存分词结果,避免重复计算
- 文件格式:
.pkl二进制文件 - 命名规则:
tokenized_{哈希值}_{样本数}.pkl - 清理方式:手动删除或使用
cache.clear()
outputs/logs/ - TensorBoard 日志
logs/
├── train/
│ └── events.out.tfevents.*
└── validation/
└── events.out.tfevents.*
查看方式:
tensorboard --logdir outputs/logs
outputs/training.log - 训练日志文件
- 内容:完整的训练过程日志
- 格式:时间戳 - 日志级别 - 消息内容
- 包含信息:
- GPU 配置信息
- 数据加载进度
- 分词处理进度
- 模型训练过程
- 评估结果
- 错误/警告信息
outputs/summary.json - 训练结果摘要
JSON 结构:
{
"timestamp": "2025-11-20T19:38:39",
"config": {...}, // 所有配置参数
"gpu_info": {
"has_gpu": true,
"mixed_precision": true
},
"data_info": {
"total_samples": 119988,
"train_samples": 86391,
"val_samples": 9600,
"test_samples": 23997,
"vocab_size": 46607
},
"metrics": {
"svm": {
"accuracy": 0.6783,
"f1": 0.6974
},
"lstm": {
"accuracy": 0.6974,
"f1": 0.7202
}
}
}
🚀 快速开始
1. 环境配置
必需依赖:
pip install tensorflow>=2.8.0
pip install pandas numpy scikit-learn
pip install jieba wordcloud matplotlib tqdm
可选依赖(推荐):
pip install pydot graphviz # 用于绘制模型架构图
2. 训练模型
python 微博情感分析GPT5.py
训练流程:
- ✅ 加载数据(119,988 条微博)
- ✅ 加载停用词表
- ✅ 文本分词与清洗(首次运行约 10 分钟,后续使用缓存秒级完成)
- ✅ 生成词云图 →
outputs/figs/wordcloud.png - ✅ 数据集划分(训练/验证/测试)
- ✅ 训练 SVM 基线模型 →
outputs/models/svm_model.pkl - ✅ 准备 LSTM 数据(构建词表、序列化)
- ✅ 训练 LSTM 模型 →
outputs/models/best_lstm.keras - ✅ 评估模型性能
- ✅ 保存所有结果
预计时间:
- 首次运行:~15-20 分钟(包含分词)
- 后续运行:~5-8 分钟(使用缓存)
3. 使用模型预测
方式一:运行演示脚本
python predict_demo.py
方式二:编程调用
from 微博情感分析GPT5 import SentimentPredictor
# 加载 LSTM 预测器
predictor = SentimentPredictor(
model_path="outputs/models/best_lstm.keras",
vocab_path="outputs/models/lstm_vocab.pkl",
model_type="lstm"
)
# 单条预测
text = "这家餐厅太好吃了,服务也很棒!"
label, prob = predictor.predict_text(text)
print(f"情感: {'正面😊' if label == 1 else '负面😞'}, 置信度: {prob:.2%}")
# 批量预测
texts = ["很满意", "太失望了", "一般般"]
results = predictor.predict_batch(texts)
for text, (label, prob) in zip(texts, results):
print(f"{text} → {label} ({prob:.2%})")
⚙️ 核心功能特性
✨ 双模型架构
SVM 基线模型
- 特征提取:TF-IDF(1-2 gram)
- 分类器:LinearSVC(线性支持向量机)
- 优势:训练快速、可解释性强
- 性能:准确率 ~68%,F1 ~70%
LSTM 深度学习模型
- 架构:Embedding → BiLSTM → Dense
- 正则化:L2 正则化 + Dropout(0.3-0.4)
- 优化器:Adam(学习率 0.002)
- 优势:捕捉长距离依赖、性能更优
- 性能:准确率 ~70%,F1 ~72%
🚀 性能优化技术
| 优化项 | 说明 | 加速效果 |
|---|---|---|
| GPU 加速 | 自动检测 GPU 并启用 CUDA | 2-3x |
| 混合精度训练 | FP16 计算 + FP32 累加 | 1.5-2x |
| cuDNN 优化 | LSTM 使用 cuDNN 内核 | 1.5-2x |
| tf.data Pipeline | 数据预加载与并行处理 | 1.3-1.5x |
| 自适应 Batch Size | GPU 模式自动调整为 256 | 1.2x |
| 数据缓存 | 分词结果缓存避免重复计算 | 10-50x(二次运行) |
| 并行分词 | 多进程分词(可选) | 3-5x |
| 综合效果 | 相比原始版本 | 5-10x |
📊 训练过程监控
实时日志
2025-11-20 19:37:35 - INFO - GPU 可用: True, 数量: 1
2025-11-20 19:37:35 - INFO - 混合精度训练已启用
2025-11-20 19:37:35 - INFO - 开始微博情感分析训练
...
Epoch 1/10
338/338 [==============================] - 12s 28ms/step
- loss: 0.5978 - accuracy: 0.6682 - val_accuracy: 0.7011
TensorBoard 可视化
tensorboard --logdir outputs/logs
- 实时训练曲线
- 权重分布直方图
- 学习率变化
- 验证集性能
训练回调机制
- EarlyStopping:验证准确率 5 轮不提升则停止
- ModelCheckpoint:自动保存最佳模型
- ReduceLROnPlateau:验证损失不降则减小学习率
- TensorBoard:记录训练过程到日志
🔧 配置参数说明
在 微博情感分析GPT5.py 中修改 Config 类:
@dataclass
class Config:
# ========== 数据路径 ==========
data_csv: str = "weibo_senti_100k.csv" # 训练数据
stopword_txt: str = "stopword.txt" # 停用词表
output_dir: str = "outputs" # 输出根目录
# ========== 模型参数 ==========
maxlen: int = 128 # 序列最大长度(截断/填充)
embed_dim: int = 256 # 词嵌入维度
lstm_units: int = 128 # LSTM 隐藏单元数
batch_size: int = 64 # 批次大小(GPU 自动调整为 256)
epochs: int = 10 # 最大训练轮数
learning_rate: float = 2e-3 # 初始学习率
# ========== 数据处理 ==========
min_freq: int = 2 # 词频阈值(低于此值的词过滤)
max_vocab: int = 100000 # 词表最大容量
test_size: float = 0.2 # 测试集比例
val_split: float = 0.1 # 验证集比例
# ========== 性能优化 ==========
use_mixed_precision: bool = True # 混合精度训练(FP16)
gpu_memory_growth: bool = True # GPU 内存动态增长
enable_cache: bool = True # 启用数据缓存
parallel_processing: bool = False # 并行分词(默认关闭)
num_workers: int = 4 # 并行进程数
# ========== 功能开关 ==========
enable_wordcloud: bool = True # 生成词云
fast_debug: bool = False # 快速调试模式(小样本)
关键参数调优建议
| 参数 | 默认值 | 调优建议 |
|---|---|---|
maxlen |
128 | 增大可捕捉更长文本,但会增加显存占用 |
embed_dim |
256 | 降低可减少显存,但可能影响性能 |
lstm_units |
128 | 增大可提升性能,但训练更慢 |
batch_size |
64/256 | GPU 模式建议 128-512,CPU 建议 32-64 |
learning_rate |
0.002 | 过拟合时降低,欠拟合时提高 |
min_freq |
2 | 增大可减小词表,降低过拟合 |
📈 性能评估
模型对比(测试集 23,998 样本)
| 模型 | 准确率 | F1 分数 | 训练时间 | 推理速度 |
|---|---|---|---|---|
| SVM | 67.83% | 69.74% | ~2 分钟 | ~0.1ms/条 |
| LSTM | 69.74% | 72.02% | ~5 分钟 | ~0.5ms/条 |
详细分类报告(LSTM)
precision recall f1-score support
0 0.7359 0.6157 0.6705 11999
1 0.6697 0.7791 0.7202 11999
accuracy 0.6974 23998
解读:
- 正面情感召回率更高(77.91%)
- 负面情感精确率更高(73.59%)
- 模型对正面情感的识别能力较强
❓ 常见问题
Q1: 内存不足怎么办?
症状: MemoryError 或 OOM (Out of Memory)
解决方案:
- 减小
batch_size:64 → 32 → 16 - 减小模型维度:
embed_dim=128,lstm_units=64 - 关闭并行分词:
parallel_processing=False(默认已关闭) - 启用快速调试:
fast_debug=True(只用 2000 样本训练) - 减小词表:
max_vocab=50000
Q2: 如何启用并行分词加速?
条件: 系统内存 ≥ 16GB,数据量 > 50,000 条
设置方法:
config.parallel_processing = True
config.num_workers = 2 # 建议 2-4 个进程
⚠️ 警告: 每个进程需加载 ~100MB jieba 模型,注意内存占用。
Q3: 训练曲线中文显示为方框?
原因: matplotlib 默认字体不支持中文
解决: 已自动修复,程序会根据操作系统选择合适字体:
- Windows: 微软雅黑/黑体
- macOS: PingFang SC
- Linux: 文泉驿微米黑
Q4: 如何查看 TensorBoard?
tensorboard --logdir outputs/logs
# 访问 http://localhost:6006
Q5: 如何清除缓存?
方法一: 手动删除
rm -rf outputs/cache/*
方法二: 代码清除
from 微博情感分析GPT5 import cache
cache.clear() # 清除所有缓存
cache.clear("tokenized_xxx") # 清除指定缓存
Q6: 模型过拟合怎么办?
现象: 训练准确率高(>85%),验证准确率低(<75%)
解决:
- ✅ 已添加 L2 正则化(1e-6)
- ✅ 已增加 Dropout(0.3-0.4)
- ✅ 已启用 EarlyStopping(patience=5)
- 可进一步增大
min_freq减小词表 - 可使用数据增强(同义词替换等)
Q7: 只训练某一个模型?
修改 main() 函数:
只训练 LSTM:
# 注释掉 SVM 部分
# svm_model, tfidf_vectorizer, svm_metrics = svm_baseline_tfidf(...)
只训练 SVM:
# 注释掉 LSTM 部分
# model, history = train_lstm(...)
Q8: 如何使用自己的数据集?
数据格式要求: CSV 文件,包含两列
label或sentiment:标签(0/1)review或text:文本内容
步骤:
- 替换
weibo_senti_100k.csv - 修改
config.data_csv路径 - 运行训练脚本
📄 License
MIT License
🙏 致谢
- 数据集:微博情感分析数据集
- 分词工具:jieba 中文分词
- 深度学习框架:TensorFlow/Keras
- 可视化:matplotlib, wordcloud, TensorBoard
📮 联系方式
如有问题或建议,欢迎提出 Issue 或 Pull Request。