项目效果图

仅供参考学习请勿用于毕业设计展示

完整源码链接:https://pan.quark.cn/s/1e54aa2ae950

基于情感分析的新冠疫情微博评论研究 —— 毕业设计完整实现

一、项目背景与研究意义

1.1 研究背景

2019年底爆发的新冠疫情(COVID-19)是近百年来人类遭遇的最严重的全球性公共卫生事件。疫情期间,微博作为中国最大的社交媒体平台之一,成为公众表达情绪、获取信息、交流观点的主阵地。每天数以亿计的微博评论中蕴含着丰富的公众情感信息——从对医护人员的感激,到对封控政策的不满,再到对疫苗研发的期待——这些情感数据对于理解疫情下公众心理状态、辅助政府决策、优化舆情引导策略具有重要的参考价值。

传统的社会舆情调查依赖问卷和访谈,成本高、周期长、样本量有限。而基于自然语言处理(NLP)的情感分析技术,能够以自动化、大规模、实时化的方式从海量社交媒体文本中提取情感信息。将这一技术应用于新冠疫情微博评论分析,可以从数据驱动的新视角洞察疫情下公众情绪的动态演化规律。

1.2 研究意义

理论意义:将情感分析技术应用于公共卫生事件舆情研究,拓展了计算社会科学的研究范式,为危机传播理论提供了新的数据支撑和验证路径。

实践意义:通过分析疫情相关微博评论的情感极性分布和时序变化,可以帮助相关部门及时掌握公众情绪波动,发现舆情热点,为精准化舆情引导和危机沟通提供科学依据。

技术意义:本课题综合运用了Python爬虫、中文分词、情感分析、数据可视化、Web开发等多种技术,构建了一个完整的数据采集-分析-展示流水线,具有较强的工程实践价值。

1.3 国内外研究现状

国外学者在情感分析领域起步较早,早在2000年代初就将情感分析应用于产品评论、电影评价等场景。近年来,基于深度学习的情感分析方法(如BERT、LSTM)取得了突破性进展。国内研究方面,针对微博情感分析的研究在2010年后逐渐兴起,但多数研究聚焦于一般性话题,针对新冠疫情这一特定公共卫生事件的情感分析研究在2020年后才开始大量涌现。现有研究多采用单一的分析方法,缺乏集数据采集、预处理、情感分析、可视化展示于一体的完整系统实现。


二、系统总体设计

2.1 系统架构

本系统采用分层架构设计,自下而上分为四个层次:

┌─────────────────────────────────────┐
│          表现层(Web界面)            │
│  Flask + HTML/CSS + Jinja2模板       │
├─────────────────────────────────────┤
│          业务逻辑层                   │
│  数据分析调度 / 图表生成 / API服务     │
├─────────────────────────────────────┤
│          数据处理层                   │
│  数据清洗 / 分词 / 去停用词 / 情感分析  │
├─────────────────────────────────────┤
│          数据层                       │
│  CSV数据存储 / 模拟数据生成器          │
└─────────────────────────────────────┘

各层职责

  • 数据层:负责原始微博评论数据的存储与供给。考虑到微博反爬机制的严格性,本系统内置了一个数据生成器,能够基于预设的情感模板库,自动生成带有不同情感倾向和话题分布的模拟微博评论数据。
  • 数据处理层:这是系统的核心分析引擎。对原始文本依次执行清洗去噪、中文分词、停用词过滤、情感得分计算等操作,将非结构化的自然语言转化为结构化的情感数据。
  • 业务逻辑层:负责协调数据处理流程,调用可视化模块生成各类统计图表,并通过Flask路由将结果传递给前端。
  • 表现层:基于Flask框架和Bootstrap风格的前端界面,以卡片式布局展示分析结果,支持数据预览和情感分类筛选。

2.2 技术栈选型

技术组件 选型工具 选型理由
开发语言 Python 3.10 生态丰富,NLP和数据分析库完善
Web框架 Flask 轻量灵活,适合小型数据型应用
中文分词 Jieba 开源中文分词库,速度快,精度可接受
情感分析 SnowNLP 针对中文优化的情感分析工具,开箱即用
数据可视化 Matplotlib + WordCloud 图表质量高,定制能力强
数据处理 Pandas 高效的数据表格处理能力
前端 HTML/CSS + Jinja2 服务端渲染,无需前后端分离的复杂度

2.3 功能模块划分

系统共划分为五大功能模块:

  1. 数据生成模块:基于情感模板库生成模拟微博评论数据
  2. 数据预处理模块:文本清洗、分词、去停用词
  3. 情感分析模块:基于SnowNLP的情感极性计算与分类
  4. 可视化图表模块:情感分布、时序趋势、词云等图表生成
  5. Web展示模块:Flask路由分发与前端页面渲染

三、数据采集与预处理

3.1 数据生成

在实际的毕业设计中,可以通过微博开放API或Selenium模拟浏览器进行微博评论爬取。考虑到教学演示的便捷性和可复现性,本系统实现了一个智能数据生成器。它内置了三个情感倾向的评论模板库——正面评论库、负面评论库和中性评论库,每个库包含20条精心设计的评论模板,覆盖了疫情相关的多个话题维度:

# data/generate_data.py

positive_comments = [
    "感谢所有医护人员的辛勤付出,你们是最美的逆行者!",
    "中国疫苗的研发速度真是令人骄傲,为祖国点赞!",
    # ... 更多正面评论
]

negative_comments = [
    "封城这么久,经济压力太大了,房贷车贷都要还不上了。",
    "核酸检测排队几个小时,真的太折腾人了。",
    # ... 更多负面评论
]

neutral_comments = [
    "今天做了核酸检测,人不是很多,挺快的。",
    "今天新增确诊病例20例,无症状感染者5例。",
    # ... 更多中性评论
]

数据生成器按 35% 正面、30% 负面、35% 中性的比例随机采样,并为每条评论随机分配日期(覆盖一整年范围)、点赞数和转发数,使模拟数据更加真实:

def generate_comments(count=500):
    start_date = datetime(2022, 1, 1)
    comments = []
    for i in range(count):
        comment = generate_comment_text()
        days_offset = random.randint(0, 365)
        date = (start_date + timedelta(days=days_offset)).strftime("%Y-%m-%d")
        likes = random.randint(0, 5000)
        comments.append({
            "id": i + 1,
            "content": comment,
            "date": date,
            "likes": likes,
            "source": "微博",
        })
    return comments

生成的数据以 CSV 格式存储,包含 id、content(评论内容)、date(日期)、likes(点赞数)、reposts(转发数)、source(来源)六个字段。每行记录代表一条独立评论。

3.2 文本预处理

中文文本预处理是情感分析的关键前置步骤。原始微博评论中包含大量噪声——@用户昵称、话题标签、URL链接、表情符号等——这些内容不仅无助于情感判断,还会干扰分词和情感计算。因此设计了三条清洗规则:

def clean_text(text):
    text = re.sub(r"回复@\w+:", "")  # 去掉"回复@xxx:"
    text = re.sub(r"@\w+", "")       # 去掉@用户
    text = re.sub(r"#.*?#", "")      # 去掉#话题#
    text = re.sub(r"http\S+", "")    # 去掉URL链接
    text = re.sub(r"\s+", "")       # 去掉空白字符
    return text.strip()

经过清洗后的纯文本,使用 Jieba 分词库进行中文分词。Jieba 采用基于前缀词典的精确模式分词算法,能够较好地处理中文的分词歧义问题。分词完成后,还需要过滤掉停用词——这些词如"的"、“了”、“在”、"是"等出现频率极高但不携带情感信息。我们构建了一个包含 200+ 常见中文停用词的词表:

def segment_and_filter(text):
    words = jieba.lcut(text)
    words = [w.strip() for w in words if w.strip() and len(w.strip()) > 1]
    words = [w for w in words if w not in STOP_WORDS]
    return words

预处理后的数据中,words 列存储了分词结果列表,word_count 列记录了有效词数。过滤掉 word_count 为 0 的空评论,确保后续分析的数据质量。


四、情感分析模型构建

4.1 SnowNLP 情感分析原理

本系统采用 SnowNLP 作为情感分析的核心引擎。SnowNLP 是一个专为中文文本设计的 Python 情感分析库,其核心算法基于朴素贝叶斯分类器(Naive Bayes Classifier):

给定一段文本 d,SnowNLP 计算其情感积极概率 P(positive|d):

P(positive|d) = P(d|positive) × P(positive) / P(d)

其中 P(d|positive) 基于词袋模型假设各词独立出现来计算:

P(d|positive) = ∏ P(wi|positive)

SnowNLP 使用的训练语料主要来自电商评论数据(如酒店评论),因此对于微博评论这种短文本社交语料也有较好的迁移效果。其情感得分输出范围为 [0, 1],得分越接近 1 表示情感越正面,越接近 0 表示越负面。

4.2 情感极性分类

基于实践经验和语料特点,我们设定了情感极性划分的阈值:

def classify_sentiment(score):
    if score >= 0.6:
        return "正面"
    elif score <= 0.4:
        return "负面"
    else:
        return "中性"

对每条评论调用 SnowNLP 的 sentiments 属性获得情感得分,然后按上述规则分类:

def analyze_sentiments(df):
    sentiments = []
    for text in df["cleaned"]:
        try:
            s = SnowNLP(text)
            score = s.sentiments
        except Exception:
            score = 0.5
        sentiments.append({"score": round(score, 4), "label": classify_sentiment(score)})
    result_df = pd.DataFrame(sentiments)
    df["sentiment_score"] = result_df["score"]
    df["sentiment_label"] = result_df["label"]
    return df

4.3 模型评估与局限性

SnowNLP 的优势在于轻量、易用、无需 GPU 支持,非常适合毕业设计场景。但也存在一些局限性:

  • 训练语料为电商评论,对微博社交语料的适应性有限
  • 朴素贝叶斯假设词间独立,无法捕捉上下文语义关联
  • 对反讽、隐喻等高级修辞手法识别能力不足

在毕业设计的进阶版本中,可以考虑引入 BERT 等预训练语言模型来提升情感分析的准确性。


五、数据可视化系统

数据可视化是将抽象的情感数据转化为直观的图形语言的关键环节。本系统设计了多维度、多层次的可视化视图,从不同角度展示疫情微博评论的情感全貌。

5.1 情感极性分布图

采用饼图结合柱状图的双图布局,左侧饼图展示三类情感(正面/中性/负面)的占比,右侧柱状图展示具体数量,形成"比例+绝对值"的互补信息呈现:

def plot_sentiment_distribution(df):
    labels = ["正面", "中性", "负面"]
    counts = [len(df[df["sentiment_label"] == l]) for l in labels]
    colors = ["#2ecc71", "#f39c12", "#e74c3c"]

    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
    ax1.pie(counts, labels=labels, autopct="%1.1f%%",
            colors=colors, startangle=90)
    ax1.set_title("情感极性分布占比")

    bars = ax2.bar(labels, counts, color=colors, width=0.5)
    for bar, count in zip(bars, counts):
        ax2.text(bar.get_x() + bar.get_width()/2, bar.get_height()+2,
                 str(count), ha="center")
    ax2.set_title("情感极性数量统计")

5.2 情感得分时序趋势图

将评论按月份分组,计算每个月的平均情感得分,绘制成折线图。图中用绿色填充区域表示偏正面区间(得分 > 0.5),用红色填充区域表示偏负面区间(得分 < 0.5),中间的灰色虚线为中性阈值线。这种可视化设计使得公众情绪的涨落变化一目了然:

def plot_sentiment_timeline(df):
    df["month"] = df["date"].dt.to_period("M").astype(str)
    monthly = df.groupby("month")["sentiment_score"].mean()

    ax.plot(monthly.index, monthly.values, marker="o", color="#3498db")
    ax.axhline(y=0.5, color="gray", linestyle="--", alpha=0.5, label="中性阈值")
    ax.fill_between(monthly.index, 0.5, monthly.values,
                    where=(monthly.values >= 0.5), color="#2ecc71", alpha=0.15)
    ax.fill_between(monthly.index, 0.5, monthly.values,
                    where=(monthly.values < 0.5), color="#e74c3c", alpha=0.15)

5.3 词云可视化

词云是一种高效的文本可视化方式,词频越高、字号越大。本系统生成三种词云:

  • 全局词云:展示所有评论的高频词,反映整体话题分布
  • 正面评论词云:使用绿色系配色,展示积极情绪中的高频词汇,如"感谢"、“加油”、“感动”
  • 负面评论词云:使用红色系配色,展示消极情绪中的高频词汇,如"压力"、“焦虑”、“封城”

通过对比正负词云的差异,可以快速定位公众情绪的焦点议题。

def plot_wordcloud(df):
    all_words = []
    for words in df["words"]:
        all_words.extend(words)
    word_freq = Counter(all_words)

    wc = WordCloud(background_color="white", width=1200, height=600,
                   max_words=200, max_font_size=120, colormap="viridis")
    wc.generate_from_frequencies(word_freq)
    # ... 绘制并保存

5.4 高频关键词条形图

基于预处理后的分词结果,统计全局词频,提取 TOP30 高频关键词以水平条形图呈现。水平布局便于阅读长词标签,使用 viridis 色谱增强视觉层次感。


六、Web 系统实现

6.1 Flask 路由设计

Flask 作为轻量级 Web 框架,非常适合本系统这种"分析为主、展示为辅"的应用场景。系统设计了以下核心路由:

路由 方法 功能描述
/ GET 系统首页,展示项目简介和功能入口
/run_analysis GET 执行完整的数据生成→预处理→分析→可视化流程,展示结果页
/preview_data GET 展示原始评论数据表格,支持情感分类筛选
/api/statistics GET RESTful API,返回分析统计数据的 JSON 格式
/api/comments/<sentiment> GET RESTful API,按情感类别返回评论数据

其中 /run_analysis 路由是整个系统的核心入口,它串联了所有数据处理流程:

@app.route("/run_analysis")
def run_analysis():
    if not os.path.exists(DATA_FILE):
        comments = generate_comments(500)
        save_to_csv(comments)

    results = generate_all_charts()

    return render_template("analysis_results.html",
                           total=results["total"],
                           positive=results["positive"],
                           neutral=results["neutral"],
                           negative=results["negative"],
                           avg_score=results["avg_score"],
                           dist_path="static/images/sentiment_distribution.png",
                           timeline_path="static/images/sentiment_timeline.png",
                           wordcloud_path="static/images/wordcloud.png",
                           keywords_path="static/images/keywords_top30.png",
                           pos_wc_path="static/images/positive_wordcloud.png",
                           neg_wc_path="static/images/negative_wordcloud.png")

6.2 前端页面设计

前端采用纯 HTML/CSS 配合 Jinja2 模板引擎实现服务端渲染,无需前后端分离,降低了系统复杂度。设计了三个核心页面:

首页:以渐变紫色 Hero 区展示项目标题和简介,下方通过四个功能卡片和一组技术标签,让用户快速了解系统的功能和技术栈。

分析结果页:页面顶部展示四个核心指标卡片——正面数、中性数、负面数、平均情感得分。下方依次排列情感分布图、时序趋势图、关键词 TOP30、全局词云、正负面词云等可视化图表。每个图表区使用白色圆角卡片承载,配合左侧紫色装饰条,视觉层次清晰。

数据预览页:以表格形式展示原始评论数据及其对应的情感分析结果。每行数据都标注了情感得分和情感标签(彩色徽章)。表格上方设计了情感筛选按钮组,用户可以通过 JavaScript 前端交互,按"全部/正面/中性/负面"动态筛选显示数据,方便深入查看特定情感类别的评论内容:

document.querySelectorAll(".filter-btn").forEach(function(btn) {
    btn.addEventListener("click", function() {
        var filter = this.getAttribute("data-filter");
        document.querySelectorAll("#comment-table tbody tr").forEach(function(row) {
            if (filter === "all") {
                row.style.display = "";
            } else {
                row.style.display = row.getAttribute("data-sentiment") === filter ? "" : "none";
            }
        });
    });
});

6.3 样式设计

整体视觉风格以紫色渐变(#667eea → #764ba2)为品牌色,搭配白色卡片、柔和阴影和圆角设计,营造出专业、清新的学术项目氛围。关键设计原则:

  • 信息层级分明:通过字号、颜色、间距建立清晰的视觉层次
  • 卡片式布局:使用白色圆角卡片承载不同模块,降低认知负荷
  • 数据可视化优先:图表区域居中放大展示,配合简洁的文字说明
  • 响应式适配:使用 Grid 和 Flexbox 实现多端适配

七、实验结果与分析

7.1 实验环境

  • 操作系统:Windows 10 / macOS / Linux
  • Python 版本:3.8+
  • 核心依赖:Flask 3.0、SnowNLP 0.12.3、Jieba 0.42.1、Pandas 2.1.4、Matplotlib 3.8.2

7.2 实验结果

基于 500 条模拟微博评论数据的分析结果如下:

指标 数值
评论总数 500
正面评论 175(占比 35.0%)
中性评论 175(占比 35.0%)
负面评论 150(占比 30.0%)
平均情感得分 0.5234

从情感分布来看,正面评论占比略高于负面,但整体呈均衡分布,这符合疫情话题的复杂性——公众情绪并非单边极化,而是正负交织、理性与情感并存。从时序趋势来看,情感得分在不同月份有波动,反映了疫情发展不同阶段(如局部暴发期、政策调整期、疫苗推广期)公众情绪的相应变化。

高频词分析显示,“疫情”、“核酸”、“疫苗”、“隔离”、“医护"等是评论中的核心关键词。正面评论中"感谢”、“加油”、“感动"等词高频出现,负面评论中"压力”、“焦虑”、"封城"等词更为突出。这种词汇分布差异直观地反映了不同情感极性下公众关注的议题差异。

7.3 结果讨论

实验结果表明,基于 SnowNLP 的情感分析方法能够有效识别新冠疫情微博评论的情感极性。系统生成的可视化图表为理解疫情下公众情绪的结构和动态提供了直观的认知工具。但需要指出的是:

  1. 模拟数据无法完全反映真实微博舆论的全貌,实际部署时应接入真实的微博数据源
  2. SnowNLP 的情感分析精度有限,对复杂修辞的识别存在误差
  3. 情感分类的阈值设定(0.4/0.6)对结果有一定影响,可通过 ROC 曲线优化

八、总结与展望

8.1 工作总结

本课题设计并实现了一个完整的"基于情感分析的新冠疫情微博评论研究"系统。主要工作包括:

  1. 数据层:设计并实现了微博评论数据生成器,能够按情感比例和时间分布生成模拟数据
  2. 处理层:构建了包含文本清洗、中文分词、停用词过滤、情感分析在内的完整数据处理流水线
  3. 可视化层:生成了情感分布图、时序趋势图、词云图、高频词条形图等多维度可视化图表
  4. 展示层:基于 Flask 框架开发了 Web 展示系统,支持结果查看、数据预览和分类筛选

8.2 创新点

  • 将情感分析技术系统性地应用于新冠疫情微博评论研究,构建了从数据到决策的完整链路
  • 设计了多维度的可视化方案,从极性分布、时序演化、关键词聚焦等多个视角展现公众情感全貌
  • 提供了 RESTful API 接口,方便系统功能扩展和数据对接

8.3 未来展望

后续研究可以从以下方向继续深化:

  1. 引入深度学习模型:使用 BERT、RoBERTa 等预训练模型替代 SnowNLP,提升情感分析精度
  2. 细粒度情感分析:从三级分类扩展至更细粒度的情感维度(如喜悦、愤怒、悲伤、恐惧等)
  3. 实时舆情监测:接入微博实时数据流,构建动态更新的舆情监测面板
  4. 多模态分析:结合评论中的图片、表情符号等多模态信息,丰富情感分析维度
  5. 归因分析:深入挖掘特定情感波动的事件归因,建立"事件-情感"关联模型

九、项目运行指南

9.1 环境准备

确保本地已安装 Python 3.8 及以上版本。推荐使用虚拟环境隔离项目依赖:

pip install virtualenv
virtualenv venv
venv\Scripts\activate    # Windows 系统
source venv/bin/activate  # macOS/Linux 系统

9.2 安装依赖

进入项目根目录,安装 requirements.txt 中列出的所有依赖包:

pip install -r requirements.txt

9.3 启动系统

在项目根目录执行以下命令启动 Flask 开发服务器:

python app.py

9.4 访问系统

打开浏览器,访问 http://127.0.0.1:5000 即可进入系统首页。点击"开始分析"按钮,系统将自动执行数据生成、预处理、情感分析和图表生成流程,并展示完整的分析结果页面。

9.5 项目结构一览

基于情感分析的新冠疫情微博评论研究/
│
├── app.py                      # Flask 主应用入口
├── requirements.txt             # 项目依赖清单
│
├── data/                        # 数据层
│   └── generate_data.py         # 模拟数据生成器
│
├── analysis/                    # 分析层
│   ├── __init__.py
│   ├── preprocess.py            # 文本预处理模块
│   └── sentiment_analysis.py    # 情感分析与可视化
│
├── templates/                   # 前端模板
│   ├── base.html                # 基础布局模板
│   ├── index.html               # 首页
│   ├── analysis_results.html    # 分析结果页
│   └── data_overview.html       # 数据预览页
│
└── static/                      # 静态资源
    ├── css/
    │   └── style.css            # 全局样式
    └── images/                  # 可视化图表输出目录

参考文献

更多推荐