ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

疫情舆情两极情感分析:毕业设计资源与Python实现

疫情舆情两极情感分析:毕业设计资源与Python实现 简介这份资源面向希望入门或进阶中文情感分析的开发者与研究者聚焦疫情期间人民日报与微博话题数据的两极情感倾向判定提供从数据到模型的完整实践素材。包内共约2000个文件以txt语料、json标注、csv统计表、html关键词页面为主另含Python源码、pkl模型文件、png图表及论文文档压缩包约87.47MB覆盖数据采集、预处理、特征提取到模型训练的全流程。资源重点对比情感词典与机器学习两类方法说明词典匹配受语义丰富性限制、机器学习精度更高但依赖训练语料质量并给出可复现的代码与实验数据。已有433人学习下载适合作为课程设计、毕业论文或情感分析练手项目的参考帮助读者快速理解中文疫情话题的极性分类思路与实现细节。1. 疫情舆情两极情感分析一份能跑通的毕业设计资源拆解2020 年那波疫情把舆情分析推到了台前微博热搜每分钟都在变人民日报的措辞又相对克制两边的文本放一起做情感极性对比是个很典型的机器学习落地场景。这份资源就是围绕这个场景做的一份毕业论文文档加上 Python 项目源码和抓取好的关键词数据覆盖了从数据获取到情感二分类的完整链路。它适合正在做文本分类课设、毕业设计或者想拿真实中文语料练手情感分析的从业者。你拿到手能直接看到数据长什么样、模型怎么搭、论文怎么把实验串起来而不是对着一堆理论空想。下面我按自己拆包复现的顺序把这份资源里真正能用的东西讲清楚。2. 数据与任务拆解从 keywords.html 到两极标签2.1 先看清手里有什么文件清单与数据形态解压之后目录里最显眼的是那批2020-03-01-keywords.html这类文件日期从 2 月下旬横跨到 3 月中旬正好是疫情舆情最密集的一段。这些 HTML 不是普通网页存档而是关键词抓取结果里面通常带着词频、时间戳和来源标记。另一份毕业论文.docx是方法论述和实验记录Python 源码则负责把 HTML 里的文本抽出来、清洗、打标签、喂给模型。我一般拿到这种包会先做一件事把 HTML 用浏览器打开看结构再用脚本批量解析。因为不同日期的页面模板可能微调过直接上解析库容易在某个日期上翻车。先确认标签层级再决定用 BeautifulSoup 还是 lxml这一步省不得。文件/目录作用复现时的注意点毕业论文.docx方法、实验、结论看实验设置和评价指标别只看结论2020-0X-XX-keywords.html按日抓取的关键词数据模板可能不一致先抽样看结构Python 源码解析、清洗、建模确认依赖版本尤其是 sklearn数据文件训练/测试语料检查标签分布是否均衡2.2 两极情感分析到底在做什么所谓两极就是把文本判成正面或负面不做中性。这个设定在疫情话题里其实有争议因为大量报道是陈述性的硬分两极会引入噪声。但作为教学和毕设场景二分类比三分类好收敛评价指标也干净。资源里走的是机器学习路线而不是纯情感词典匹配原因在摘要里说得很直白中文情感词典就那么几个知网 Hownet、台大 NTUSD、哈工大同义词词林覆盖面有限语义一丰富就匹配不准。机器学习不依赖语法层面的规则只要训练语料针对性够精度能上去。这里有个选型判断如果你的数据量只有几百条词典加规则可能更稳上千条以上且标注质量过得去机器学习才有发挥空间。这份资源的数据按日期批量抓取量级是够的所以走机器学习是合理的。2.3 把 HTML 转成模型能吃的格式解析这批 HTML 的核心目标是把每条文本和它的情感标签对应起来。标签来源有两种常见做法一是论文里人工标注的子集二是用关键词或表情符号做弱标注。我复现时倾向于先抽文本再单独维护一个标签文件避免解析脚本和标注逻辑耦合。import os from bs4 import BeautifulSoup def parse_keywords_html(filepath): 解析单日 keywords.html返回文本列表 with open(filepath, r, encodingutf-8) as f: soup BeautifulSoup(f.read(), lxml) # 常见结构关键词在 li 或 div 里具体标签名以实际页面为准 items soup.select(div.keyword-item) texts [] for item in items: text item.get_text(stripTrue) if text: texts.append(text) return texts def load_all_days(data_dir): 按日期遍历所有 keywords.html all_texts [] for fname in sorted(os.listdir(data_dir)): if fname.endswith(-keywords.html): path os.path.join(data_dir, fname) all_texts.extend(parse_keywords_html(path)) return all_texts这段代码的关键在soup.select的选择器必须和实际 HTML 对上。参数上lxml比默认解析器快但遇到不规范标签可能报错可以退回html.parser。get_text(stripTrue)去掉多余空白避免后续分词时出现空 token。跑完先打印条数和前几条确认没解析出空列表这是最常见的翻车点。3. 特征工程与模型训练中文文本怎么变成向量3.1 中文分词与停用词处理中文不像英文有天然空格必须先分词。常见做法是 jieba配合停用词表去掉“的、了、是”这类高频无意义词。疫情语料里还有一批领域词比如“确诊”“核酸”“隔离”这些不能当停用词删掉反而要保留甚至加权。import jieba def load_stopwords(path): with open(path, r, encodingutf-8) as f: return set(line.strip() for line in f if line.strip()) def tokenize(texts, stopwords): 分词并过滤停用词 result [] for text in texts: words jieba.lcut(text) words [w for w in words if w not in stopwords and len(w) 1] result.append( .join(words)) return resultlen(w) 1过滤单字能去掉不少噪声但也会误伤“咳”这类有意义的单字按语料实际情况调。停用词表建议用哈工大或百度的公开版本再手动补几条领域无关词。分词后的文本用空格连接是为了后面直接喂给 sklearn 的向量化器。3.2 TF-IDF 与朴素贝叶斯的组合资源走的是经典机器学习路线TF-IDF 加朴素贝叶斯或 SVM 是这类任务里性价比最高的组合。TF-IDF 把词频转成权重降低高频通用词的影响朴素贝叶斯在小样本文本分类上表现稳定训练快适合毕设这种要反复调参的场景。from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report # X 是分词后的文本列表y 是标签列表 vectorizer TfidfVectorizer(max_features5000, ngram_range(1, 2)) X_vec vectorizer.fit_transform(X) X_train, X_test, y_train, y_test train_test_split( X_vec, y, test_size0.2, random_state42, stratifyy ) clf MultinomialNB(alpha0.5) clf.fit(X_train, y_train) y_pred clf.predict(X_test) print(classification_report(y_test, y_pred))max_features5000控制特征维度太大容易过拟合太小丢信息可以先从 3000 试起。ngram_range(1, 2)加入二元词组能捕捉“不戴口罩”这种否定搭配对情感极性判断帮助明显。alpha0.5是平滑参数默认 1.0调小一点在短文本上往往更灵敏。stratifyy保证训练测试集标签比例一致数据不均衡时必加。3.3 训练集质量决定上限摘要里那句话值得反复看机器学习对训练集语料质量依赖高针对性不强会严重影响性能。疫情语料里微博口语化、情绪外露人民日报正式、克制两者混在一起训练模型可能学到的是“来源”而不是“情感”。我一般会先分来源做对比实验看模型在哪个来源上更准再决定是否合并。如果合并后精度掉得厉害说明分布差异大得考虑分模型或加来源特征。4. 避坑与排查复现时最容易卡住的几个地方4.1 解析出来是空列表现象跑完解析脚本all_texts长度为 0。原因HTML 结构和选择器不匹配或者文件编码不是 UTF-8。解决先用浏览器开发者工具确认目标元素的 class 或 id再改soup.select编码问题加encodingutf-8或gbk试。我习惯先打印soup.prettify()[:500]看真实结构比猜快得多。4.2 分词后特征全是数字和标点现象TF-IDF 矩阵里大量无意义 token。原因没做清洗HTML 残留、表情符号、URL 都进了分词。解决分词前用正则去掉http链接、用户、纯数字表情符号可以转成文字或直接删。疫情语料里“转发微博”这类模板句也要去掉否则每个样本都有等于噪声。4.3 模型精度虚高现象测试集准确率 95% 以上但换一批数据就崩。原因训练集和测试集同分布且可能有重复样本泄漏。解决按时间切分而不是随机切分用早期数据训练、后期数据测试更接近真实场景。另外去重微博转发内容重复率高不去重等于变相泄漏。4.4 类别不均衡导致模型偏向多数类现象负面样本远多于正面模型全预测负面也有高准确率。原因数据分布不均准确率不是好指标。解决看classification_report里的 F1用class_weightbalanced或对少数类过采样。别只盯着 accuracy这是血泪经验。4.5 依赖版本不一致现象源码跑不起来报sklearn或jieba接口错误。原因论文写的时候用的版本和现在装的不一样。解决先看源码里的 import 和调用方式对照当前版本改实在不行建虚拟环境装旧版。常见的是TfidfVectorizer参数名变化和jieba分词结果差异不影响大局但要心里有数。5. 从跑通到用好验证方法与一个提精度的技巧模型跑通只是起点真正要判断这份资源值不值得深入得看它能不能稳定复现。我一般会做三件事固定随机种子跑三次看方差、换不同日期段做交叉验证、人工抽 50 条看错例。错例最有价值能告诉你模型到底在学什么。如果错例集中在反讽和双重否定说明 TF-IDF 加朴素贝叶斯到顶了该考虑换模型或加特征。一个提精度的实用技巧是关键词加权。疫情语料里“封城”“清零”“拐点”这些词的情感倾向很强可以在 TF-IDF 基础上给领域词乘一个权重系数。做法是在分词后、向量化前对包含领域词的文本做标记或者直接用TfidfVectorizer的vocabulary参数传入自定义词表并调权重。更简单的办法是单独构造一个领域词特征列和 TF-IDF 矩阵拼接后一起训练。from scipy.sparse import hstack import numpy as np # 领域情感词表按极性给分 pos_words [好转, 清零, 康复, 驰援] neg_words [确诊, 死亡, 封城, 恐慌] def domain_feature(texts): 构造领域词计数特征 feats [] for text in texts: pos sum(text.count(w) for w in pos_words) neg sum(text.count(w) for w in neg_words) feats.append([pos, neg, pos - neg]) return np.array(feats) domain_feats domain_feature(X) X_combined hstack([X_vec, domain_feats])hstack把稀疏矩阵和稠密数组拼在一起注意维度对齐。pos - neg是个简单的极性差值给模型一个先验。这个技巧在数据量不大时提升明显数据量大时收益递减但作为毕设的加分项足够。验证时对比加特征前后的 F1如果提升不到 1 个点说明模型已经学到了这些信息不用硬加。从那以后我每次拿到文本分类资源都强制先跑一遍错例分析再谈优化不然调参就是盲人摸象。希望帮到你。本文还有配套的精品资源点击获取
返回列表