传统的情感分析大多是针对句子级的,即某条评论或某句话为积极或消极的概率。而往往一句话中包含着多个描述点,即方面级的述评,这时用一个模糊的概率或数字去评价整段文字或整句话势必是不准确和不公允的。如“我的男朋友性格很好,很专一,但有一些社恐”、“酒店很不错,视野一绝,早餐很棒,但就有一些贵”等。基于此,需要对文本内容进行细粒度的情感分析,以达到更好的分析效果。
目前,能够实现细粒度情感分析的途径大致有以下几种:
(1)SenticNet库
(2)情感词典
(3)实体命名识别+深度学习
第一种方式比较方便简单,但毕竟是现成的库,无法普适于每一个研究场景,所以推荐。第二种方式因为是基于词语来进行数学运算,因此能够精确地识别到自己想要的方面级情感(需要自己设好情感分类,可以通过既有的经典模型,或分类聚类算法实现),但缺点是词典的设置耗费人工较大,程度词的权重以及计算公式的设置有一定的主观性(当然可以在同一计算标准下通过标准化来缓解)。第三种方式即通过灌入大量数据进行识别和训练,不用多说,第三种方式是目前最火也是学术界很提倡的一种,但对计算机编程以及算法的要求更高。
notes:这里需要注意的是:各种方式都存在优缺点,尽管是基于深度学习的情感分析也不能说是最好,而只能说是最火。情感分析是目的,至于我们用何种途径去实现并没有优劣之分,在学术界和企业实践中对这些方法并没有一锤定音的结论,比如在很多大型企业做顾客需求分析以及课题组的某个项目中都是具有自己的情感词典的,和我们不同的是,他们是一个团队,精细化效果背后的繁琐被分摊到了团队中的每一个人,而论文和平时课程作业只有自己...
2 基于词典的细粒度情感分析 2.1 前期准备在进行情感分析前需要做一些准备,具体包括数据的采集、清洗;情感词的分类、程度词和否定词的寻找以及权重的设置,进而构建词典;计算公式的设置。
2.2 数据展示与词典设置为了方便,我这里采用就用一句话来作为样本吧:
“我的男朋友非常好,很专一,我喜欢极了,没有不良嗜好,但有一些社恐”
黑色加粗的部分就是情感词,红色部分是前向程度词,蓝色部分是后向程度词,绿色部分是否定词。
sen_word_dict={'好':1,'专一':1,'喜欢':1,'不良嗜好':-1,'社恐':-1}
before_degree_word_dict={'非常':2,'很':1.5,'一些':0.8}
after_degree_word_dict={'极了':2}
not_word_dict={'没有':2}
2.3 计算规则与代码思路
计算规则即总得分=正向情感词*程度词+负向情感词*程度词
代码比较繁琐但比较简单,基本上就是for 循环+if语句可以实现,需要完整代码的可以在评论下方留下邮箱~重要的是厘清计算和遍历逻辑。
这里需要说明的是,一般情况,前向程度词可能会和否定词组合,如“非常不好”、“没那么好”等,即需要对情感词前方两个词进行检验。而对于后向情感词来说不太可能两者进行组合,一般只有程度词,如“好极了、棒极了”,即在后向程度词检验时只需要延申一个索引。
此外,因为是基于词语的计算,因此分词结果特别重要,比如“不好”、“非常不好”没有被切分开,则在情感词中基本词是不带程度词的,这样就会导致得分为0。因此需要进行处理:
针对单字的程度词:jieba.suggest_freq(('很','好'), True)
针对非单字的程度词:利用自定义词典:jieba.load_userdict("外部词典.txt")将词频设置的高一些,让其被作为独立单元被分割出来。
2.4 计算得分最后男友得分=2*1+1.5*1+1*2+(-1)*(-1)+(0.8)*(-1)=5.7分
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)