计算机毕业设计:基于Python与Flask的智能新闻舆情分析系统 SnowNLP ARIMA 可视化 大数据 大模型(建议收藏)✅
1、项目介绍
技术栈
Python 语言、Flask 框架、requests 爬虫技术、BeautifulSoup 解析库、SnowNLP 情感分析、scikit-learn 机器学习库、statsmodels 统计模型、ARIMA 时间序列预测模型、Echarts 可视化工具、Bootstrap 前端框架、jQuery 库、新浪新闻数据源
功能模块
- 数据采集模块
- 用户管理模块
- 新闻展示模块
- 情感分析模块
- 关键词分析模块
- 热度分析模块
- 可视化呈现模块
- 趋势预测模块
项目介绍
本项目是基于 Python 与 Flask 开发的智能新闻舆情分析平台,聚焦新浪新闻数据的深度挖掘与价值呈现。系统通过 requests 与 BeautifulSoup 定向抓取新闻、娱乐、财经、体育、科技等多个版块的最新数据,经清洗后分类存储。平台集成 SnowNLP 实现新闻文本情感量化分析,输出 0 至 1 的情感得分;通过关键词抽取、词频统计与词群聚类分析,挖掘文本核心主题;结合新闻关注人数完成各版块热度密度分布统计。创新引入 ARIMA 时间序列模型,基于历史数据训练后可对话题发展趋势进行预测。前端采用 Bootstrap 与 Echarts 构建交互界面,以词云、散点图、密度分布直方图等形式直观呈现热词分布、情感倾向及趋势预测结果,实现从数据采集、分析、可视化到趋势预测的全链路智能化处理。
2、项目界面
(1)新闻可视化分析、热词关键词分析
该页面是基于Python的新闻数据挖掘与分析系统的新闻版块热点词分析功能页,顶部设有热点新闻分类、新闻分析与关键词分析、情感分析和预测等功能入口,还有多新闻版块切换选项,页面展示对应版块的关键词词云、话题词频统计与词群及Top10关键词词群,整体用于新闻各版块热点词汇的挖掘与可视化分析。

(2)新闻列表、新闻类型
该页面是基于Python的新闻数据挖掘与分析系统中的热点新闻分类功能页,可切换不同新闻版块,以列表形式展示对应版块的新闻关注榜,呈现新闻标题与关注数等信息,同时系统还设有新闻分析与关键词分析、舆情分析和预测等其他功能模块入口。

(3)新闻舆情分析与预测
该页面是基于Python的新闻数据挖掘与分析系统的舆情分析功能页,顶部设有热点新闻分类、新闻分析与关键词分析、情感分析和预测等功能入口,页面可开展关键词分析与情感分析,展示指定关键词的不同类别新闻数量分布、新闻情感得分与关注热度分布,还能实现对应关键词新闻报道数量的未来发展趋势预测,整体用于从多维度开展新闻舆情分析并进行趋势预判。

(4)新闻可视化分析、热词关键词分析
该页面是基于Python的新闻数据挖掘与分析系统的新闻版块热点词分析功能页,顶部设有热点新闻分类、新闻分析与关键词分析、情感分析和预测等功能入口,还有多类新闻版块的切换选项,页面可展示对应科技版块的关键词词云、话题词频统计与词群以及Top10关键词词群,整体实现各新闻版块热点词汇的挖掘统计与可视化分析展示的功能。

(5)新闻舆情分析与预测
该页面是基于Python的新闻数据挖掘与分析系统的舆情分析功能页,顶部设有热点新闻分类、新闻分析与关键词分析、情感分析和预测等功能入口,页面可进行关键词分析与情感分析,展示指定关键词的不同类别新闻数量分布、新闻情感得分与关注热度分布,还能实现对应关键词新闻报道数量的未来发展趋势预测,整体用于新闻舆情的深度分析与趋势预判。

(6)注册登录
该页面是基于Python的新闻数据挖掘与分析系统的首页,顶部设有热点新闻分类、新闻分析与关键词分析、情感分析和预测三大核心功能入口,页面展示系统整体介绍,还设置注册与登录的操作入口,同时呈现部分数据可视化的图表元素,整体作为系统的总入口,提供功能导航、系统说明与用户身份验证的功能。
(7)数据爬取
该页面是基于Python的新闻数据挖掘与分析系统的爬虫代码开发运行界面,核心实现新闻数据的网络爬取功能,可编写代码设置请求头、筛选过滤无关新闻内容、提取有效新闻信息并整理存储,同时能在界面中执行代码并查看运行相关反馈,为系统后续的新闻数据分析提供基础的数据采集支撑。

3、项目说明
一、技术栈简要说明
系统后端采用 Python 语言与 Flask 轻量级框架构建,数据采集环节使用 requests 与 BeautifulSoup 实现新浪新闻多版块定向抓取与解析。情感分析集成 SnowNLP 自然语言处理库,输出文本情感得分。关键词分析借助 scikit-learn 机器学习库进行特征提取与词群聚类。趋势预测基于 statsmodels 统计模型中的 ARIMA 时间序列模型,对话题走向进行预测。前端采用 Bootstrap 与 jQuery 构建响应式界面,可视化部分通过 Echarts 呈现词云、饼图、柱状图、散点图等图表。
二、功能模块详细介绍
· 数据采集模块
基于 requests 与 BeautifulSoup 实现新浪新闻多版块的定向爬取,涵盖新闻、娱乐、财经、体育、科技等类别。爬虫可设置请求头、过滤无关内容、提取标题、正文、关注数等有效信息,经清洗后分类存储,为后续分析提供数据基础。
· 用户管理模块
提供用户注册与登录认证功能,保障系统访问安全。用户通过身份验证后可进入系统各功能模块,实现个性化使用体验。
· 新闻展示模块
支持新闻列表浏览与版块分类筛选,以新闻关注榜形式展示各版块的热门新闻,呈现新闻标题与关注人数等信息,便于用户快速获取热点内容。
· 情感分析模块
集成 SnowNLP 进行新闻文本情感倾向分析,对每条新闻内容计算 0 至 1 的情感得分,分值越接近 1 表示情感越积极,接近 0 表示越消极,帮助用户了解新闻的舆论倾向。
· 关键词分析模块
实现中文分词、关键词抽取、词频统计与词群聚类分析。通过词云图展示热点词汇分布,结合话题词频统计与 Top10 关键词词群,挖掘新闻文本的核心主题与热点话题。
· 热度分析模块
基于新闻关注人数进行密度分布统计,评估各版块与各话题的热度水平,直观呈现不同新闻版块的用户关注程度与热度差异。
· 可视化呈现模块
采用 Echarts 构建多类型可视化图表,包括关键词词云、饼图展示新闻类别分布、柱状图呈现情感得分分布、散点图展示关注热度关系、密度分布直方图分析热度密度等,实现数据结果的直观呈现。
· 趋势预测模块
应用 ARIMA 时间序列预测模型,基于历史新闻数据对特定关键词的新闻报道数量进行趋势预测。用户可选择关键词,系统展示该话题的未来发展走向,为舆情研判提供数据参考。
三、项目总结
本系统是基于 Python 与 Flask 开发的智能新闻舆情分析平台,实现了从数据采集到分析预测的全链路智能化处理。系统通过爬虫技术定向抓取新浪新闻多版块数据,集成 SnowNLP 进行情感量化分析,利用关键词抽取与词群聚类挖掘热点主题,结合关注人数完成热度评估。创新引入 ARIMA 时间序列模型,可对话题发展趋势进行预测。前端采用 Bootstrap 与 Echarts 构建直观的可视化界面,以词云、散点图、密度分布直方图等形式展示热词分布、情感倾向及趋势预测结果,为新闻舆情分析提供了完整的技术解决方案。

4、核心代码
class WordSegmentPOSKeywordExtractor(TFIDF):
def extract_sentence(self, sentence, keyword_ratios=None):
"""
Extract keywords from sentence using TF-IDF algorithm.
Parameter:
- keyword_ratios: return how many top keywords. `None` for all possible words.
"""
words = self.postokenizer.cut(sentence)
freq = {}
seg_words = []
pos_words = []
for w in words:
wc = w.word
seg_words.append(wc)
pos_words.append(w.flag)
if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
continue
freq[wc] = freq.get(wc, 0.0) + 1.0
if keyword_ratios is not None and keyword_ratios > 0:
total = sum(freq.values())
for k in freq:
freq[k] *= self.idf_freq.get(k, self.median_idf) / total
tags = sorted(freq, key=freq.__getitem__, reverse=True)
top_k = int(keyword_ratios * len(seg_words))
tags = tags[:top_k]
key_words = [int(word in tags) for word in seg_words]
return seg_words, pos_words, key_words
else:
return seg_words, pos_words
extractor = WordSegmentPOSKeywordExtractor()
def fetch_keywords(new_title):
"""新闻关键词抽取,保留表征能力强名词和动词"""
seg_words, pos_words, key_words = extractor.extract_sentence(new_title, keyword_ratios=0.8)
seg_key_words = []
for word, pos, is_key in zip(seg_words, pos_words, key_words):
if pos in {'n', 'nt', 'nd', 'nl', 'nh', 'ns', 'nn', 'ni', 'nz', 'v', 'vd', 'vl', 'vu', 'a'} and is_key:
if word not in STOPWORDS:
seg_key_words.append(word)
return seg_key_words
@app.route('/news_words_analysis/<category>')
def news_words_analysis(category):
conn = sqlite3.connect('sina_news.db')
cursor = conn.cursor()
sql = "SELECT title FROM news_info where category='{}' order by date desc".format(category)
cursor.execute(sql)
titles = cursor.fetchall()
word_count = {}
for title in titles:
words = fetch_keywords(title[0])
for word in words:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
wordclout_dict = sorted(word_count.items(), key=lambda d: d[1], reverse=True)
wordclout_dict = [{"name": k[0], "value": k[1]} for k in wordclout_dict]
# 选取 top10 的词作为话题词群
top_keywords = [w['name'] for w in wordclout_dict[:10]][::-1]
top_keyword_counts = [w['value'] for w in wordclout_dict[:10]][::-1]
return jsonify({'词云数据': wordclout_dict, '词群': top_keywords, '词群个数': top_keyword_counts})
# -----------3、预测---------------------
def arima_model_train_eval(history):
# 构造 ARIMA 模型
model = ARIMA(history, order=(1, 1, 0))
# 基于历史数据训练
model_fit = model.fit()
# 预测下一个时间步的值
output = model_fit.forecast()
yhat = output[0]
return yhat
@app.route('/keywords_yuqing_search/<search_input>')
def keywords_yuqing_search(search_input):
""" 3、舆情关键词检索分析 """
conn = sqlite3.connect('sina_news.db')
cursor = conn.cursor()
print(search_input)
sql = "SELECT * FROM news_info where title like '%{}%' order by date asc".format(search_input)
cursor.execute(sql)
news_infos = cursor.fetchall()
dates = []
sentiment_scores = []
category_count = {}
date_count = {}
for news_info in news_infos:
category, news_title, news_url, date = news_info
dates.append(date)
# 情感分析
sentiment_score = SnowNLP(news_title).sentiments
sentiment_scores.append(sentiment_score)
if category not in category_count:
category_count[category] = 0
category_count[category] += 1
for date in dates:
if date not in date_count:
date_count[date] = 0
date_count[date] += 1
# 事件发生的趋势预测
pred_dates = list(date_count.keys())
date_news_counts = list(date_count.values())
# 下一个日期及新闻数量预测,调用自建arima_model_train_eval函数
print(date_news_counts)
pred_next_count = arima_model_train_eval(date_news_counts)
date_news_counts.append(pred_next_count)
new_date = pred_dates[-1]
next_date = datetime.strptime(new_date, '%Y-%m-%d') + timedelta(days=1)
next_date = next_date.strftime('%Y-%m-%d')
pred_dates.append(next_date)
result = {
'情感得分': sentiment_scores,
'日期': dates,
'类别': list(category_count.keys()),
'新闻个数': list(category_count.values()),
"趋势日期": pred_dates,
"趋势数量": date_news_counts
}
return jsonify(result)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)