IMBD影评数据的情感分析

来源:互联网 发布:js图片跨域上传 编辑:程序博客网 时间:2024/04/25 14:01

IMBD影评数据的情感分析


问题情况

SemEval往年的任务:情感分析(Sentiment Analysis,SA)。

采用的某博客推荐的一个数据集,IMBD影评数据,给出5W条标注数据,每条数据包括影评内容和影评作者对电影评分(1-10整数评分,其中1-5认为是neg,6-10认为是pos,这个数据集是一个均衡数据集,且得分分布关于5.5对称)。

我从5W条中取出一部分做训练集,取出另一部分做测试集,比例为1:1,对于测试集,我写了一个脚本从两方面评价结果,一是我的评分与实际评分的Pearson相关系数(Pearson),二是我的评分的倾向(neg/pos)与实际倾向的正确率(Correct)。


思路

认为得分和该影评对应电影得到pos倾向的概率存在正向关,这个假设显然是合理的。选取合适的转换函数,把得分转化为得到pos倾向标签(tag)的概率。同时认为文本由单词特征(feature)构成。这样本问题转化为一个feature-tag问题,计算出pos倾向的概率,再转化为得分,就是对评分的一个合理的估计。


解法

可以用rank[1, 10]→pro[0, 1]的线性函数来实现得分到概率的转化。

可以用一个朴素贝叶斯来实现feature-tag的基本功能,并做一些数学技巧上的优化。
具体数学原理为:

Naive Bayes Classifier

dim rate = p(pos|sen) / p(neg|sen)
dim log_word_rate[word] = log(p(word|pos) / p(word|neg))

p(pos|sen) = p(sen|pos)p(pos) / (p(sen|pos)p(pos) + p(sen|neg)p(neg))
p(neg|sen) = p(sen|neg)p(neg) / (p(sen|pos)p(pos) + p(sen|neg)p(neg))

rate = p(pos|sen) / p(neg|sen) = p(sen|pos)p(pos) / p(sen|neg)p(neg)
= (p(sen|pos) / p(sen|neg)) * (p(pos) / p(neg))

log(rate) = log(p(sen|pos) / p(sen|neg)) + lg(p(pos) / p(neg))
sen = sentence = {word_1, word_2, word_3, …, word_n} (sentence is a set)
log(rate) = sum(log(p(word_i|pos) / p(word_i|neg))) (i = 1, 2, …, n) +
lg(p(pos) / p(neg))
log(rate) = sum(log_word_rate[word_i]) (i = 1, 2, …, n) +
lg(p(pos) / p(neg))

再额外考虑对词汇抽词干,考虑否定词,考虑句式结构等等小优化。


优化

0.原始版本的原理优化

朴素贝叶斯有模型有多个变形模型。

一是高斯模型,或者考虑分布内核的支持向量机模型,但是这个任务中的得分不是严格意义上的连续量,向量特征也不是连续量,也不会符合多元正太分布,所以效果不好。

二是伯努利模型或者扩展的多项式伯努利模型,但是词汇量很大,这样以来某一个词汇出现0次的概率非常大,所以不合适。

三是混合的多项模型,把出现在一个句子内多次的单词看作多个独立单词。事实证明,对测试采用多项模型可以获得提升,但是训练时候不需要多项模型,直接把句子看作单词集合即可。

1.考虑否定词

先找到英语里常见的否定词集合,另外注意如果缩写isn’t被切词切为isn t,那么可以认为t也是一个否定词,不然,干脆认为n’t部分是一个否定词。

再否定词对句子的影响,可以认为否定词是把后面一个单词否定了,比如no good,之类的结构。

有两种方法处理后面被否定的单词,一种是某情感分析课程推荐的方法:直接把”good”变成另一个单词”!good”,训练测试时候都当作另一个独立单词处理。但是我觉得这种方法的缺点是没考虑到”!good”和”good”之间的联系。另一种方法是认为“good”和否定形式“!good”互补,即P(good|A)+P(!good|A) = 1且P(A|good)+P(A|!good) = 1,这种方法利用了”!good”和”good”之间的联系,但是在A与good无关时候会产生失误。测试发现,第一种推荐方法效果更好。所以采用第一种方法处理否定词。

2.考虑句式结构

英语中存在一些词语,这些词语之后的内容往往具有总结全段的作用(例如conclude,so,therefore之类的),或者说,这些词语以后的内容的内容才是段落真0正想表达的内容(例如however,but之类的)。所以测试时候碰到这些词汇,可以给后面内容更高权重,我采用了4:5左右权重。

3.文本预处理抽词干

我一开始觉得文本预处理抽一下词干效果会好很多,结果很让我失望效果反而下降了,我不知道预处理去掉标点符号和抽词干为什么会带来负面效果?可能是这里动词的形式和标点符号也含有信息,或者是我的预处理不科学。所以最后干脆没有做预处理。

4.修正评分过分不均匀问题

可能是因为假设加的太强了,所以稍微有pos,neg倾向的影评最后评分都会很接近1或10,所以修改概率到评分的函数,另评分相对均匀一些。


测试结果

测试结果表明,这些优化里面,0.原始版本的原理优化和1.考虑否定词的效果比较明显。文本预处理和抽词干基本没有效果。其他优化效果很小。最后的测试结果为:

Pearson: 0.75838
Correct: 0.86472

0 0
原创粉丝点击