ARTICLE DETAIL

资讯详情

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

情感词典结合机器学习:新闻与微博评论情感分析实战

情感词典结合机器学习:新闻与微博评论情感分析实战 简介面向自然语言处理与机器学习学习者的情感分析项目资源包整合情感词典与朴素贝叶斯、支持向量机、随机森林等经典分类模型可完成新闻与微博评论的情感倾向识别、情绪强度与主题分析适用于文本挖掘实践、课程设计或舆情研究入门。压缩包共39个文件、2.63MB包含16个Python脚本爬虫、词典匹配、特征工程与模型训练、9个Markdown文档研究背景、数据获取说明等、7个CSV数据集及备份文件目录划分清晰便于对照复现。目前已有33人学习下载。读者可从中获取完整的实验代码、情感词典关键词生成方案、微博与新闻数据爬取脚本、建模与评估流程说明以及基于哈工大/知网情感词典的实践思路能帮助理解特征选择对模型性能的影响快速搭建自己的情感分析实验环境。资源来自网络分享仅作学习交流用途。1. 情感词典与机器学习结合的新闻与微博评论情感分析解决的是单一方法的死角做舆情的人都经历过这种尴尬新闻评论区里一句“这政策真是绝了”词典把“绝了”判成正向可结合上下文明明是讽刺微博里“哈哈哈好家伙”五个字词典直接给中性分人眼一扫就知道是吐槽。新闻评论用词书面、句式完整微博评论充满了反讽、缩写、表情符号和网络黑话任何单一方法都容易翻车。情感词典可解释性强、不需要标注语料但覆盖不了网络新词和复杂句式机器学习分类器对上下文敏感、能学到语料里的隐含模式但依赖标注质量且决策过程难回溯。两者结合的价值在于互补词典负责锚定基础情感和可解释的强信号模型负责理解语境和修正词典的盲区最终输出一个既讲得清理由、又扛得住噪声的判定结果。这套思路适合舆情分析、电商评论挖掘、用户反馈分类这类真实文本不是“干净新闻稿”的场景下面从词典建设、模型选型、融合策略到量化验证逐一展开。2. 从词典到模型先搞清楚情感倾向怎么定义再谈分类器选型拿到评论数据最忌讳直接撸代码训练模型先把“情感”这个抽象概念落地成可计算的定义。新闻评论的情绪往往集中在事件评价、政策态度和报道立场上微博评论还会夹带对当事人、关联事件的连锁情绪。所以我在项目里不只用正负二分类而是采用“正面、负面、中性”三分法外加一个强度值0到1之间这样词典打分和模型概率输出能对齐后面做融合时不用来回换算。2.1 情感词典构建种子词、PMI扩展和领域词表三件套基础做法是从公开情感词典大连理工情感本体库、知网情感词典取种子词但直接套用效果不好因为新闻和微博的高频表达是“甩锅”“翻车”“实锤”“破防”这类网络词。常见做法是用PMI点互信息从语料里自动扩展词典核心思想是如果一个词经常和“好评”“点赞”“垃圾”“失望”这类强情感词在同一窗口出现那它本身也携带情感倾向。from collections import Counter import math, jieba def expand_lexicon(corpus, seed_words, window3): word_count Counter() pair_count Counter() for words in corpus: words jieba.lcut(words) for i, w in enumerate(words): word_count[w] 1 for j in range(max(0, i-window), min(len(words), iwindow1)): if i ! j: pair_count[(w, words[j])] 1 total sum(word_count.values()) pmi_scores {} for (w1, w2), cnt in pair_count.items(): if w1 in seed_words or w2 in seed_words: p_w1w2 cnt / total p_w1 word_count[w1] / total p_w2 word_count[w2] / total pmi math.log((p_w1w2 / (p_w1 * p_w2)) 1e-9) pmi_scores[(w1, w2)] pmi return {pair: score for pair, score in pmi_scores.items() if score 2.0}这段代码里window参数控制共现窗口大小微博文本我一般取3新闻取5新闻句子长窗口太小抓不到真正相关的搭配。PMI阈值的2.0是个经验值语料质量差时可以放宽到1.5但要小心引入噪声词。扩展出的候选词还需要人工过一遍尤其是那些和行业相关的强情感词。新闻领域要补“失职”“违规”“问责”微博领域要补“yyds”“绝绝子”“下头”。领域词表我单独维护成一个JSON文件和通用词典分开加载方便随时增删。2.2 机器学习分类器选型朴素贝叶斯到LSTM/TextCNN的定位有了词典做基线再谈模型。网络热词“机器学习 分类器”“lstm中文文本情感分析”说明多数人第一步想到的是用分类器直接预测情感。但不同模型在这个任务上的定位完全不同模型输入特征优点缺点适用场景朴素贝叶斯TF-IDF或词频向量训练快、小样本可收敛特征独立假设过强快速基线、冷启动SVM线性核TF-IDF向量高维稀疏表现稳调参繁琐、特征需归一中等规模新闻评论LightGBM/XGBoostTF-IDF词典特征句法特征特征组合能力强、可解释性好需要手工构建特征新闻微博混合语料TextCNN词向量序列能捕捉局部n-gram模式长距离依赖弱短文本吐槽、微博评论BiLSTMAttention词向量序列上下文理解强训练慢、需大语料长评论、舆情深度研判实际项目里我一般先用朴素贝叶斯跑通pipeline拿到基线F1值再切到LightGBM做特征工程迭代。只有当语料标注超过2万条并且分类器效果明显滞后时才值得上深度学习模型。这里的判断依据是收益递减词典融合能解决80%的典型误判剩下20%才是模型能力问题。“多模态情感分析”在刚兴起时火过一阵模型侧本质是把文本和表情符号、图片描述向量一起拼到分类器里。微博自带的表情符号是天然的情感信号可以在预处理阶段把[微笑]、[怒]、[泪]这类符号映射成独立的token参与向量化效果通常比直接丢弃好。2.3 词典特征如何喂给模型别只做二值匹配把词典结果直接拼进特征矩阵是常见误区更有效的做法是构造维度更丰富的词典特征def lexicon_features(tokens, pos_dict, neg_dict, degree_dict): pos_score sum(pos_dict.get(t, 0) for t in tokens) neg_score sum(neg_dict.get(t, 0) for t in tokens) hit_count sum(1 for t in tokens if t in pos_dict or t in neg_dict) degree_weight sum(degree_dict.get(t, 0) for t in tokens) return [pos_score, neg_score, pos_score - neg_score, hit_count, degree_weight]这个函数输出5个维度正向总分、负向总分、净得分、命中词数、程度副词加权值。命中词数这个维度很关键它告诉模型这条评论里情感词是稀疏还是密集有些短评论净得分很高但只有1个词命中模型会学到这可能是反讽。程度副词“很、太、超、爆”单独抽出来加权解决“有点开心”和“非常开心”的强度差异。3. 用Python复现完整流程数据清洗、特征拼接、分类器训练与调参这一节直接从一杯咖啡的功夫能跑起来的最小可复现闭环讲起。前置条件Python 3.8jieba、scikit-learn、lightgbm已安装标注好的训练语料至少2000条有正负标签。3.1 数据预处理新闻和微博的清洗差异import re, jieba import pandas as pd def clean_comment(text, sourceweibo): text re.sub(rhttps?://\S, , text) text re.sub(r[\w\u4e00-\u9fa5], , text) text re.sub(r#(.?)#, r\1, text) # 保留话题核心词 text re.sub(r\[([\u4e00-\u9fa5])\], r \1 , text) text re.sub(r(.)\1{2,}, r\1\1, text) # “好好好好”折叠成“好好” if source news: text re.sub(r[。], 。, text) # 新闻按句分割 return text.strip() def tokenize(text, sourceweibo): if source news: parts text.split(。) return [w for part in parts for w in jieba.lcut(part) if w.strip()] return [w for w in jieba.lcut(text) if w.strip()]微博清洗里把表情符号[笑哭]转成独立token是提升模型效果的重要细节因为表情本身携带强情感信息正则\[([\u4e00-\u9fa5])\]匹配所有方括号中文表情并保留文本模型能学到“笑哭”往往与自嘲或无奈相关。重复字折叠防止“哈哈哈哈哈”被切成多个无意义词。新闻评论不做表情处理但要按句分割让每个句子的情感边界更清晰。3.2 特征工程词典得分特征与TF-IDF特征拼接这步是整个人工pipeline的核心特征质量直接决定分类器上限。词典特征外TF-IDF向量负责捕捉无词典覆盖的词汇模式。from sklearn.feature_extraction.text import TfidfVectorizer from scipy.sparse import hstack, csr_matrix import numpy as np def build_feature_matrix(df, pos_dict, neg_dict, degree_dict): tfidf TfidfVectorizer(max_features5000, ngram_range(1, 2), min_df3, max_df0.8) X_tfidf tfidf.fit_transform(df[clean_text]) lex_feats np.array([lexicon_features(jieba.lcut(t), pos_dict, neg_dict, degree_dict) for t in df[clean_text]]) X_lex csr_matrix(lex_feats) return hstack([X_tfidf, X_lex], formatcsr), tfidfmax_features5000限制词表规模防止维度爆炸ngram_range(1,2)让“不好”和“不 好”两个词的组合也能被识别为特征。min_df3滤掉只出现过一两次的生僻tokenmax_df0.8滤掉几乎所有文本都出现的高频停用词。词典特征矩阵转成稀疏矩阵再拼接否则内存会爆。TF-IDF维度的5个特征在数值量级上远小于TF-IDF权重但拼接前不需要标准化LightGBM这种树模型对特征尺度不敏感。如果用SVM则必须对全矩阵做标准化否则词典特征会被淹没。3.3 分类器训练朴素贝叶斯建基线LightGBM做主力from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report import lightgbm as lgb X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy) model p a hrefhttps://download.csdn.net/download/2401_89793006/91402457 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表