原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动)。

论文在这里下载:基于情感词典的中文微博情感倾向性研究 
(大家可以上知网自行下载)

本文采用的方法如下: 
 
首先对单条微博进行文本预处理,并以标点符号为分割标志,将单条微博分割为n个句子,提取每个句子中的情感词 。以下两步的处理均以分句为处理单位。

第二步在情感词表中寻找情感词,以每个情感词为基准,向前依次寻找程度副词、否定词,并作相应分值计算。随后对分句中每个情感词的得分作求和运算。

第三步判断该句是否为感叹句,是否为反问句,以及是否存在表情符号。如果是,则分句在原有分值的基础上加上或减去对应的权值。

最后对该条微博的所有分句的分值进行累加,获得该条微博的最终得分。

代码如下:

首先文件结构图如下: 

其中,degree_dict为程度词典,其中每个文件为不同的权值。 
emotion_dict为情感词典,包括了积极情感词和消极情感词以及停用词。

文件一:文本预处理 textprocess.py 
在里面封装了一些文本预处理的函数,方便调用。

# -*- coding: utf-8 -*-
__author__ = 'Bai Chenjia'import jieba
import jieba.posseg as pseg print "加载用户词典..." import sys reload(sys) sys.setdefaultencoding("utf-8") jieba.load_userdict('C://Python27/Lib/site-packages/jieba/user_dict/pos_dict.txt') jieba.load_userdict('C://Python27/Lib/site-packages/jieba/user_dict/neg_dict.txt') # 分词,返回List def segmentation(sentence): seg_list = jieba.cut(sentence) seg_result = [] for w in seg_list: seg_result.append(w) #print seg_result[:] return seg_result # 分词,词性标注,词和词性构成一个元组 def postagger(sentence): pos_data = pseg.cut(sentence) pos_list = [] for w in pos_data: pos_list.append((w.word, w.flag)) #print pos_list[:] return pos_list # 句子切分 def cut_sentence(words): words = words.decode('utf8') start = 0 i = 0 token = 'meaningless' sents = [] punt_list = ',.!?;~,。!?;~… '.decode('utf8') #print "punc_list", punt_list for word in words: #print "word", word if word not in punt_list: # 如果不是标点符号 #print "word1", word i += 1 token = list(words[start:i+2]).pop() #print "token:", token elif word in punt_list and token in punt_list: # 处理省略号 #print "word2", word i += 1 token = list(words[start:i+2]).pop() #print "token:", token else: #print "word3", word sents.append(words[start:i+1]) # 断句 start = i + 1 i += 1 if start < len(words): # 处理最后的部分 sents.append(words[start:]) return sents def read_lines(filename): fp = open(filename, 'r') lines = [] for line in fp.readlines(): line = line.strip() line = line.decode("utf-8") lines.append(line) fp.close() return lines # 去除停用词 def del_stopwords(seg_sent): stopwords = read_lines("f://Sentiment_dict/emotion_dict/stop_words.txt") # 读取停用词表 new_sent = [] # 去除停用词后的句子 for word in seg_sent: if word in stopwords: continue else: new_sent.append(word) return new_sent # 获取六种权值的词,根据要求返回list,这个函数是为了配合Django的views下的函数使用 def read_quanzhi(request): result_dict = [] if request == "one": result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/most.txt") elif request == "two": result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/very.txt") elif request == "three": result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/more.txt") elif request == "four": result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/ish.txt") elif request == "five": result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/insufficiently.txt") elif request == "six": result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/inverse.txt") else: pass return result_dict if __name__ == '__main__': test_sentence1 = "这款手机大小合适。" test_sentence2 = "这款手机大小合适,配置也还可以,很好用,只是屏幕有点小。。。总之,戴妃+是一款值得购买的智能手机。" test_sentence3 = "这手机的画面挺好,操作也比较流畅。不过拍照真的太烂了!系统也不好。" """ seg_result = segmentation(test_sentence3) # 分词,输入一个句子,返回一个list for w in seg_result: print w, print '\n' """ """ new_seg_result = del_stopwords(seg_result) # 去除停用词 for w in new_seg_result: print w, """ #postagger(test_sentence1) # 分词,词性标注,词和词性构成一个元组 #cut_sentence(test_sentence2) # 句子切分 #lines = read_lines("f://Sentiment_dict/emotion_dict/posdict.txt") #print lines[:]

文件二:情感打分 dict_main.py 
其中待处理数据放在chinese_weibo.txt中,读者可以自行更改文件目录,该文件中的数据格式如下图: 

即用每一行代表一条语句,我们对每条语句进行情感分析,进行打分

# -*- coding: utf-8 -*-
__author__ = 'Bai Chenjia'import text_process as tp
import numpy as np # 1.读取情感词典和待处理文件 # 情感词典 print "reading..." posdict = tp.read_lines("f://emotion/mysite/Sentiment_dict/emotion_dict/pos_all_dict.txt") negdict = tp.read_lines("f://emotion/mysite/Sentiment_dict/emotion_dict/neg_all_dict.txt") # 程度副词词典 mostdict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/most.txt') # 权值为2 verydict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/very.txt') # 权值为1.5 moredict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/more.txt') # 权值为1.25 ishdict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/ish.txt') # 权值为0.5 insufficientdict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/insufficiently.txt') # 权值为0.25 inversedict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/inverse.txt') # 权值为-1 # 情感级别 emotion_level1 = "悲伤。在这个级别的人过的是八辈子都懊丧和消沉的生活。这种生活充满了对过去的懊悔、自责和悲恸。在悲伤中的人,看这个世界都是灰黑色的。" emotion_level2 = "愤怒。如果有人能跳出冷漠和内疚的怪圈,并摆脱恐惧的控制,他就开始有欲望了,而欲望则带来挫折感,接着引发愤怒。愤怒常常表现为怨恨和复仇心里,它是易变且危险的。愤怒来自未能满足的欲望,来自比之更低的能量级。挫败感来自于放大了欲望的重要性。愤怒很容易就导致憎恨,这会逐渐侵蚀一个人的心灵。" emotion_level3 = "淡定。到达这个能级的能量都变得很活跃了。淡定的能级则是灵活和无分别性的看待现实中的问题。到来这个能级,意味着对结果的超然,一个人不会再经验挫败和恐惧。这是一个有安全感的能级。到来这个能级的人们,都是很容易与之相处的,而且让人感到温馨可靠,这样的人总是镇定从容。他们不会去强迫别人做什么。" emotion_level4 = "平和。他感觉到所有的一切都生机勃勃并光芒四射,虽然在其他人眼里这个世界还是老样子,但是在这人眼里世界却是一个。所以头脑保持长久的沉默,不再分析判断。观察者和被观察者成为同一个人,观照者消融在观照中,成为观照本身。" emotion_level5 = "喜悦。当爱变得越来越无限的时候,它开始发展成为内在的喜悦。这是在每一个当下,从内在而非外在升起的喜悦。这个能级的人的特点是,他们具有巨大的耐性,以及对一再显现的困境具有持久的乐观态度,以及慈悲。同时发生着。在他们开来是稀松平常的作为,却会被平常人当成是奇迹来看待。" # 情感波动级别 emotion_level6 = "情感波动很小,个人情感是不易改变的、经得起考验的。能够理性的看待周围的人和事。" emotion_level7 = "情感波动较大,周围的喜悦或者悲伤都能轻易的感染他,他对周围的事物有敏感的认知。" # 2.程度副词处理,根据程度副词的种类不同乘以不同的权值 def match(word, sentiment_value): if word in mostdict: sentiment_value *= 2.0 elif word in verydict: sentiment_value *= 1.75 elif word in moredict: sentiment_value *= 1.5 elif word in ishdict: sentiment_value *= 1.2 elif word in insufficientdict: sentiment_value *= 0.5 elif word in inversedict: #print "inversedict", word sentiment_value *= -1 return sentiment_value # 3.情感得分的最后处理,防止出现负数 # Example: [5, -2] → [7, 0]; [-4, 8] → [0, 12] def transform_to_positive_num(poscount, negcount): pos_count = 0 neg_count = 0 if poscount < 0 and negcount >= 0: neg_count += negcount - poscount pos_count = 0 elif negcount < 0 and poscount >= 0: pos_count = poscount - negcount neg_count = 0 elif poscount < 0 and negcount < 0: neg_count = -poscount pos_count = -negcount else: pos_count = poscount neg_count = negcount return (pos_count, neg_count) # 求单条微博语句的情感倾向总得分 def single_review_sentiment_score(weibo_sent): single_review_senti_score = [] cuted_review = tp.cut_sentence(weibo_sent) # 句子切分,单独对每个句子进行分析 for sent in cuted_review: seg_sent = tp.segmentation(sent) # 分词 seg_sent = tp.del_stopwords(seg_sent)[:] #for w in seg_sent: # print w, i = 0 # 记录扫描到的词的位置 s = 0 # 记录情感词的位置 poscount = 0 # 记录该分句中的积极情感得分 negcount = 0 # 记录该分句中的消极情感得分 for word in seg_sent: # 逐词分析 #print word if word in posdict: # 如果是积极情感词 #print "posword:", word poscount += 1 # 积极得分+1 for w in seg_sent[s:i]: poscount = match(w, poscount) #print "poscount:", poscount s = i + 1 # 记录情感词的位置变化 elif word in negdict: # 如果是消极情感词 #print "negword:", word negcount += 1 for w in seg_sent[s:i]: negcount = match(w, negcount) #print "negcount:", negcount s = i + 1 # 如果是感叹号,表示已经到本句句尾 elif word == "!".decode("utf-8") or word == "!".decode('utf-8'): for w2 in seg_sent[::-1]: # 倒序扫描感叹号前的情感词,发现后权值+2,然后退出循环 if w2 in posdict: poscount += 2 break elif w2 in negdict: negcount += 2 break i += 1 #print "poscount,negcount", poscount, negcount single_review_senti_score.append(transform_to_positive_num(poscount, negcount)) # 对得分做最后处理 pos_result, neg_result = 0, 0 # 分别记录积极情感总得分和消极情感总得分 for res1, res2 in single_review_senti_score: # 每个分句循环累加 pos_result += res1 neg_result += res2 #print pos_result, neg_result result = pos_result - neg_result # 该条微博情感的最终得分 result = round(result, 1) return result """ # 测试 weibo_sent = "这手机的画面挺好,操作也比较流畅。不过拍照真的太烂了!系统也不好。" score = single_review_sentiment_score(weibo_sent) print score """ # 分析test_data.txt 中的所有微博,返回一个列表,列表中元素为(分值,微博)元组 def run_score(): fp_test = open('f://emotion/mysite/Weibo_crawler/chinese_weibo.txt', 'r') # 待处理数据 contents = [] for content in fp_test.readlines(): content = content.strip() content = content.decode("utf-8") contents.append(content) fp_test.close() results = [] for content in contents: score = single_review_sentiment_score(content) # 对每条微博调用函数求得打分 results.append((score, content)) # 形成(分数,微博)元组 return results # 将(分值,句子)元组按行写入结果文件test_result.txt中 def write_results(results): fp_result = open('test_result.txt', 'w') for result in results: fp_result.write(str(result[0])) fp_result.write(' ') fp_result.write(result[1]) fp_result.write('\n') fp_result.close() # 求取测试文件中的正负极性的微博比,正负极性分值的平均值比,正负分数分别的方差 def handel_result(results): # 正极性微博数量,负极性微博数量,中性微博数量,正负极性比值 pos_number, neg_number, mid_number, number_ratio = 0, 0, 0, 0 # 正极性平均得分,负极性平均得分, 比值 pos_mean, neg_mean, mean_ratio = 0, 0, 0 # 正极性得分方差,负极性得分方差 pos_variance, neg_variance, var_ratio = 0, 0, 0 pos_list, neg_list, middle_list, total_list = [], [], [], [] for result in results: total_list.append(result[0]) if result[0] > 0: pos_list.append(result[0]) # 正极性分值列表 elif result[0] < 0: neg_list.append(result[0]) # 负极性分值列表 else: middle_list.append(result[0]) #################################各种极性微博数量统计 pos_number = len(pos_list) neg_number = len(neg_list) mid_number = len(middle_list) total_number = pos_number + neg_number + mid_number number_ratio = pos_number/neg_number pos_number_ratio = round(float(pos_number)/float(total_number), 2) neg_number_ratio = round(float(neg_number)/float(total_number), 2) mid_number_ratio = round(float(mid_number)/float(total_number), 2) text_pos_number = "积极微博条数为 " + str(pos_number) + " 条,占全部微博比例的 %" + str(pos_number_ratio*100) text_neg_number = "消极微博条数为 " + str(neg_number) + " 条,占全部微博比例的 %" + str(neg_number_ratio*100) text_mid_number = "中性情感微博条数为 " + str(mid_number) + " 条,占全部微博比例的 %" + str(mid_number_ratio*100) ##################################正负极性平均得分统计 pos_array = np.array(pos_list) neg_array = np.array(neg_list) # 使用numpy导入,便于计算 total_array = np.array(total_list) pos_mean = pos_array.mean() neg_mean = neg_array.mean() total_mean = total_array.mean() # 求单个列表的平均值 mean_ratio = pos_mean/neg_mean if pos_mean <= 6: # 赋予不同的情感等级 text_pos_mean = emotion_level4 else: text_pos_mean = emotion_level5 if neg_mean >= -6: text_neg_mean = emotion_level2 else: text_neg_mean = emotion_level1 

基于情感词典的情感打分相关推荐

  1. 基于情感词典的情感分析

    思路以及代码都来源于下面两篇文章: 一个不知死活的胖子:Python做文本情感分析之情感极性分析 Ran Fengzheng 的博客:基于情感词典的文本情感极性分析相关代码 基于情感词典的情感分析应该 ...

  2. python情感词典计算得分_基于情感词典的情感打分

    原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动). 论文在这里下载:基于情感词典的中文微博情感倾向性研究 (大家可以上 ...

  3. [Python人工智能] 二十二.基于大连理工情感词典的情感分析和情绪计算

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章分享了CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比.这篇 ...

  4. 基于NRC词典的情感分析(含多种离散情绪)——python

    NRC词典简介: NRC词典由加拿大国家研究委员会(简称NRC)的专家创建,目前已有多种语言版本,我们可以用其中文版本来进行情感分析.使用一系列单词来帮助识别情绪,情感,并分析标签,表情符号和单词颜色 ...

  5. python 基于情感词典的情感分析之乐,惧,惊,哀,恶,怒和未知七种情感分析

    背景 情感分析是通过计算技术对文本内容的主观客观性.情绪等挖掘分析,对文本的情感偏向做出判断.目的是识别出文本中的具体情感分类,之前做文本分类都是通过深度学习或者机器学习进行文本分类,但是需要进行数据 ...

  6. 基于情感词典的情感值分析

    #utils.py import reclass ToolGeneral():"""Tool function"""def is_odd(s ...

  7. 情感极性分析:基于情感词典、k-NN、Bayes、最大熵、SVM的情感极性分析

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 1.预处理 (1).特征提取 对应文件:feature_extraction.py 最后结果: ...

  8. 基于情感词典的python情感分析!它居然比我还懂我女友!

    近期老师给我们安排了一个大作业,要求根据情感词典对微博语料进行情感分析.于是在网上狂找资料,看相关书籍,终于搞出了这个任务.现在做做笔记,总结一下本次的任务,同时也给遇到有同样需求的人,提供一点帮助. ...

  9. 基于python的情感分析案例-基于情感词典的python情感分析

    Python Python开发 Python语言 基于情感词典的python情感分析 近期老师给我们安排了一个大作业,要求根据情感词典对微博语料进行情感分析.于是在网上狂找资料,看相关书籍,终于搞出了 ...

最新文章

  1. 计算机技术员好学吗,电脑技术员,沦落到如此地步...
  2. 生成高斯热力图(craft中有使用)+2d heatmap+3d heatmap
  3. 查看计算机用户修改密码时间,使用ldap语句查询某时间后没改密码的用户
  4. Detectron2 win10踩坑记录
  5. SPA单页应用的优缺点
  6. 创建表 备注 修改表结构 修改约束
  7. 计算机开机b00t设置,电脑boot启动项设置
  8. vs2005无法附加进程
  9. 拿来就能用的前端酷炫登录注册模板
  10. CAXA2016破解版
  11. java实现科学计算器
  12. mysql自定义函数的分号_Mysql自定义函数
  13. 了解Maven的<relativePath/>标签
  14. 计算机硬盘分区安全,Win10如何安全的给移动硬盘分区?win10给移动硬盘分区的方法...
  15. python six模块升级方法
  16. 【初探篇】申请阿里云免费SSL证书并配置https访问实战
  17. 一位研究生导师的肺腑之言
  18. 【泛函分析】平衡集和吸收集
  19. 一台服务器部署多个版本的MySQL,不会冲突吗?如何管理?
  20. 高防服务器如何防止网站攻击,高防服务器怎么防御攻击的?

热门文章

  1. 面向初学者的 20 大人工智能项目创意
  2. 微信大转盘 【案例源码】提供
  3. ubuntu 禁用笔记本触摸板
  4. java获取本周第一天的日期
  5. 错误:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insec
  6. Docker 容器技术,让你不再为环境而烦恼
  7. nodeMCU_esp8266管脚示意图/特殊管脚的使用避坑(D3/D4/D8/..)
  8. 算法入门 | 二叉树的递归遍历、递归创建系列(递归)
  9. 设备功耗计算专题《测试仪器使用篇,EFM32GG-STK3700使用教程》
  10. wlan测试仪软件,MT8860C WLAN 测试仪