ARTICLE DETAIL

资讯详情

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

网络新闻评论情感分类:从特征工程到论据词语的关键实践

网络新闻评论情感分类:从特征工程到论据词语的关键实践 简介基于机器学习的网络新闻评论情感分类研究是一份面向自然语言处理与文本挖掘方向研究者的学术论文PDF针对网络新闻评论的短文本、口语化等特点系统解决了如何自动判别评论情感倾向的问题。资源包内共有1个PDF文件大小仅392KB内容为全文完整排版下载后可离线阅读或作为课题参考文献该资源已有169人学习浏览。论文归纳了网络新闻评论数据特征并围绕特征集、特征维度、权重计算方法和词性选择展开多组分类实验与对比。核心结论包括情感词与论据词语搭配使用时分类效果优于仅用情感词TF-IDF权重计算方法优于布尔型权重名词和动词作为特征比形容词和副词取得更好效果。这些分析结论对构建中文短文本情感分类模型、选取有效特征及权重策略具有直接参考价值。1. 重温一篇 2010 年的论文网络新闻评论情感分类的四个反直觉结论这份《基于机器学习的网络新闻评论情感分类研究》是《计算机应用》2010 年第 4 期的一篇短文研究的是网络新闻跟帖这种口语化短文本的情感分类。它给我的第一印象是结论足够反直觉情感词和论据词语搭配使用效果更好特征维度对准确率的影响比长文本小得多TF-IDF 权重压过布尔权重——这和当时电影评论情感分类的主流结论正好相反词性上名词、动词比形容词、副词更能打。对正在做短文本分类、舆情分析的人尤其当你发现模型在口语化数据上飘忽不定时这篇论文值得细读。机器学习入门阶段的读者也可以把它当特征工程的课后阅读比对着吴恩达的课程和周志华的西瓜书能更快理解特征选择在真实数据里的价值。2. 数据和预处理先行网络跟帖的清洗、去重与三粒度标注情感分类的第一步从来不是选模型而是搞清楚语料长什么样。论文用的语料是三个新闻事件的网民跟帖「超市禁止免费提供塑料袋」「央视停播 NBA」「刘翔退赛」。这类数据最大的特点就是又短又脏直接建模结果会很惨所以原文把数据处理放在实验之前这一步非常关键。2.1 数据特点又短又脏特征稀疏到离谱网络新闻跟帖和产品评论有本质区别。产品评论有明确的评价对象比如某款手机的屏幕、续航而且很多平台自带评分等级标注成本很低。新闻跟帖没有属性列表评论者可以围绕任何一个点发散所以论文里统一表述为「情感分析」而不是「观点挖掘」。具体到数据形态论文归纳了三个特点。第一是长度极短一般只有几十个字符包含的词典词语可能就三五个特征向量极其稀疏。第二是表达不规范口语化严重错别字、网络用语、特殊分隔符大量出现。第三是思维发散指代不明确评论者经常通过其他对象来论证自己的观点。比如有网友在塑料袋话题下写「那岂不是要提供纸袋了又要有多少森林被砍了」这里的「森林」不是评价对象而是支撑反对观点的一个论据词。这类词恰恰是后面特征实验里的关键变量先记住这个例子。2.2 去重与规范化五步清洗让语料可建模原始评论不能直接用论文做了两件事去重和规范化。去重的规则是「同一评论者短时间内发表的相同评论」这类重复内容信息量几乎为零留在语料里只会拉高某些特征的权重。规范化处理则包括简繁转换、全角半角转换、字母大小写转换、不规范分隔号识别去除、特殊符号去除。现在复现这一步用 Python 很容易下面是一个常见做法的清洗函数import re def normalize_comment(text: str) - str: # 全角标点转半角避免同一个词因标点形态被拆成两个特征 text text.replace(, ,).replace(。, .).replace(, !) \ .replace(, ?).replace(, :) # 字母统一小写“NBA”和“nba”不应该成为两个特征 text text.lower() # 去除特殊分隔符和表情符号这类噪声对情感判断没有正向贡献 text re.sub(r[【】\[\]()#\-_], , text) # 压缩连续空白 text re.sub(r\s, , text).strip() return text这个函数的执行顺序是有讲究的先转全角再转半角否则全角英文字母在大小写转换时容易漏掉特殊符号要在大小写转换之后再去因为有些符号在半角状态下会和连字符混淆。论文里还提到「支一持一封一杀一NBA」这种用「一」做分隔符的写法规范化阶段需要单独处理这类模式否则分词阶段会被切得七零八落。当年用规则脚本做现在用正则加自定义词典就能覆盖大部分情况。2.3 三粒度情感标注文档、句子、词语各标什么规范化之后是情感标注。论文采用文档、句子、词语三种粒度同时标注这是一个工作量不小但信息量很高的方案。标注流程是先确定整条评论的情感倾向再拆解句子提取每个句子的评价对象和情感词最后给每个情感词标注倾向和强度。表格里是三个粒度的标注内容标注粒度标注内容用途文档级整条评论的情感倾向正面/负面分类实验的标签句子级每个句子的评价对象、情感词提取论据词语、构建特征集词语级情感词的倾向和强度情感词典构建、词语级分析三个粒度不是各做各的而是层层约束文档倾向决定句子分析的基调句子级提取的情感词又回过来校验文档倾向是否标错。标注完还要做一致性检查否则后续的特征对比实验会积累大量噪声。我复现时一般会先用文档级结果跑一版基线再决定要不要投入句子级和词语级的标注因为后两者的标注成本高出一个量级但对特征实验是必需的。3. 特征工程定上限特征集、特征维度与词性选择怎么搭在短文本场景里模型能发挥多少取决于特征工程做到什么程度。论文的特征实验分三条线特征集构成、特征维度、词性选择。三条线的结论互相印证指向同一个判断——网络新闻评论里真正有判别力的不只是情感词还有那些承载论证逻辑的论据词语。3.1 特征集对比纯情感词覆盖不足加上论据词语才稳论文的第一组实验是人工挑选特征词。从标注好的语料里提取所有情感词和评价对象信息先只挑情感词构成「特征集一」再把评价对象里能支撑观点的论据词语合并进情感词集构成「特征集二」。然后用 SVM 分类器、TF-IDF 权重、50% 训练 50% 测试的方式跑三个事件。结果很能说明问题特征集前两个事件准确率无特征样本情况仅情感词低于 60%约占全部语料一半情感词 论据词语明显上升无特征样本急剧减少纯情感词特征集表现差的主要原因有两个一是特征维度太低人工挑的情感词覆盖不了口语化短评二是人工选词时倾向于选关联性强的词比如提到「支持」就很容易联想到「赞同」这些词在语料里高度共现特征间的冗余度很高。加入论据词语后「森林」「垃圾袋」「奥运」这类词进入特征集合评论里原本无特征的样本大幅减少准确率跟着上来了。特殊现象出现在「刘翔退赛」事件里。「加油」这个情感词对分类的贡献大得惊人删掉它之后准确率从 77.64% 直接掉到 53.89%差了将近 24 个百分点。这说明短文本情感分类里个别高频强情感词可以主导整个模型的决策后面第 5 章会专门讲这个坑。另外原文提到在去除无特征样本后三个事件重新分类的结果都超过 75%说明人工特征本身是有判别力的问题是覆盖范围不够。3.2 特征维度2000 维封顶低了也不慌第二个实验比较不同特征维度下的分类准确率。长文本分类通常靠高维特征取胜维度从几千涨到几万准确率跟着涨超过峰值后才会回落。网络新闻评论不一样特征最高维度只有 2000 左右远低于正式语料而且准确率随维度变化的曲线非常平缓——维度降低到一定程度依然能保持不错的准确率。论文给的解释是网络新闻评论用词相对集中这些出现频率高的词恰好对情感类别有较强的表征能力所以维度压缩不会立刻伤到分类器。另一个角度看短文本里特征本身少维度从 2000 压到几百损失的只是低频词而低频词在几十字的评论里本来就很难出现第二次。这个结论对我复现时的直接指导是不需要追求高维向量max_features设 300 到 800 之间就够用超过 2000 基本没什么收益。3.3 词性选择名词和动词比形容词副词更能打第三个实验看词性对分类的影响。论文用 ICTCLAS30 分词系统做词性标注分别用形容词、名词、动词、副词单独构建特征跑分类。原文表 5 的数据很有参考价值词性塑料袋政策停播 NBA刘翔退赛词语所占比例形容词名词动词副词88.19%81.53%86.83%67.77%形容词71.24%60.13%72.26%4.78%名词84.96%74.39%81.04%20.63%动词83.65%76.56%82.63%30.44%副词78.76%63.06%72.06%11.92%这个结果和「形容词最能表征情感」的直觉相反。原因有两条第一形容词和副词在网络新闻评论里占比太小四类词性合计占 67.77%形容词只占 4.78%单独作为特征时覆盖范围严重不足第二前面反复提到的论据词语词性上绝大多数是名词和动词比如「森林」「砍」这类词本身不直接表达情感但能支撑评论者的立场名词和动词把这部分信息带进了特征集合。复现时我用 jieba.posseg 做词性筛选效果可以对齐import jieba.posseg as pseg def filter_by_pos(text: str, allowed_pos: set) - list: words [] for word, flag in pseg.cut(text): if flag in allowed_pos and word.strip(): words.append(word.strip()) return words # 对应论文结论名词(n)和动词(v)优先形容词(a)、副词(d)视数据量决定是否保留 allowed {n, v} tokens filter_by_pos(现在不提供了要去买专门的垃圾袋, allowed)这里要注意的是jieba 的词性标签体系和 ICTCLAS 不同但「名词优先、动词次之」这个策略在短文本情感分类里是通用的。如果标注语料充足可以按论文的方式做一次词性对比确认自己的数据分布是否和 2010 年这批新闻评论一致。我一般会保留名词和动词形容词只在词典覆盖不足时加入副词基本不考虑。4. 权重计算方法对比TF-IDF 为何在短文本里压过布尔权重特征确定了权重怎么算又是另一个影响结果的因素。文献里有个被反复引用的结论情感分类中布尔权重优于词频权重理由是情感倾向词在一条文本里通常只出现一次出现一次就足以决定倾向重复出现没有额外信息。论文用网络新闻评论数据重新测了这个假设结果和文献相反。4.1 TF-IDF、TF、布尔三种权重的差异在短文本里被抹平先明确三种计算方式。TF 权重是词频词语在文档里出现几次就记几分衡量的是局部的显著性。布尔权重只看出现与否出现记 1不出现记 0。TF-IDF 在 TF 基础上乘一个逆文档频率因子IDF 越大说明词语在语料里越稀有从而抑制「的」「了」「是」这类高频虚词放大那些在少量文档中出现的信息词。TF-IDF 的计算公式可以写成TF-IDF(t, d) TF(t, d) × IDF(t) IDF(t) log(总文档数 N / 包含词语 t 的文档数 df(t))在长文本主题分类里TF-IDF 压制常见词的效果非常明显。但情感分类和主题分类的信息分布不同主题由关键词决定情感倾向经常由少量词甚至一个词决定。所以 Pang 等人在电影评论上得出的结论是布尔权重更好因为情感词重复出现的情况本来就少词频带来的区分度十分有限。4.2 实验结果TF-IDF 略优但差距不明显论文用 TF-IDF、TF、布尔型三种权重分别测试三个数据集结论是 TF-IDF 获得较优准确率但三种方法的差距并不大。原文给了两个原因。第一网络新闻评论长度极短同一条评论里情感倾向词重复出现的概率大大降低三种权重计算出的数值实际很接近。第二评论里出现次数较多的词语主要是评价对象和论据词语这些词对情感倾向有较好的表征能力用 TF-IDF 能进一步放大它们在分类中的作用。这个结论对我的提示是权重策略要跟着数据特性走不要照搬其他领域的结论。在短文本场景里如果你不确定该用哪种权重直接跑一组对比就行成本很低。Scikit-learn 里几分钟就能出结果from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer from sklearn.svm import SVC from sklearn.pipeline import Pipeline # TF-IDF 权重 pipe_tfidf Pipeline([ (vec, TfidfVectorizer(max_features800)), (clf, SVC(kernellinear)) ]) # 布尔权重CountVectorizer 加 binaryTrue pipe_bool Pipeline([ (vec, CountVectorizer(binaryTrue, max_features800)), (clf, SVC(kernellinear)) ])跑完之后不要只盯着准确率还要看两份预测结果的错误样本是否重合。如果重合度高说明两种权重下的特征空间差异不大选哪个都行如果不重合就值得分析哪些样本被 TF-IDF 救回来了这才是实验的价值所在。4.3 我复现时的参数设置基于论文的实验结论我在复现时固定了一组参数max_features2000对应论文里的特征维度上限实际测试时先在 300、500、800、1200 各跑一遍取交叉验证均值最高的值。min_df设 1因为短文本里很多信息词只出现一两次设 2 会把「垃圾袋」「森林」这类论据词过滤掉。ngram_range保持(1, 1)不升 bigram 是刻意为之——短文本里相邻词组合几乎都是重复信息扩大 n-gram 只会让矩阵更稀疏。sublinear_tf可以试论文时代没有这个参数但它是 TF 取对数的一种平滑方式在某些数据上能小幅提升稳定性这属于现代实现的改良不是论文原结论。5. 复现避坑四个高频问题与对应的处理办法论文里有一些结论是显式的有一些是隐含的复现时最容易翻车的都是隐含的部分。下面四个问题是我自己踩过坑之后沉淀下来的每条都按「现象、原因、解决」来写。5.1 分词翻车网络用语和人名被切得七零八落现象用普通分词器处理「不播就不播有什么大不了的电视台有权选择放什么节目」这类评论分词结果还算正常但遇到「支一持一封一杀一NBA」这种插字写法输出变成「支」「持」「封」「杀」特征是四个单字信息完全丢失。遇到网络人名和别称同样容易被切碎。原因当年论文用的 ICTCLAS30 基于书面语训练对网络口语的覆盖很弱。现在的主流分词器虽然进步很大但面对口语化短文本依然会栽在特殊分隔符和网络新词上。解决在分词前先做一层正则预处理把「一」「~」这类插入的分隔符替换掉再加载自定义用户词典。比如上面那条评论预处理后变成「支持封杀NBA」分词器能正确输出完整词语。词典里要包含事件相关的人名、机构名和网络热词这一步是中文短文本情感分类绕不开的脏活。5.2 无特征样本过多纯情感词典覆盖不住口语评论现象只用情感词构建特征时三个事件里前两个的准确率低于 60%检查特征矩阵发现近半数评论没有任何特征词命中分类器等于在拿一半样本硬猜。原因网络新闻评论太短一条评论可能就一个词加一个标点。情感词典覆盖的词语集中在正式表达上口语化短评里的高频词多数不在词典里。解决照论文的做法把论据词语加进特征集。论据词语从句子级标注的评价对象里提取词性上以名词和动词为主。加入之后无特征样本数量急剧减少准确率随之上升。如果标注语料不足可以退而求其次把新闻原文里的高频名词提前拉出来做成候选论据词表也能覆盖一部分。5.3 「加油」效应单一强特征词绑架整个模型现象刘翔退赛数据集里保留「加油」时准确率 77.64%把它从特征集合里删掉准确率掉到 53.89%模型几乎瘫痪。原因短文本里特征稀疏一个高频强情感词可能出现在大量正样本里SVM 的决策函数在训练过程中把大量权重压在这个词上。删掉它模型缺少了最主要的判别依据。解决做特征稳定性检查。具体操作是从特征集合里逐个删除高频特征词观察交叉验证准确率的波动幅度凡是删除后准确率掉超过 3 个百分点的特征都要警惕模型对它的过度依赖。缓解办法是保留相对多样的特征来源情感词、论据词混合以及用 5 折交叉验证取均值而不是用单次划分的结果下结论。5.4 权重结论照搬文献说布尔好你的数据不一定现象在电影评论领域布尔权重优于词频权重是常见结论。直接把这个结论搬过来用到网络新闻评论上发现布尔权重并没有优势甚至略差。原因电影评论长度适中情感词重复出现的概率比几十字的新闻跟帖高布尔权重能发挥「出现即决定性」的优势。网络新闻评论里论据词语是重要特征这类词需要用 TF-IDF 的逆文档频率来强化区分度布尔权重给所有出现的词相同的权重反而抑制了论据词的作用。解决权重方案必须在自己数据上重新验证。我在实验里固定跑三组TF-IDF、TF、布尔每组 5 折交叉验证最后看均值再选。多个数据集上如果 TF-IDF 稳定领先就不必纠结文献结论。6. 一个验证技巧用最小样本十分钟跑通情感分类全流程论文里那些实验结论自己动手复现一遍才会真正变成自己的东西。完整复现三个事件、多种特征组合的代价很高我一般先做一个最小复现单选一个事件正负样本各几十条用 TF-IDF 加线性 SVM把全流程跑通确认数据和参数没问题再扩展。import jieba from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 自定义词典覆盖事件相关的人名、网络用语 jieba.load_userdict(userdict.txt) def tokenize(text: str): # 先清洗再分词顺序不能反过来 text normalize_comment(text) return [w for w in jieba.cut(text) if w.strip()] # 论文结论短文本里低维度就能保持较好准确率500维足够起步 pipe Pipeline([ (vec, TfidfVectorizer(tokenizertokenize, max_features500)), (clf, SVC(kernellinear, C1.0)) ]) # 50%训练 / 50%测试和论文实验的切分比例保持一致 split int(len(comments) * 0.5) pipe.fit(comments[:split], labels[:split]) preds pipe.predict(comments[split:]) print(acc:, accuracy_score(labels[split:], preds))跑完先看两个指标准确率是否在 75% 附近以及无特征样本占比是多少。论文在去除无特征样本后三个事件都能超过 75%如果你的结果明显低于这个区间优先检查分词和清洗而不是调 SVM 参数。如果无特征样本占比超过 20%说明特征集合覆盖不足回到第 3 章的思路补论据词语。从那以后我每拿到一批新的文本数据第一件事就是跑一遍这个最小流程确认当前特征方案能稳定在合理区间再去谈调参数、换模型的事。这个习惯帮我挡掉了至少三次在错误数据分布上做无用优化的时间浪费希望帮到你。本文还有配套的精品资源点击获取
返回列表