基于情感词典(基于情感词典的文本情感分析代码)

45baike 2024-04-17 20次阅读

基于情感词典(基于情感词典的文本情感分析代码)

 

一、引言

目前中文文本情感分析主要分为三个类型,第一个是由情感词典和句法结构来做的、第二个是根据机器学习来做的(Bayes、SVM等)、第三个是用深度学习的方法来做的(例如LSTM、CNN、LSTM+CNN、BERT+CNN等)。

这三种方法中,第二种和第三种方法都需要人工标注大量的数据,然后做有监督的训练。只有第一种不需要人工标注,也不需要训练。

接下来,我们会介绍下第一种方法的算法逻辑,以及如何实践。

二、情感字典

除了分词词典和停用词词典外,一共还包含9个词典:

1、否定词:not.txt

2、正面情感词:positive.txt

3、负面情感词:negative.txt

4、程度副词:

  • most.txt
  • very.txt
  • more.txt
  • ish.txt
  • insufficiently.txt
  • over.txt
  • inverse.txt

词典链接:https://github.com/hellonlp/sentiment_analysis_dict/tree/master/dict

三、算法流程设计

  1. 算法逻辑

2. 代码演示

classSentimentAnalysis():"""SentimentAnalysis with some dictionarys"""defsentiment_score_list(self,dataset):seg_sentence=tool.sentence_split_regex(dataset)count1,count2=[],[]forsentence in seg_sentence:words=jieba.lcut(sentence, cut_all=False)i=0a=0forword in words:"""poscount积极词的第一次分值;poscount2积极反转后的分值;poscount3积极词的最后分值(包括叹号的分值)"""poscount,negcount,poscount2,negcount2,poscount3,negcount3=0,0,0,0,0,0ifword in hp.posdict :ifword in [好,真,实在] and words[min(i+1,len(words)-1)] in hp.pos_neg_dict  and words[min(i+1,len(words)-1)] != word:continueelse:poscount+=1c=0forw in words[a:i]:  扫描情感词前的程度词ifw in hp.mostdict:poscount*= 4elifw in hp.verydict:poscount*= 3elifw in hp.moredict:poscount*= 2elifw in hp.ishdict:poscount*= 0.5elifw in hp.insufficientlydict:poscount*= -0.3elifw in hp.overdict:poscount*= -0.5elifw in hp.inversedict:c+=1else:poscount*= 1iftool.is_odd(c) == odd:  扫描情感词前的否定词数poscount*= -1.0poscount2+= poscountposcount=0poscount3=poscount + poscount2 + poscount3poscount2=0else:poscount3=poscount + poscount2 + poscount3poscount=0a=i+1elifword in hp.negdict:  消极情感的分析,与上面一致ifword in [好,真,实在] and words[min(i+1,len(words)-1)] in hp.pos_neg_dict and words[min(i+1,len(words)-1)] != word:continueelse:negcount+= 1d=0forw in words[a:i]:ifw in hp.mostdict:negcount*= 4elifw in hp.verydict:negcount*= 3elifw in hp.moredict:negcount*= 2elifw in hp.ishdict:negcount*= 0.5elifw in hp.insufficientlydict:negcount*= -0.3elifw in hp.overdict:negcount*= -0.5elifw in hp.inversedict:d+= 1else:negcount*= 1iftool.is_odd(d) == odd:negcount*= -1.0negcount2+= negcountnegcount=0negcount3=negcount + negcount2 + negcount3negcount2=0else:negcount3=negcount + negcount2 + negcount3negcount=0a=i + 1i+= 1pos_count=poscount3neg_count=negcount3count1.append([pos_count,neg_count])ifwords[-1] in [!,!]: 扫描感叹号前的情感词,发现后权值*2count1=[[j*2 for j in c] for c in count1]forw_im in [但是,但]:ifw_im in words :  扫描但是后面的情感词,发现后权值*5ind=words.index(w_im)count1_head=count1[:ind]count1_tail=count1[ind:]count1_tail_new=[[j*5 for j in c] for c in count1_tail]count1=[]count1.extend(count1_head)count1.extend(count1_tail_new)breakifwords[-1] in [?,?]: 扫描是否有问好,发现后为负面count1=[[0,2]]count2.append(count1)count1=[]returncount2

四、举例分析

例子:我特别喜欢武汉这个城市!因为武汉有非常多好看的景点。但是,我不喜欢武汉的天气,因为武汉的天气有点差,热的时候让人感觉不爽。

1、 情感词分为 2 种, 一种是正面的,另外一种是负面的。

要分析一句话是正面的还是负面的,首先需要找出句子里面的情感词,然后再找出程度副词和否定词等。

正面的情感词比如:好,孝顺,高性能,一心一意等。 负面情感词比如:差,郁闷,小心眼,一毛不拔等。 出现一个积极词就+1,出现一个消极词就-1。 在这句话里面,有好看和喜欢两个正面情感词,差和不爽两个负面情感词。

cc是什么车?cc是什么牌子cc是一汽大众品牌旗下旗舰轿车车型。大众CC被誉为是最美大众车,将轿车的稳定性与跑车的灵敏度结合。目前在国内同时提供轿车和猎装车。

2、 情感词 喜欢、好看和‘差前面都有一个程度副词。极好就比较好和好的情感更强烈,太差也比有点差的情感强一些。 所以需要在找到情感词后往前找一下有没有程度副词,**在这里不同的程度副词有不同的权重**。 程度词我们分为 6 种,分别为:most,very,more,ish,insufficient 和 over 通过测试计算,给上面 6 种情感词的打分分别为 4,3,2,0.5,-0.3 和-0.5。

3、我特别喜欢武汉这个城市后面有感叹号,感叹号意味着情感强烈。因此发现感叹号可以为情 感值+2.

4、 否定词 在找到情感词的时候,需要往前找否定词。比如不,不能这些词。而且还要数这些否 定词出现的次数,如果是单数,情感分值就*-1,但如果是偶数,那情感就没有反转,还 是1。在这句话里面,可以看出喜欢前面只有一个不,所以喜欢的情感值应该反 转,-1。

5、 正面和负面需要分别独立计算,很明显就可以看出,这句话里面有褒有贬,不能用一个分值来表示它的情感倾向。而且这个权值的设置也会影响最终的情感分值,敏感度太高了。因此对这句话的最终的正确的处理,是得出这句话的一个正面分值,一个负面分值(这样消极分值也是正数, 无需使用负数了)。

6、 以分句的情感为基础,加权求和,从而得到一条评论的情感分值。

这条例子评论有五个分句, 因此其结构如下([正面分值, 负面分值]): 下面是对每个分句的打分: [正面分值, 负面分值]

① 我 特别 喜欢 武汉这个城市 ! [正面分值, 负面分值] : [3*1+2,0]

② 因为武汉有 非常 多 好看 的景点。 [正面分值, 负面分值] : [4*1,0]

③ 但是, [正面分值, 负面分值] : [0,0]

④ 我 不 喜欢 武汉的天气, [正面分值, 负面分值] : [-1*1,0]

⑤ 因为武汉的天气 有点 差, [正面分值, 负面分值] : [0,0.5*1]

⑥ 热的时候让人感觉 不爽。 [正面分值, 负面分值] : [0,1]

最后,这句话的得分为: [3*1+2,0] + [4*1,0] + [0,0] + [-1*1,0] + [0,0.5*1] + [0,1] = [8,1.5],即为: [正面分值, 负面分值] = [8,1.5]。

因为 8>1.5,所以整句话的情感判断为正面。

扑救时要先救人后救物,先重点后一般,先断电后救火,并注意顺风救灾,特别是野外火场。灭火时一般就地取材,如用水、砂、土等灭火器材,特别要设法控制火势蔓延。

五、总结

如果我们仅仅使用情感词典的方法,准确率就可以达到 73%左右。这种方法比较通用,不需要训练,对于不同类型的数据都可以进行情感分析。唯一的缺点就是准确率不是非常高。

六、Github代码链接:

https://github.com/hellonlp/sentiment_analysis_dict

一只投胎猪的心路历程:一只猪死后到阴间判官处报到,判官说道:去吧,下世还做猪。说完就要在生死簿上落下判官笔,没想到这只猪却大声嚷道:不公平啊!不公平啊!判官很是惊讶,说道:怎么不公平呢?你说说看。 猪道:判官大人,世界太不公平了,我们猪得不到人们 的喜欢,最可恨的...


标签: 情感  基于  词典 


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。