importjiebaimportnumpy as np#打开词典文件,返回列表

def open_dict(Dict='hahah',path = r'/Users/zhangzhenghai/Downloads/Textming/'):

path= path + '%s.txt' %Dict

dictionary= open(path, 'r', encoding='utf-8')

dict=[]for word indictionary:

word= word.strip('\n')

dict.append(word)returndictdefjudgeodd(num):if num % 2 ==0:return 'even'

else:return 'odd'deny_word= open_dict(Dict='否定词')

posdict= open_dict(Dict='positive')

negdict= open_dict(Dict = 'negative')

degree_word= open_dict(Dict = '程度级别词语',path=r'/Users/zhangzhenghai/Downloads/Textming/')

mostdict= degree_word[degree_word.index('extreme')+1: degree_word.index('very')] #权重4,即在情感前乘以3

verydict = degree_word[degree_word.index('very')+1: degree_word.index('more')] #权重3

moredict = degree_word[degree_word.index('more')+1: degree_word.index('ish')]#权重2

ishdict = degree_word[degree_word.index('ish')+1: degree_word.index('last')]#权重0.5

defsentiment_score_list(dataset):

seg_sentence= dataset.split('。')

count1=[]

count2=[]for sen in seg_sentence: #循环遍历每一个评论

segtmp = jieba.lcut(sen, cut_all=False) #把句子进行分词,以列表的形式返回

i = 0 #记录扫描到的词的位置

a = 0 #记录情感词的位置

poscount = 0 #积极词的第一次分值

poscount2 = 0 #积极反转后的分值

poscount3 = 0 #积极词的最后分值(包括叹号的分值)

negcount =0

negcount2=0

negcount3=0for word insegtmp:if word in posdict: #判断词语是否是情感词

poscount +=1c=0for w in segtmp[a:i]: #扫描情感词前的程度词

if w inmostdict:

poscount*= 4.0

elif w inverydict:

poscount*= 3.0

elif w inmoredict:

poscount*= 2.0

elif w inishdict:

poscount*= 0.5

elif w in deny_word: c+= 1

if judgeodd(c) == 'odd': #扫描情感词前的否定词数

poscount *= -1.0poscount2+=poscount

poscount=0

poscount3= poscount + poscount2 +poscount3

poscount2=0else:

poscount3= poscount + poscount2 +poscount3

poscount=0

a= i+1

elif word in negdict: #消极情感的分析,与上面一致

negcount += 1d=0for w insegtmp[a:i]:if w inmostdict:

negcount*= 4.0

elif w inverydict:

negcount*= 3.0

elif w inmoredict:

negcount*= 2.0

elif w inishdict:

negcount*= 0.5

elif w indegree_word:

d+= 1

if judgeodd(d) == 'odd':

negcount*= -1.0negcount2+=negcount

negcount=0

negcount3= negcount + negcount2 +negcount3

negcount2=0else:

negcount3= negcount + negcount2 +negcount3

negcount=0

a= i + 1

elif word == '!' or word == '!': #判断句子是否有感叹号

for w2 in segtmp[::-1]: #扫描感叹号前的情感词,发现后权值+2,然后退出循环

if w2 in posdict ornegdict:

poscount3+= 2negcount3+= 2

breaki+= 1

#以下是防止出现负数的情况

pos_count =0

neg_count=0if poscount3 <0 and negcount3 >0:

neg_count+= negcount3 -poscount3

pos_count=0elif negcount3 <0 and poscount3 >0:

pos_count= poscount3 -negcount3

neg_count=0elif poscount3 <0 and negcount3 <0:

neg_count= -pos_count

pos_count= -neg_countelse:

pos_count=poscount3

neg_count=negcount3

count1.append([pos_count,neg_count])

count2.append(count1)

count1=[]returncount2defsentiment_score(senti_score_list):

score=[]for review insenti_score_list:

score_array=np.array(review)

Pos=np.sum(score_array[:,0])

Neg= np.sum(score_array[:,1])

AvgPos=np.mean(score_array[:,0])

AvgPos= float('%.lf' %AvgPos)

AvgNeg= np.mean(score_array[:, 1])

AvgNeg= float('%.1f' %AvgNeg)

StdPos=np.std(score_array[:, 0])

StdPos= float('%.1f' %StdPos)

StdNeg= np.std(score_array[:, 1])

StdNeg= float('%.1f' %StdNeg)

score.append([Pos,Neg,AvgPos,AvgNeg,StdPos,StdNeg])returnscore

data= '用了几天又来评价的,手机一点也不卡,玩荣耀的什么的不是问题,充电快,电池够大,玩游戏可以玩几个小时,待机应该可以两三天吧,很赞'data2= '不知道怎么讲,真心不怎么喜欢,通话时声音小,新手机来电话竟然卡住了接不了,原本打算退,刚刚手机摔了,又退不了,感觉不会再爱,像素不知道是我不懂还是怎么滴 感觉还没z11mini好,哎要我怎么评价 要我如何喜欢努比亚 太失望了'

print(sentiment_score(sentiment_score_list(data)))print(sentiment_score(sentiment_score_list(data2)))

情感分析简介:

情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪。

原理

比如这么一句话:“这手机的画面极好,操作也比较流畅。不过拍照真的太烂了!系统也不好。”

① 情感词

要分析一句话是积极的还是消极的,最简单最基础的方法就是找出句子里面的情感词,积极的情感词比如:赞,好,顺手,华丽等,消极情感词比如:差,烂,坏,坑爹等。出现一个积极词就+1,出现一个消极词就-1。

里面就有“好”,“流畅”两个积极情感词,“烂”一个消极情感词。那它的情感分值就是1+1-1+1=2. 很明显这个分值是不合理的,下面一步步修改它。

② 程度词

“好”,“流畅”和‘烂“前面都有一个程度修饰词。”极好“就比”较好“或者”好“的情感更强,”太烂“也比”有点烂“情感强得多。所以需要在找到情感词后往前找一下有没有程度修饰,并给不同的程度一个权值。比如”极“,”无比“,”太“就要把情感分值*4,”较“,”还算“就情感分值*2,”只算“,”仅仅“这些就*0.5了。那么这句话的情感分值就是:4*1+1*2-1*4+1=3

③ 感叹号

可以发现太烂了后面有感叹号,叹号意味着情感强烈。因此发现叹号可以为情感值+2. 那么这句话的情感分值就变成了:4*1+1*2-1*4-2+1 = 1

④ 否定词

明眼人一眼就看出最后面那个”好“并不是表示”好“,因为前面还有一个”不“字。所以在找到情感词的时候,需要往前找否定词。比如”不“,”不能“这些词。而且还要数这些否定词出现的次数,如果是单数,情感分值就*-1,但如果是偶数,那情感就没有反转,还是*1。在这句话里面,可以看出”好“前面只有一个”不“,所以”好“的情感值应该反转,*-1。

因此这句话的准确情感分值是:4*1+1*2-1*4-2+1*-1 = -1

⑤ 积极和消极分开来

再接下来,很明显就可以看出,这句话里面有褒有贬,不能用一个分值来表示它的情感倾向。而且这个权值的设置也会影响最终的情感分值,敏感度太高了。因此对这句话的最终的正确的处理,是得出这句话的一个积极分值,一个消极分值(这样消极分值也是正数,无需使用负数了)。它们同时代表了这句话的情感倾向。所以这句评论应该是”积极分值:6,消极分值:7“

⑥ 以分句的情感为基础

再仔细一步,详细一点,一条评论的情感分值是由不同的分句加起来的,因此要得到一条评论的情感分值,就要先计算出评论中每个句子的情感分值。这条例子评论有四个分句,因此其结构如下([积极分值, 消极分值]):[[4, 0], [2, 0], [0, 6], [0, 1]]

以上就是使用情感词典来进行情感分析的主要流程了,算法的设计也会按照这个思路来实现。

算法设计

第一步:读取评论数据,对评论进行分句。

第二步:查找对分句的情感词,记录积极还是消极,以及位置。

第三步:往情感词前查找程度词,找到就停止搜寻。为程度词设权值,乘以情感值。

第四步:往情感词前查找否定词,找完全部否定词,若数量为奇数,乘以-1,若为偶数,乘以1。

第五步:判断分句结尾是否有感叹号,有叹号则往前寻找情感词,有则相应的情感值+2。

第六步:计算完一条评论所有分句的情感值,用数组(list)记录起来。

第七步:计算并记录所有评论的情感值。

第八步:通过分句计算每条评论的积极情感均值,消极情感均值,积极情感方差,消极情感方差。

存粹转发,留着以后自己用,后经试验部分代码健壮性差点(评论文字稍长,程序报错),需要的时候再加固。

python实现文本情感分析_【转】用python实现简单的文本情感分析相关推荐

  1. python能做财务分析吗_您可以使用Python进行财务规划和分析吗?

    python能做财务分析吗 问题 (The Problem) If you work in the Financial Planning and Analysis area, chances are ...

  2. opencv python3 文本区域识别_使用等高线从图像中提取文本区域 - Opencv,Python

    我一直在使用python中的opencv开发名片的OCR项目 . 直到现在,我已经能够裁剪图像卡 . 我试图使用轮廓检测裁剪图像中的文本区域 . (即,拍摄Canny图像,从这些边缘找到轮廓并将它们扩 ...

  3. python彩票结果分析_即将放弃Python 2.7的不止有Numpy,还有pandas和这些工具

    原标题:即将放弃Python 2.7的不止有Numpy,还有pandas和这些工具 机器之心报道 参与:黄小天.路雪.李泽南 最近,Numpy 团队的一份声明引发了数据科学社区的关注:这一科学计算库即 ...

  4. python彩票结果分析_天啦噜!Python多线程居然是骗人的?

    Python解释执行原理 我是一个Python线程,我的工作就是解释执行程序员编写的Python代码. 之所以说是解释执行,是因为Python是高级语言,CPU那家伙不认识Python代码,需要运行的 ...

  5. python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)

    Python 是一门伟大的入门语言.作为一门伟大的编程语言,一定要具备一些特征,其中有五项特征是非常重要的: 非常棒的首次体验:就像书的开始,首先一定要能够"沉迷",学习新知识一定 ...

  6. python语言中运算符号_详细介绍Python语言中的按位运算符

    <从问题到程序:用Python学编程和计算>--2.11 补充材料 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者:裘宗燕 ...

  7. python语法详解大全_笔记:Python 语法要点汇总

    Python 是一门解释型语言,无需编译和链接 Python 解释器 交互模式 脚本模式 源码编码 默认情况下,Python 源文件是 UTF-8 编码 指定源文件的字符编码 # -*- coding ...

  8. python都有什么包_常用的Python包有哪些,如何快速掌握Python编程

    Python入门简单.功能强大,是很多想要入行IT开发行业人士的主要选择.Python包可以帮助Web开发人员快速和容易地创建应用程序和功能,因此很多企业在招聘时都会考察求职者对于Python包的掌握 ...

  9. 用python绘制好看的图形_怎么用Python画出好看的词云图?

    相信很多人在第一眼看到下面这些图时,都会被其牛逼的视觉效应所吸引,这篇文章就教大家怎么用Python画出这种图. 前期准备 上面的这种图叫做词云图,主要用途是将文本数据中出现频率较高的关键词以可视化的 ...

  10. python write 写多行_如何用 Python 执行单行命令

    一般来说,面对日常处理的一些小任务,直接用 sed,grep 之类的就可以搞定,更复杂一点的就会考虑 awk 或者用一些现成的轮子,要是 awk 搞不定我就只好用 Python 了.但有些时候,我仅仅 ...

最新文章

  1. CentOS中Mysql常用操作
  2. 3D Point Cloud Library install
  3. 软件需求管理用例方法二
  4. 反弹端口 HTTP代理 HTTP隧道技术
  5. Windows自动关闭程序
  6. VMWare共享文件
  7. Flutter 核心原理与混合开发模式
  8. centos 卸载ffmpeg_Linux下ffmpeg的完整安装
  9. 英语口语海报演讲--东软
  10. 基于java的数据结构学习——数组实现的栈以及简单应用
  11. POSIX互斥锁api函数
  12. Spring源码入门——DefaultBeanNameGenerator解析
  13. Python调用API接口的几种方式
  14. Promise--优雅的异步回调解决方案
  15. 多模态中预训练的演变史
  16. c++ opencv mat_【CV实战】OpenCV—Hello world代码示例
  17. java丑数算法_Java代码如何实现求第N个丑数?实现和思路分享
  18. pkm是什么意思_2017年的你应该拥有什么样的PKM系统?
  19. 菜鸟的Java基础知识学习
  20. 华硕服务器怎么装win7系统教程,华硕win7系统重装教程

热门文章

  1. 汇编中的名字(标号和变量)
  2. 2019年考研总结与新一年的展望
  3. Atitit 教育与培训学校 的计划策划 v4 qc18
  4. 数据通信--ASCII码通信16进制通信的区别
  5. 58. 缓冲区溢出篇——缓冲区溢出原理简介
  6. [Unity3D]Unity3D游戏开发之自动寻路与Mecanim动画系统的结合
  7. java静态内部类单例模式
  8. 用终端来给屏幕下个雪❄️吧!
  9. 2019.09.21 多校联合训练(提高组)
  10. Python游戏编程入门第二课