Stanford NLP学习笔记:7. 情感分析(Sentiment)

1. 什么是情感分析(别名:观点提取,主题分析,情感挖掘。。。)

应用:

1)正面VS负面的影评(影片分类问题)

2)产品/品牌评价: Google产品搜索

Stanford NLP学习笔记:7. 情感分析(Sentiment)

3)twitter情感预测股票市场行情/消费者信心

Stanford NLP学习笔记:7. 情感分析(Sentiment)

2. 目的

利用机器提取人们对某人或事物的态度,从而发现潜在的问题用于改进或预测。

这里我们所说的情感分析主要针对态度(attitude)。

注:Scherer 情感状态类型主要可以分为:

情绪(emotion):有一定原因引发的同步反应。例如悲伤(sadness),快乐(joy)

心情(mood):没有明显原因引发的长期低强度的主观感受变化。例如忧郁(gloomy),倦怠(listless)

人际立场(interpersonal stance):对他人的特定反应。例如疏远(distant),冷漠(cold)

态度(attitude):对特定人或事物的带有主观色彩的偏好或倾向。喜欢(like),讨厌(hate)

个性特质(personal traits):相对稳定的个性倾向和行为趋势。例如焦虑(nervous),渴望(anxious)

具体定义可以参考这篇文章

3. 情感分析的内容

考虑到态度可以具体分成一下内容:

1) 态度的持有者(source)

2) 态度的目标(aspect)

3) 态度的类型:一系列类型如喜欢(like),讨厌(hate),珍视(value),渴望(desire)等;或着简单的加权极性如积极(positive),消极(negative)和中性(neutral)并可用具体的权重修饰

4) 态度的范围:某句话/全文

因此情感分析的目标可以分为一下几种:

初级:文章的整体感情是积极/消极的?

进阶:对文章的态度从1-5打分

高级:检测态度的目标,持有者和类型

4. 基准算法(Baseline Algorithm)

极性检测(Bo Pang et.al. Thumbs up? Sentiment Classification using Machine Learning Techniques. EMNLP-2002, 79-86)

数据样例: IMDB影评数据

步骤:

1)分词(tokenization)

分词的一些问题:

1.如果数据来自HTML或XML格式,那就需要处理相应的标记;

2.Twitter标记(名字,哈希标签);

3.大小写(中文不存在)

4.均一化电话号码和日期等数字;5. 表情符号(emoticons)

2)特征提取(feature extraction)

特征提取的问题:

1.如何处理否定词;

在否定词的到最近的标点之间的所有词添加NOT_前缀(所有否定词后的词极性取反,最早由Das, Mike Chen et.al 在Yahoo! For Amazon: Extracting market sentiment from stock message boards. 2001. APFA中提出)

Stanford NLP学习笔记:7. 情感分析(Sentiment)

2.什么词用于分析:只用形容词/所有词 (在样例数据上表现更好)

3)分类(classification):常用分类器 - 朴素贝叶斯,MaxEnt分类器,SVM

朴素贝叶斯(naïve Bayes)

Stanford NLP学习笔记:7. 情感分析(Sentiment)

解释一下:左边代表的是这个评论的极性类型,就是右边概率最大的情况下的极性类型。P(cj)指该极性类型出现的概率,ΠP(wi|cj)指在当前极性条件下文档中各个词出现的概率的乘积。

这里的用Laplace(+1 smoothing)转换:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

其中V就是当前训练文本的词汇量。

二项(布尔值)多项式朴素贝叶斯(Binarized/Boolean feature multinomial naïve Bayes):一篇文档中出现的所有出现的词的频率计数为1.

原则:对情感而言,词是否出现比其出现的次数更有意义。

a) 模型训练:

1.从训练文库中提取词汇

2.计算P(cj)

Stanford NLP学习笔记:7. 情感分析(Sentiment)

3.计算P(wk|cj)

Stanford NLP学习笔记:7. 情感分析(Sentiment)

Boolean naïve Bayes的特点就是第一步去重,然后才把所有文档合并为一个大文档;而最后的α就是之前所提到的Laplace处理。

b) 验证集:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

c) 具体例子:

一般naïve Bayes:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

在测试集上,C类Chinese出现频次为5,P(Chinese|C) = 5/8;在验证集上的频次为3.

Boolean naïve Bayes:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

去重后,测试集上C类的Chinese频次为3,P(Chinese|C)=3/6;验证集上频次为1.

注:1. 经过测试Boolean naïve Bayes的效果比计数所有词的一般naive Bayes要好;2. Boolean naïve Bayes与multivariate Bernoulli naïve Bayes(MBNB) 不同,后者不适用与情感分析相关的问题。3. 频次统计除了所有词或去重只保留一个,还可以用log(freq(w)),词频介于两者之间,可能效果会更好。

d) 交叉验证(cross-validation)

这个材料由很多在这就不具体展开了,没听过的可以看这里

Stanford NLP学习笔记:7. 情感分析(Sentiment)

注: 一般来说,除此以外最后会用一个没有在交叉验证数据集中的验证数据集来最后测试一下,防止过拟合。

e) 分类的其他问题

MaxEnt与SVM分类器一般在大量数据下表现比naïve Bayes要好

4)问题:无法对那些没有出现明显的感情词汇但表达了积极或消极的情感的文本进行正确分类。例如:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

顺序效应(florida expectation problem)(前面描述了很长很期待的句子,但只是为了表达不满)。例如:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

5. 情感词典(sentiment lexicons):这部分讲的都是英文词典(可以略过)。

General Inquirer (Philip, 1966); LIWC (Pennebaker, 2007); MPQA Subjectivity Cues Lexicon (Riloff and Wiebe, 2003); Bing Liu Opinion Lexicons (Bing Liu, 2004); SentiWordNet (Stefano, 2010)

各词典对于极性的判断比较一致,可以随便用。

Stanford NLP学习笔记:7. 情感分析(Sentiment)

分析IMDB评论极性:

1)将1-3星计数为差评类,但不要使用原始的差评类中的词的个数用于极性分析,因为虽然评高分的人比评一分的人少,但是留下评论的更多的是好评的人(满意的人倾向于留下评论),因此直接用会由偏差,需要用似然度(likelihood):

Stanford NLP学习笔记:7. 情感分析(Sentiment)

其中f(w, c)指c类中w的个数,分母为该类所有词的个数。

然后归一化(scale)使词与词之间的频率可以相互比较: P(w|c)/P(w)

2)一些词在各评分的出现频率

Stanford NLP学习笔记:7. 情感分析(Sentiment)

3)Pott’s 2011 experiment result: more negations in negative sentiment(否定词常出现于负面情绪)

6. 情感词典的构建

半监督学习法(Semi-supervised learning)

使用少量打标的样本和制定的规则来bootstrap(大概是自举的意思)词典。

方法1:Hatzivassiloglou and McKeown原则 – and连接的形容词极性相同, but连接的形容词极性相反。例如: Fair(公平) and legitimate (正当); fair(公平) but brutal(残忍)。

此方法使用于单个词

步骤:

a)人工打标种子形容词极性集(pos & neg)

b)扩展与种子集共同出现的形容词。方法可以如下:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

google上前排出现的连体词一般都是高频的,不太容易出错。

c)用监督分类器对各个词对进行极性相似度打分:count(and)高的表示相同的极性,count(but)高的表示相反的极性。

Stanford NLP学习笔记:7. 情感分析(Sentiment)

d)基于相似度聚类将所得的词分成两类

Stanford NLP学习笔记:7. 情感分析(Sentiment)

e)手动矫正一些误分类的词

方法2:Turney Algorithm:适用于短语,可学习到局部信息特征。

a)提取短语词典: 提取与形容词相关的2词短语,标准如下:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

b)学习短语极性

衡量两个词的共现程度:PMI (Point mutual information) .

Stanford NLP学习笔记:7. 情感分析(Sentiment)

两个词相互独立。

注:PMI是交互信息(mutual information)衡量方式的变体。

具体方法:

通过搜索引擎搜索,P(word) = hits(word)/N,分子为搜索结果中出现该词的条目数,分母为所有搜索到的条目数;而P(word1, word2) = hits(word1 NEAR word2)/N^2,分子为两个词出现在同一处地方的条目数,分母为所有搜索到的条目数。

评价某个词的极性就只需要将正向词的PMI减去负向词的PMI,若大于0,则可认为正,反之可认为负。比如:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

c)基于短语的平均极性对评论总体极性进行打标,比如

Stanford NLP学习笔记:7. 情感分析(Sentiment)

方法3:利用WordNet学习极性

WordNet为同义词典,因此提取极性词典只需要将种子正向词在WordNet中的近义词(synonym)和反向词在WordNet中的反义词(antonym)加入到种子积正向词库,将种子负向词的同义词和种子正向词的反义词加入到种子反向词库,往复迭代数次即可。

总结:因为用了多个词的短语,相比单个词的极性分析,可以了解文本局部的信息,而且容错能力更强。

7.其他一些情感分析内容

1)单句情感:寻找情感描述的对象

Stanford NLP学习笔记:7. 情感分析(Sentiment)

方法(raised by Hu 2004 & Goldensohn 2008):

1.高频短语+规则。首先获取评论中出现的高频短语,然后制定规则,比如对评价食物我们可以将出现在情感词之后的高频词作为情感的对象 – 高频词为fish tacos, 那么评论中出现great fish tacos我们就认为fish tacos是great的情感描述对象。

2.对于描述内容的方向比较明确的评论可以预先定义对象然后用监督学习的方法进行对象分类。比如对于餐馆评论而言,一般描述的对象为food, décor, service, value,NONE(其他),首先将一些餐馆评论语句人工打标为上述标签,然后作为训练集训练一个描述对象的分类器。

总体流程如下:

Stanford NLP学习笔记:7. 情感分析(Sentiment)

分句 -> 情感极性分类 -> 提取主题 -> 汇总得到增提评论

2)样本不平衡问题(机器学习常见问题了)

不同极性的评论数量差距太大(比如10^6好评vs10^4差评),会导致分类器模型参数异常。解决方式为重抽样(好评只取10^4条)或者采用代价敏感学习(cost-sensitive learning),比如在训练SVM分类器的时候 将稀有样本错误分类的惩罚加大。

3)处理打分问题(例如5星)

1.可将其转化为二元分类问题,比如小于2.5星的视为neg,大于2.5星的视为pos。

2.直接将星与极性强度用线性回归或其他方式拟合

8.总结

1.情感分析本质上还是分类问题(二分或者回归)

2.否定词在情感描述中很重要

3.使用所有词的naïve Byes模型在一些问题上表现较好,而使用子集短语的模型则在另一些表现较好。

4.构建极性词库流程:手动标记种子极性词库,然后用半监督学习方式扩展词库

5.除了态度(attitude)以外,Scherer情感状态的其他类型,emotion,mood,interpersonal stance,personal traits都是情感分析的重要方向。

9.传送门:

1.Stanford nlp公开课视频:https://www.youtube.com/playlist?list=PLuBJa2RktQX-N0flCReMywxy1E-tsF0ZC

2.课件:https://web.stanford.edu/~jurafsky/NLPCourseraSlides.html

上一篇:Stanford Corenlp学习笔记——词性标注


下一篇:.NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式