基于数据挖掘的微博情感分析及话题追踪系统

摘要 :随着社交媒体的普及,微博等平台成为了公众表达意见、宣泄情感的重要场所。海量的用户评论数据中蕴含着极具价值的舆情信息。本文介绍了一个基于Python数据挖掘技术的微博情感分析及话题追踪系统。该系统利用机器学习(XGBoost、随机森林等)和深度学习(MLP)算法对微博评论进行情感倾向判断,并结合Flask Web框架开发了可视化的舆情监控平台,实现了单条文本分析、批量历史记录管理、特定话题的舆情追踪及可视化展示功能。

关键词:情感分析;数据挖掘;NLP;Flask;XGBoost;LSTM;话题追踪

系统演示视频:https://www.bilibili.com/video/BV1pkSiBPEfe/

1. 项目背景与意义

在互联网大数据时代,网络舆情对社会事件的发展有着重要影响。如何从海量的碎片化文本中快速提取公众的情感倾向,追踪热点话题的舆论走向,对于企业品牌监控、政府舆情引导以及社会治理都具有重要意义。

本项目旨在构建一个自动化的情感分析系统,通过自然语言处理(NLP)技术对中文微博文本进行清洗、特征提取和分类,并以Web应用的形式提供友好的用户交互界面,帮助用户实时掌握舆情动态。

2. 系统总体架构

本系统采用 B/S 架构,后端基于 Python Flask 框架,前端使用 Bootstrap 进行响应式布局。核心数据处理流程包括:

  1. 数据层:使用 SQLite 存储用户信息、情感分析记录和话题追踪配置;使用 CSV 文件存储训练数据集。

  2. 算法层

  • 预处理:Jieba分词、去停用词、正则清洗。
  • 特征工程:TF-IDF 文本向量化。
  • 模型库:集成 Logistic Regression, Random Forest, XGBoost, MLP 以及 LSTM 深度学习模型。
  1. 应用层:提供用户认证、仪表盘、实时分析、历史查询、话题管理和数据可视化功能。

3. 数据挖掘与算法建模

3.1 数据集与预处理

项目使用包含 10万+ 条微博评论的 `weibo_senti_100k.csv` 数据集,标签分为 0 (负面) 和 1 (正面)。

数据清洗关键代码

python 复制代码
import jieba
import re

def preprocess_text(text):
    # 1. 移除特殊字符和数字,只保留中文和字母
    text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z]', ' ', str(text))
    # 2. 移除多余空格
    text = ' '.join(text.split())
    
    # 3. Jieba分词
    words = jieba.lcut(text)
    
    # 4. 过滤停用词和短词
    stop_words = {'的', '了', '在', '是', '我', '有', '和', '就', '不', ...}
    words = [word for word in words if len(word) > 1 and word not in stop_words]
    
    return ' '.join(words)

样本标签分布

中文分词与可视化:

python 复制代码
# 中文分词
def segment_text(text):
    """
    中文分词函数
    """
    if pd.isna(text) or text == "":
        return []
    
    # 使用jieba分词
    words = jieba.lcut(text)
    
    # 过滤停用词和短词
    stop_words = {'的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'}
    words = [word for word in words if len(word) > 1 and word not in stop_words]
    
    return words

print("开始中文分词...")
df['segmented_words'] = df['cleaned_review'].apply(segment_text)
df['segmented_text'] = df['segmented_words'].apply(lambda x: ' '.join(x))

print("分词完成!")
print("分词示例(前3条):")
for i in range(3):
    print(f"原文: {df.iloc[i]['cleaned_review'][:50]}...")
    print(f"分词: {df.iloc[i]['segmented_text'][:50]}...")
    print("-" * 50)

3.2 特征提取 (TF-IDF)

使用 `sklearn.feature_extraction.text.TfidfVectorizer` 将分词后的文本转换为向量。

python 复制代码
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(
    max_features=5000,      # 保留词频最高的5000个词
    ngram_range=(1, 2),     # 使用1-gram和2-gram
    min_df=2,               # 忽略出现频率极低的词
    max_df=0.95             # 忽略出现频率极高的通用词
)
X = vectorizer.fit_transform(corpus)

3.3 模型训练与对比

项目实现了多种模型的训练与评估。

3.3.1 传统机器学习模型

通过 `simple_model_training.py` 脚本训练了逻辑回归、随机森林、XGBoost 和 MLP。其中 **XGBoost** 通常表现最佳,具有较高的准确率和泛化能力。

python 复制代码
# XGBoost 模型配置
from xgboost import XGBClassifier

model = XGBClassifier(
    n_estimators=100,
    max_depth=6,
    learning_rate=0.1,
    random_state=42,
    eval_metric='logloss'
)
model.fit(X_train_tfidf, y_train)

3.3.2 深度学习模型 (多层感知机)

python 复制代码
# 标准化特征(对于神经网络很重要)
scaler = StandardScaler(with_mean=False)  # 稀疏矩阵不能计算均值
X_train_scaled = scaler.fit_transform(X_train_tfidf)
X_test_scaled = scaler.transform(X_test_tfidf)

# 多层感知机(MLP)模型
mlp_model = MLPClassifier(
    hidden_layer_sizes=(128, 64),  # 两个隐藏层
    activation='relu',
    solver='adam',
    alpha=0.001,
    batch_size='auto',
    learning_rate='constant',
    learning_rate_init=0.001,
    max_iter=200,
    random_state=42,
    early_stopping=True,
    validation_fraction=0.1
)

3.3.3 模型对比

python 复制代码
# 模型性能对比
models_performance = {
    '逻辑回归': {'accuracy': lr_acc, 'auc': lr_auc},
    '随机森林': {'accuracy': rf_acc, 'auc': rf_auc},
    'XGBoost': {'accuracy': xgb_acc, 'auc': xgb_auc},
    '多层感知机': {'accuracy': mlp_acc, 'auc': mlp_auc}
}

# 创建性能对比图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 准确率对比
models = list(models_performance.keys())
accuracies = [models_performance[model]['accuracy'] for model in models]
aucs = [models_performance[model]['auc'] for model in models]

ax1.bar(models, accuracies, color=['skyblue', 'lightgreen', 'orange', 'pink'])
ax1.set_title('模型准确率对比')
ax1.set_ylabel('准确率')
ax1.set_ylim(0.8, 1.0)
for i, acc in enumerate(accuracies):
    ax1.text(i, acc + 0.005, f'{acc:.4f}', ha='center')

# AUC对比
ax2.bar(models, aucs, color=['skyblue', 'lightgreen', 'orange', 'pink'])
ax2.set_title('模型AUC对比')
ax2.set_ylabel('AUC')
ax2.set_ylim(0.8, 1.0)
for i, auc in enumerate(aucs):
    ax2.text(i, auc + 0.005, f'{auc:.4f}', ha='center')

plt.tight_layout()
plt.show()

# 打印性能总结
print("\n=== 模型性能总结 ===")
for model, performance in models_performance.items():
    print(f"{model}: 准确率={performance['accuracy']:.4f}, AUC={performance['auc']:.4f}")

4. Web系统设计与实现

4.1 核心功能模块

  1. 用户仪表板 (Dashboard):

* 展示总分析次数、正负面情感比例、话题追踪数量。

* 显示最近一周的情感趋势图表。

  1. 情感分析 (Sentiment Analysis):

* 用户输入一段文本,选择模型(默认推荐 XGBoost)。

* 后端调用预训练模型进行预测,返回情感标签(正面/负面)和置信度。

* 结果实时展示,并保存至数据库。

  1. 话题追踪 (Topic Tracking):

* 用户创建话题,定义关键词(支持多关键词组合)。

* 系统自动扫描历史分析记录,匹配包含关键词的文本。

* 统计该话题下的舆情分布(正负面比例)及随时间的变化趋势。

  1. 数据可视化 (Visualization):

* 使用 ECharts 或 Chart.js 展示情感分布饼图、置信度分布直方图等。

4.2 关键代码实现

**后端预测接口 (`app.py`)**:

python 复制代码
@app.route('/api/sentiment', methods=['POST'])
@login_required
def api_sentiment():
    data = request.get_json()
    text = data.get('text', '')
    model_name = data.get('model', 'xgboost')
    
    # 调用预测函数
    result = predict_sentiment(text, model_name)
    
    # 保存记录
    analysis = SentimentAnalysis(
        user_id=current_user.id,
        text=text,
        sentiment=result['sentiment'],
        confidence=result['confidence'],
        model=model_name
    )
    db.session.add(analysis)
    db.session.commit()
    
    return jsonify({'success': True, 'data': result})

话题统计逻辑

python 复制代码
def compute_topic_stats(topic, include_trend=False):
    # 解析关键词
    keywords = parse_keywords(topic.keywords)
    
    # 获取用户所有记录
    analyses = SentimentAnalysis.query.filter_by(user_id=current_user.id).all()
    
    # 筛选匹配记录
    matched = [a for a in analyses if any(k in a.text for k in keywords)]
    
    # 统计正负面
    positive = sum(1 for a in matched if a.sentiment == '正面')
    total = len(matched)
    
    return {
        'total': total,
        'positive': positive,
        'negative': total - positive
    }

5. 系统演示

5.1 首页介绍

5.2 登录与注册

系统提供安全的用户认证机制,保护用户的分析数据隐私。

5.2 个人分析面板

5.3 情感分析界面

简洁的输入框设计,支持实时字数统计。分析完成后,通过颜色直观区分正面(绿色)和负面(红色)情感,并显示模型预测的置信度。

5.4 分析记录可视化

5.4 话题追踪详情

进入特定话题(如"数码产品"),系统会列出所有包含相关关键词(如"手机"、"电脑")的历史评论,并生成情感走势图,帮助用户判断该话题的舆论风向是变好还是变坏。

话题追踪详情

6. 总结与展望

本项目成功实现了一个基于数据挖掘的微博情感分析系统,整合了从数据清洗、模型训练到Web展示的完整流程。

项目亮点

多模型集成:支持 XGBoost、MLP等多种算法,用户可自由选择。

话题追踪:创新的基于关键词的动态聚合功能,实现了对特定事件的持续监控。

可视化交互:直观的图表展示,提升了用户体验。

未来改进方向

  1. 实时爬虫集成:接入微博API或爬虫,实现数据的实时抓取而非仅依赖历史输入。

  2. 细粒度情感:从二分类(正/负)扩展到多分类(喜、怒、哀、乐)。

  3. 模型优化:引入 BERT 等预训练语言模型,进一步提升语义理解能力。


*本文为本科毕业设计核心代码分析笔记,涵盖了算法建模与系统开发的全过程。*

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取 认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python 精品项目---数据挖掘篇

2. Python 精品项目---深度学习篇

3. Python 精品项目---管理系统篇

相关推荐
kwg12644 分钟前
Dify二次开发构建api后端Docker离线镜像方案
服务器·人工智能·python
a***13141 小时前
【玩转全栈】----Django制作部门管理页面
后端·python·django
杨超越luckly1 小时前
Python应用指南:利用高德地图采集AOI数据
python·arcgis·高德地图·数据可视化·aoi数据
梁正雄1 小时前
5、python 模块与包
linux·服务器·python
I_ltt_Itw,1 小时前
Python协程学习笔记
开发语言·网络·python
~~李木子~~1 小时前
数据可视化:App Store数据分析:价格、类别与用户评分的深度洞察
信息可视化·数据挖掘·数据分析
爱笑的眼睛111 小时前
Flask应用API深度开发:从单体架构到微服务设计模式
java·人工智能·python·ai
AI小云1 小时前
【数据操作与可视化】Matplotlib绘图-常用操作
python·数据可视化
木婉清fresh1 小时前
测开python高频面试精选100题
开发语言·python·面试