前言
互联网每天都产生海量文本:新闻资讯、公告、评论、社交媒体发言。舆情分析就是从这些非结构化文本里,自动提取观点、情绪、热点,判断公众对事件、产品、公司的态度。
Python凭借丰富的爬虫、文本处理、大模型/机器学习库,是做舆情分析最主流的工具。本文带你从原理、完整案例、落地坑点一次性讲清楚。
提示:本文代码仅用于技术学习;采集网络数据请遵守网站robots协议、相关法律法规,严禁违规爬取。
一、Python舆情分析整体流程
一套完整舆情系统,一共分为6步:
- 数据采集:抓取新闻、评论、公告等原始文本;
- 文本清洗:去除无用字符、表情、广告、换行,过滤无效内容;
- 文本预处理:中文分词、停用词过滤;
- AI语义分析:情感判断、关键词提取、主题归类、实体识别;
- 统计聚合:统计正面/负面占比、热度排行;
- 可视化输出:词云、趋势图,生成舆情简报。
二、核心依赖库介绍
- 数据采集:
requests、BeautifulSoup,用于网页文本抓取 - 文本清洗分词:
jieba中文分词、re正则表达式 - 词云可视化:
wordcloud - AI情感分析两种方案:
- 传统机器学习:
snownlp、textblob(轻量,无需调用API,精度一般) - 大模型API:调用通义千问、文心一言等,语义理解更强,适合复杂长文本
- 传统机器学习:
- 数据统计:
pandas
三、案例1:轻量本地情感分析(SnowNLP,无需联网API)
适合简单短文本,例如评论、简短留言,开箱即用,不需要申请大模型密钥。
python
import pandas as pd
from snownlp import SnowNLP
# 待分析评论数据
comments = [
"这家公司产品质量很好,服务响应很快,非常满意",
"售后处理太慢,出现问题一直没人解决,体验很差",
"产品中规中矩,没有特别出彩的地方",
"新品发布会内容一般,没有超出预期",
"财报数据亮眼,市场普遍看好后续发展"
]
result_list = []
for text in comments:
s = SnowNLP(text)
# sentiment 0~1,越接近1代表越正面
score = s.sentiments
if score > 0.6:
sentiment = "正面"
elif score < 0.4:
sentiment = "负面"
else:
sentiment = "中性"
result_list.append({"text": text, "score": round(score,3), "sentiment": sentiment})
df = pd.DataFrame(result_list)
print(df)
✅优点:本地运行,速度快,不需要网络、API费用
❌缺点:中文语料偏口语,对财经、行业专业文本效果差,长文本容易判断错误
四、案例2:调用大模型API做专业舆情判断(推荐正式使用)
SnowNLP这类简易模型很难看懂行业新闻、公告。大模型能理解复杂长文,支持自定义输出格式,适合企业、财经类舆情。
python
import requests
import json
def llm_sentiment_analysis(content: str, subject: str):
api_key = "YOUR_API_KEY"
url = "[https://xxx-api.com/v1/chat/completions](https://xxx-api.com/v1/chat/completions)"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
prompt = f"""
任务:舆情分析,分析下面文本对于【{subject}】的舆论倾向。
输出严格JSON,包含字段:
sentiment:正面/负面/中性
sentiment_score:-1到1之间,-1极度负面,1极度正面
key_words:提取3个核心关键词列表
summary:一句话简述舆情观点
文本内容:{content}
"""
payload = {
"model": "qwen-turbo",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.1
}
resp = requests.post(url, headers=headers, json=payload)
return resp.json()["choices"][0]["message"]["content"]
if __name__ == "__main__":
news_text = "公司收到监管问询函,要求说明业务收入真实性,股价当日大幅下跌。"
res = llm_sentiment_analysis(news_text, subject="该上市公司")
print("舆情分析结果:\n", res)
五、案例3:生成词云,直观展示热点关键词
舆情分析做完,经常需要可视化,词云是最常用的展示方式。
python
import jieba
from wordcloud import WordCloud
text = """公司营收增长 订单充足 利润下滑 监管问询 产品质量 研发投入 股价波动 市场预期"""
# 分词
words = jieba.lcut(text)
cut_text = " ".join(words)
wc = WordCloud(
font_path="C:/Windows/Fonts/simhei.ttf", # 黑体字体,解决中文乱码
background_color="white",
width=800, height=400
).generate(cut_text)
# 保存图片
wc.to_file("wordcloud.png")
print("词云图片已生成 wordcloud.png")
六、进阶方案:批量采集+舆情聚合
实际项目中不会只分析单条文本,完整流程:
- requests批量抓取新闻列表,bs4解析正文;
- 清洗文本,过滤重复内容;
- 循环调用AI接口,批量打情感标签;
- pandas聚合统计:正面占比、负面占比,每日热度趋势;
- 存入SQLite/MySQL,定时每日自动跑任务;
- 生成每日舆情简报。
重点提醒:爬虫务必控制请求频率,加延时,禁止高频暴力请求,避免违反网站规则。
七、舆情分析常见坑
- 简易模型理解能力弱:SnowNLP只适合简单口语评论,专业财经、法律文本尽量使用大模型;
- 上下文缺失误判:单条新闻容易断章取义,需要结合多篇报道综合判断;
- 反讽识别困难:讽刺、阴阳怪气的文本,AI很容易识别错误;
- 数据噪音多:网页会夹杂广告、导航文字,不清洗会严重干扰分析结果;
- 大模型幻觉:关键词、摘要偶尔编造,重要舆情结论需要人工复核原文;
- 重复内容:同一条新闻多家媒体转载,统计热度时要做文本去重。
八、学习路线
- 入门:学会requests+BeautifulSoup简单抓取,jieba分词、词云;
- 初级:SnowNLP做简单评论情感打分,Pandas批量处理文本;
- 中级:调用大模型API,批量舆情打标,结构化输出JSON;
- 进阶:文本相似度去重、命名实体识别NER、时序热度统计;
- 工程化:定时任务自动采集,数据库存储,Streamlit搭建舆情看板。
小结
Python做舆情分析,核心就是机器负责批量处理海量文本,AI负责读懂情绪和观点 。轻量场景用本地小模型快速验证;正式业务场景优先大模型,语义理解更强。
舆情工具只能作为辅助,关键事件的结论不能完全交给AI,人工复核必不可少。