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

论文在这里下载:基于情感词典的中文微博情感倾向性研究

(大家可以上知网自行下载)

本文采用的方法如下:

首先对单条微博进行文本预处理,并以标点符号为分割标志,将单条微博分割为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

python情感词典计算得分_基于情感词典的情感打分相关推荐

  1. python情感词典计算得分_用python进行金融市场文本数据的情感计算!

    之前我依据一篇论文中的中文金融情感词典CFSD(chinese financial sentiment dictionary), 中文金融领域情感词典构建 ,整理成csv文件的情感词典.现在我们找点财 ...

  2. python计算坡度_基于python实现利用DEM数据计算坡度、坡向

    1.Python的地形三维可视化--简介Matplotlib和gdal https://blog.csdn.net/allenlu2008/article/details/51880333 2.Pyc ...

  3. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  4. 编写python程序、计算账户余额_小明有20w存款存在余额宝中,按余额宝年收益为3.35%计算,用Python编写程序计算,多少年后小明的存款达到30w?...

    [判断题]卤素灯泡是在灯泡内充入氟.氯等卤素气体. [单选题]我国刑法第12条关于溯及力的规定采取的是( ). [填空题]本地局域网 LAN 内, () 和无绳电话速率较低,主流带宽是 100kbps ...

  5. 有道词典java下载手机版下载手机版_有道词典app下载_有道词典在线翻译下载安装手机版v9.08...

    有道词典app是网易开发设计的一款手机免费翻译软件,专为用户打造的移动翻译词典运用.网易有道词典APP是一款提供多种语系翻译,大量语汇任你查,汇聚wiki百科.百度百科内容,包揽2000万百科词条,更 ...

  6. python文本聚类 词云图_文本挖掘:避孕药主题情感分析

    关于舆情分析的实例分析,希望给你带来一些帮助. 前言 距离上次文本挖掘小文章时间已经过了3个月了,北京已经入冬,有人说北京的冬天很冷,但是吃上火锅很暖:也有人说北京的冬天雾霾严重,太干.这两句表达的是 ...

  7. python输出一首诗_基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器,具体内容如下 之前在手机百度上看到有个"为你写诗"功能,能够随机生成古诗,当时感觉很酷炫= = 在学习了深度学习后,了解了一下原理,打算自己 ...

  8. python实现数据可视化软件_基于Python实现交互式数据可视化的工具

    作者:Alark Joshi 翻译:陈雨琳 校对:吴金笛 本文2200字,建议阅读8分钟. 本文将介绍实现数据可视化的软件包. 这学期(2018学年春季学期)我教授了一门关于数据可视化的数据科学硕士课 ...

  9. python 按需加载_基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)...

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 文档转换为PDF有些图片无法完全显示,请移步我的博客查看 完成 ...

最新文章

  1. 恕我直言,HttpClient 你不一定会用
  2. 二十三、死锁的处理策略---避免死锁(银行家算法)
  3. ASimpleCache 轻量级缓存
  4. linux下yum安装最新稳定版nginx
  5. 让MySQL支持Emoji表情 mysql 5.6
  6. COM原理及应用之COM特性
  7. 使用 cmd、PowerShell 等用命令行的方式创建文件及文件夹
  8. 通俗易懂的讲解一下Java的代理模式
  9. [Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结
  10. 由中行IBM大型机宕机谈银行系统运维
  11. python 百度ocr安装_Python调用百度OCR实现图片文字识别的示例代码
  12. linux 如何查看fb中分辨率_西门子S71200,如何在FB块中使用操作定时器?
  13. HTTP缓存ETAG和Last-Modified
  14. 中国无线耳机行业市场供需与战略研究报告
  15. 2023年厦门大学材料与化工考研考情与难度、参考书及上岸前辈初复试备考经验
  16. 应用计算机测pn结正向电压,PN结正向压降与温度关系的研究实验报告
  17. 笔记本独显无输出_双显卡笔记本独显消失怎么回事|笔记本双显卡独显没了怎么解决|笔记本双显卡切换独显方法...
  18. ElasticSearch(待改)
  19. 一个适合初学者的Ant教程
  20. linux没有桌面安装svn,Linux下安装SVN简单教程

热门文章

  1. 高压缩比 压缩软件 linux,Linux 下最为人熟知的归档/压缩工具
  2. vs 之bug集(不断更新中)
  3. HTTP协议及其POST与GET操作差异 C#中如何使用POST、GET等
  4. php网页正文提取,通用网页正文抓取工具_任意网页正文提取API
  5. junit linux命令行运行,如何从命令行在JUnit中运行测试用例?
  6. Java 并发编程之同步工具类闭锁 CountDownLatch
  7. pandas Dataframe表格转Markdown格式
  8. Python PCA降维小例子
  9. scrapy中使用css选择器罗列下一级的所有标签
  10. 无人驾驶服务器适合部署在哪个位置,手机位置服务器在哪里设置的