ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Python分析虎扑赛后舆论:分词、关键词与情感可视化

用Python分析虎扑赛后舆论:分词、关键词与情感可视化 当NIP 2-1 WBG的比赛结束后虎扑英雄联盟相关板块会在短时间内出现大量帖子。有人发赛后评分有人做战术复盘有人表达情绪也有人在玩梗和反讽。面对这种“虎扑现状”如果只是手动刷帖子很容易被信息流淹没。更实际的做法是把比赛结束后一段时间内的热帖文本采集下来用 Python 做分词、关键词提取和情感分析把“现状”量化成词云、高频词和情感比例表。下面用一个最小可复现的流程处理“NIP 2-1 WBG后的虎扑舆论现状”这一类文本。它有清晰的输入、处理、输出链路适合想学习中文文本分析、简单舆情监控或者比赛讨论场景数据处理的读者。完成之后你会得到一份包含高频词、情感分布和词云图片的分析结果也能直接把这个流程复用到其他比赛或论坛话题上。1. 先想清楚要分析什么比赛后热帖的数据形态在写代码之前先弄清楚要处理的文本长什么样否则后续分词和情感分析很容易做到无关的方向上去。这里把“比赛后的虎扑现状”看作一个文本集合它不是一个单一话题而是多个讨论意图叠加在一起。1.1 比赛后虎扑帖子的常见类型比赛结束后热帖通常可以粗略分成几类赛后评分贴围绕队伍或选手的表现打分通常包含分数和短句评价。战术复盘贴讨论 BP、阵容、关键团战、运营思路文本较长专业词多。情绪表达贴抒发开心、失落、愤怒等情绪句子短感叹词多。玩梗和反讽贴内容依赖上下文和网络梗字面意思和真实态度经常相反。数据搬运贴引用赛后数据面板比如输出、视野、经济曲线等信息密度高但主观评价少。这五种类型在同一个时间窗口内混合出现。它们对文本处理的要求不一样评分贴和复盘贴适合做关键词提取情绪贴适合做情感极性统计玩梗贴则必须单独抽出来人工确认否则容易被情感模型误判。1.2 把“现状”拆解成可计算的指标与其笼统地问“虎扑现状怎么样”不如把它拆成几个可以量化的指标。这样可以避免靠个人感觉下结论也让后续代码有明确的输出目标。指标计算方式想回答的问题高频主题词TF-IDF 或词频统计大家在聊什么话题情感极性分布文本情感得分整体情绪偏正面还是负面热帖聚焦点按回复数排序后提取关键词讨论度最高的点是什么话题分散度关键词分组或聚类讨论是集中在少数话题还是四处分散这套指标不是为了替代人工阅读而是先把覆盖全量文本的大致方向画出来再让有经验的读者去重点看热帖和异常文本。实际项目中我推荐先跑出高频词和情感分布再进入具体帖子做人工校验而不是一开始就逐条阅读。2. 环境准备和项目结构在动手写分析代码之前需要把依赖和目录结构定好。不同的项目对版本要求不一样下面的版本只是示例环境落地时以本机兼容情况为准。2.1 依赖安装这个示例主要用到的库有库用途示例版本requests请求公开页面2.31.0beautifulsoup4解析 HTML4.12.2pandas表格处理2.0.3jieba中文分词0.42.1snownlp情感分析0.12.3wordcloud词云生成1.9.2matplotlib统计图绘制3.7.2安装命令如下pip install requests beautifulsoup4 pandas jieba snownlp wordcloud matplotlib这里要提醒一句不要一次性追求最新版本。比如 pandas 2.x 和 1.x 在部分 API 上有差异wordcloud 又依赖 numpy 版本如果安装时报冲突优先用虚拟环境固定版本再逐步升级。2.2 项目目录与输出约定建议把输入、代码、输出分开方便后面替换数据和回归结果lol_opinion/ data/ raw_posts.csv stopwords.txt user_dict.txt src/ collect.py clean.py analyze.py visualize.py output/ keywords.txt sentiment_report.csv wordcloud.pngdata 目录保存原始数据和词典src 目录保存代码output 目录保存分析结果。这样当数据更新时只需要重新跑一遍脚本不需要改动目录结构。2.3 用一份小样本数据先把流程跑通真实采集数据涉及网络请求和页面结构变化建议先用小样本数据把整条流程跑通再换真实数据。下面是一份演示用的 raw_posts.csv内容只用于说明流程不是真实帖子。id,time,author,title,content,reply_count 1,2025-06-01 21:30,虎扑JR1,赛后先聊BP,BP选择决定了整场比赛的节奏这个话题讨论度最高,128 2,2025-06-01 21:33,虎扑JR2,第二局太刺激,第二局看得人很紧张最后结果也算符合预期,210 3,2025-06-01 21:35,虎扑JR3,看得很解气,这一场整体比前几场有变化终于打出该有的状态,94 4,2025-06-01 21:40,虎扑JR4,赢了也要复盘,前期拿到优势之后处理不够果断不解决后面还会吃亏,156 5,2025-06-01 21:45,虎扑JR5,打野节奏不错,前期的野区思路很清楚视野也压住了对面,87 6,2025-06-01 21:48,虎扑JR6,粉丝有点破防,虽然赢了但中间那波失误真的让人血压升高,63 7,2025-06-01 21:52,虎扑JR7,运营比想象好,中后期的运营稳住了优势整体比之前进步明显,45 8,2025-06-01 21:55,虎扑JR8,关键团战又乱,一到关键团战就分散指挥这个画面太熟悉了,102 9,2025-06-01 21:58,虎扑JR9,期待后续比赛,今天状态可以希望后续继续保持不要膨胀,58 10,2025-06-01 22:05,虎扑JR10,理性讨论贴,不看比分的话比赛内容里其实还有不少可以改进的细节,76这份数据已经足够跑通分词和情感分析。等采集脚本完成之后只需要把 raw_posts.csv 替换成真实采集结果保持相同的字段名即可。3. 数据获取与清洗从公开页面到结构化文本如果只用手工复制粘贴帖子一多就完全不可行。所以需要一个通用采集脚本把帖子列表页的标题、正文和回复数提取出来统一存成 CSV。3.1 采集的边界只取公开数据控制请求频率做论坛公开内容分析时最容易出问题的是请求频率和页面规则。合规的采集脚本应该满足几个前提只采集公开可见的信息不登录、不绕过权限限制。遵循目标站点公开的 robots 规则和使用协议。请求间隔保持在合理范围通常单线程请求间隔至少 1 到 2 秒。保留原始页面和采集时间方便后续追溯和重新解析。注意公开数据不等于可以无限抓取。请求频率过高不仅可能被限制还会给目标站点带来不必要的压力。学习用途的脚本频率控制要写在第一优先级。3.2 通用抓取与解析示例下面的 collect.py 演示的是通用思路用 requests 拉取 HTML再用 BeautifulSoup 提取标题、链接和回复数。实际页面结构必须用浏览器开发者工具确认选择器不能照搬。# collect.py import time import pandas as pd import requests from bs4 import BeautifulSoup HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) } def fetch_page(url): resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() resp.encoding resp.apparent_encoding return resp.text def parse_posts(html): soup BeautifulSoup(html, html.parser) # 选择器需要按实际页面结构调整这里只是示例 items soup.select(.post-item) rows [] for item in items: title_el item.select_one(.title a) reply_el item.select_one(.reply-count) if title_el is None: continue rows.append({ title: title_el.get_text(stripTrue), url: title_el.get(href, ), reply_count: int(reply_el.get_text(stripTrue)) if reply_el else 0 }) return rows def main(url): html fetch_page(url) rows parse_posts(html) pd.DataFrame(rows).to_csv(../data/raw_posts.csv, indexFalse, encodingutf-8-sig) print(fsaved {len(rows)} posts) if __name__ __main__: main(https://example.com/real-url)这段代码有三个关键点resp.encoding resp.apparent_encoding是为了避免中文乱码。选择器.post-item、.title a必须根据真实页面调整。utf-8-sig编码写 CSVExcel 打开时中文字段不会乱码。如果页面有分页可以循环请求下一页并在循环里加 time.sleep
返回列表