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.
hut22412030111 03325bd895
ADD file via upload
3 months ago
README.md ADD file via upload 3 months ago
predict_demo.py ADD file via upload 3 months ago
stopword.txt ADD file via upload 3 months ago
微博情感分析GPT5.py ADD file via upload 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 文件,包含 labelreview 两列
  • 标签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

访问 http://localhost:6006

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

训练流程:

  1. 加载数据119,988 条微博)
  2. 加载停用词表
  3. 文本分词与清洗(首次运行约 10 分钟,后续使用缓存秒级完成)
  4. 生成词云图 → outputs/figs/wordcloud.png
  5. 数据集划分(训练/验证/测试)
  6. 训练 SVM 基线模型 → outputs/models/svm_model.pkl
  7. 准备 LSTM 数据(构建词表、序列化)
  8. 训练 LSTM 模型 → outputs/models/best_lstm.keras
  9. 评估模型性能
  10. 保存所有结果

预计时间:

  • 首次运行:~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-IDF1-2 gram
  • 分类器LinearSVC线性支持向量机
  • 优势:训练快速、可解释性强
  • 性能:准确率 ~68%F1 ~70%

LSTM 深度学习模型

  • 架构Embedding → BiLSTM → Dense
  • 正则化L2 正则化 + Dropout0.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-512CPU 建议 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: 内存不足怎么办?

症状: MemoryErrorOOM (Out of Memory)

解决方案:

  1. 减小 batch_size64 → 32 → 16
  2. 减小模型维度:embed_dim=128, lstm_units=64
  3. 关闭并行分词:parallel_processing=False(默认已关闭)
  4. 启用快速调试:fast_debug=True(只用 2000 样本训练)
  5. 减小词表: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
  • 已增加 Dropout0.3-0.4
  • 已启用 EarlyStoppingpatience=5
  • 可进一步增大 min_freq 减小词表
  • 可使用数据增强(同义词替换等)

Q7: 只训练某一个模型?

修改 main() 函数:

只训练 LSTM

# 注释掉 SVM 部分
# svm_model, tfidf_vectorizer, svm_metrics = svm_baseline_tfidf(...)

只训练 SVM

# 注释掉 LSTM 部分
# model, history = train_lstm(...)

Q8: 如何使用自己的数据集?

数据格式要求: CSV 文件,包含两列

  • labelsentiment标签0/1
  • reviewtext:文本内容

步骤:

  1. 替换 weibo_senti_100k.csv
  2. 修改 config.data_csv 路径
  3. 运行训练脚本

📄 License

MIT License


🙏 致谢

  • 数据集:微博情感分析数据集
  • 分词工具jieba 中文分词
  • 深度学习框架TensorFlow/Keras
  • 可视化matplotlib, wordcloud, TensorBoard

📮 联系方式

如有问题或建议,欢迎提出 Issue 或 Pull Request。