斯坦福大学自然语言处理第七课“情感分析(Sentiment Analysis)”

斯坦福大学自然语言处理第七课“情感分析(Sentiment Analysis)”,第1张

从最基本的开始吧:基于词典的正负词词频,我们实验室一个小组曾经在新浪微博上使用这个方法,惊讶的发现这个如此不优美的方法的效果竟然那么的“可以看”。在此之上一个改进的法是对大量数据做一次二元的离散化(假定是正负情感),以此选定阈值,离散化的方法有很多,不再赘述。接下来的方法主要分为两类:基于特征(feature-based):这类方法比较好理解,无非是人来选定特征空间,然后对每一个数据项生成一个特征向量,使用分类器对向量进行分类,理论上所有的分类器都可以实现这个需求,只是效果更不同。方法之一是就是KNN,但是和所有基于特征的方法一样,特征的选取是一个永恒的话题,像KNN这种还需要维护巨大矩阵的方法尤其难以满足实用需求,但是对于KNN的空间优化也有相应的法,就是对每个数据项指记录K项最近距离,也就是K个,当有更近的数据项进来时,替换最远的数据项,此外,我也同意@范文阁下的观点,觉得KNN的效果不会好于SVM。SVM:经典分类器,我决不敢自称完全理解SVM,但使用方法大同,也是将数据项生成特征向量(稍后会介绍另一种方法),但是特征的选取是一个永恒的话题,因为一切特征对于描述一个数据项来说都是必要的(但是不一定重要),但是我们尽量选取合适的特征组来保证分类的准确率,这一切,这所做的一切都是对无法枚举出所有特征的现状的妥协。SVM的开源包有很多,楼主可以试试libsvm和svmlight。基于核函数(KernelMethod-based):前面提到人为的选取特征的局限性,并且隐含的线性不可分问题。核函数是一个计算两个对象之间“相关度”(kernel)的函数。有关核函数的定义和优化方法不一会儿能够谈清,仅列出文献:wiki:http://enwikipediaorg/wiki/Kernel_methodsTextClassificationusingStringKernels:http://dlacmorg/citationcfmid=944799&dl=ACM&coll=DL&CFID=96216241&CFTOKEN=33225628KernelMethodforGeneralPatternAnalysis:http://wwwkernel-methodsnet/tutorials/KMtalkpdf(以下方法没有经过验证)基于核函数的SVM,应用方式(以情感分类为例)可以简单地做文本分类(当然可以预先做词性过滤),对于每一个需要做情感分类的文本之间算出kernel值,用这个矩阵在svm中得到model,然后对于测试数据,或者预测数据在对训练数据中的每一项算kernel值,拿这个矩阵用model去做测试(预测)。这个过程的一个“快餐”的理解方式是:将每一个数据与测试数据集中的每一项的相似度的向量当成之前feature-based的方法中的特征向量,整个过程不过还是一个基于特征的训练-预测过程(当然,这说法是不对的)。libsvm中自带subsequencekernel的实现使用参数-t来进行使用,此外也支持自定义核函数。之前谈过的KNN,我觉得也可以引入kernel,但是至于可行性和必要性嘛,大家也就当讨论一下吧。简单来说就是将KNN中的欧式距离替换成kernel值。==============================CRF应该没法做情感分类吧,毕竟不是分类器,拿它做过实体识别,感觉序列标注器不适合这个问题。严重同意@范文阁下的说法,在实用领域,预处理和数据获取(语料)才是王道,机器学习就和人学习一样,教育方法再好,教的东西不好一样是浮云。拿我大二数据挖掘老师的话讲,统计模型都是现成的,拼得就是数据。

本次实验将继续加载两个数据,一个是已经标注好的用户评论数据,另外一个是用户评价主题句,通过标注过的用户评论数据研究不同粒度的用户评价处理对深度情感分析模型的性能的影响,并比较字符级模型在用户评价情感极性推理上的差异。

使用 Pandas 加载已经标注好的在线用户评论情感数据表格,并查看数据维度和前 5 行数据。

加载民宿评论数据,并打印第一行。

数据属性如下表所示

用户评论分词

jieba 分词器预热,第一次使用需要加载字典和缓存,通过结果看出返回的是分词的列表。

批量对用户评价进行分词,并打印第一行数据,处理过程需要一些时间。

将用户评论处理成字符级别,为字符级模型提供训练集,并打印第一行数据,此预处理速度远远快于分词速度。

TextCNN 使用的卷积神经网络是一个典型的空间上的深度神经网络,基于卷积神经网络的情感分析具有优秀的特征抽取能力,能显著降低情感分类中人工抽取特征的难度。这类方法又根据文本嵌入粒度的不同可以分为字符级嵌入和词嵌入两种,一种是以分词后的词为情感分析粒度,另一种为字符级粒度的情感分析粒度,最后一层将包含全文潜在信息的最终编码送入 Sigmoid 做情感强度计算,即可对用户评论进行情感极性推理,是目前在文本分类经常使用的模型。

词级别模型训练

按照训练集 8 成和测试集 2 成的比例对数据集进行划分。

词级 TextCNN 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。

通过传入原始的标签和预测的标签可以直接将分类器性能进行度量,并对指标收集,包含:模型的训练时间、accuracy_score 表示被正确预测的样本占总样本的比例、f1_score 值表示精确率与召回率的调和平均数和模型标签。

对训练的模型进行加载,并打印网络结构。

设置固定划分数据集,划分比例为 02 即训练集是测试集的 4 倍量。

字符级别模型训练

字符级 TextCNN 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。

对字符级 TextCNN 的预测结果进行收集。

GRU 属于 RNN(recurrent neural networks,循环神经网络),是 LSTM 最流行的一个变体,比 LSTM 模型要简单,GRU 的门控单元减少了一个,GRU 与 LSTM 一样都是旨在解决标准 RNN 中出现的梯度消失问题,GRU 比 LSTM 在减少了计算量的条件下,做到了精度与 LSTM 持平,是目前在文本分类经常使用的模型。

我们使用函数定义的方式进行 GRU 模型的初始化。

对训练的模型进行加载,并打印网络结构。

词级别模型训练

词级 GRU 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。

对训练的模型进行加载,并打印网络结构。

字符级别模型训练

将处理好的用户评论数据进行字符级处理即可输入字符级 GRU 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。

对字符级 GRU 的测试集预测性能进行记录。

模型性能分析

通过控制参数变量的方式进行,并使用同样的数据集合观察性能指数测试结果。字符级能使用较小的字符级词典对语料的覆盖度更高,字符级预处理在测试集上的表现基本接近词级模型,并从耗时来看字符级都是最少的。TextCNN 架构总体高于 GRU 的准确度和综合值,并且训练时间相对较短。字符级语言建模的思想来自于信号处理,使用语言最小的文字单元去模拟复杂的语义关系,因为我们相信模型可以捕捉到这些语法和单词语义信息,在后续我们继续使用这种方式。

对用户评论数据预处理

对用户评论进行字符向量化。

情感极性推理

使用训练好的字符级 TextCNN 对用户评论进行情感预测,需要一些时间,请耐心等待。

使用训练好的字符级 GRU 对用户评论进行情感预测,需要一些时间,请耐心等待。

情感极性推理结果可视化

将两种字符级神经网络情感极性推理模型的结果取出来。

对全量的用户评论分别使用两个模型进行情感极性预测,并进行可视化,我们发现两种模型在全量的用户评论上的表现基本一致,字符级 TextCNN 在用户两极情感极性上表现更好。

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/qinggan/7812625.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-09-07
下一篇2023-09-07

发表评论

登录后才能评论

评论列表(0条)

    保存