情感分类在数据挖掘领域应该是一个比较细分而且难做的部分,之前在研究生阶段了解了一点,印象中有研究把twitter的情感可以分为21类,情感分析在观点预测、市场营销都有一定的用处,刚好项目中有需要区分用户情感的部分,就花了点时间实现了一个比较简单的demo,效果不是很好,大概65%左右的准确率,需要进一步细化。
词库构建
词库的构建可以说是情感分类的重要而且比较有效的环节,一方便可以基于现有的情感词库进行扩展,另一方面,可以利用标注的语料来获取情感词库信息,现有的收集语料的方法一般是利用微博或者评论等信息来提取,因为这类信息一般含有表情,能一定程度的代表信息的情感倾向,然后利用这个倾向来根据互信息计算得到词语的情感极性。考虑到收集语料比较耗时,我主要采用了基于词库和PMI的方法来进行补充和完善,收集词库的信息主要包含以下步骤:
1. 首先对词库进行了细分,主要分为积极、消极情感词库,积极、消极评价词库,经过语义扩展的积极、消极情感词库,语气词库,PMI计算得到的词语倾向性得分词库。
2. 首先搜集了网上的情感词库,经过去重和整理之后,利用hownet和哈工大的同义词库对情感词库进行扩展。
3. 收集了大概50W的评论数据,在前面收集的情感词库的基础上计算每个词的PMI分数。
4. 给不同的词库赋予不同的权重。
算法设计
1. 对输入的句子进行分词,利用NGram, 生成unigram,bigram,trigram特征词组成的新的待分类的语句,这样初始输入是一个句子,输出就是3个词语链表对应不同的nGram.
2. 对生成的NGram句子进行分类,计算情感得分:
a). 对每一个词语,先判断是不是情感词,如果是情感词,对应分类得分加上这个词的权重,如果不是再看看是不是评价词,如果不是再看看是不是语义扩展的词,如果再不是再判断是不是语气词,如果是语气词的话向下寻找连着的情感词,将权重向乘得到对应分类得分,如果是中性词,查看pmi的得分信息;最后将所有分类的得分。
b). 将三种NGram的得分进行平均得到最终的得分。
算法部分可以见Classifier中的judgeNGramList方法,项目主要把情感分为三类,积极、消极和中性。采用NGram的方法其实是为了避免分词不准确带来的干扰,从结果看,其实ubigram,bigram比较有效,trigram的得分基本上都是0,说明分词之后大多数的trigram是无效的。
有待改进的方面
从最终跑出来的结果来看,首先句子的分类效果受分词和词库的影响很大,存在以下两种情况:有时候分词不准确,词语在词库的词性就完全相反了;情感词库中没有相关的情感词,比如cnm,"草泥马"(不太恰当哈,语料中碰到的)等,这个特别是在专业领域中更加常见。其次,需要加上否定词和特殊语气符号等信息,否定词的出现会是句子的情感倾向出现反转,特殊的语气符号也是会影响到句子的倾向的,比如“这篇文章真好,就是错别字太多,不好意思往下看!”。如果有能力收集覆盖面比较广的情感词库,效果提升还是很明显的,也可以采用其它的分类方法比如NaiveBayes等方法来试试。
代码放到git上了,我就自己测试了一遍,肯定会有不少问题,欢迎一起交流。情感分类代码