Python文本情感分析_Python数据分析实战

Python文本情感分析_Python数据分析实战本文由来为了赚足学分丰富假期生活,初衷是分析老师对学生作业的评价和学生对老师的评价的。本来这个任务是在N多天前就应该完成了,无奈本人懒癌晚期+拖延症不想治疗,不是因为火烧眉毛就绝对没有今天的文章。本文旨在记录自己的学习过程,就这样,开干啦!序幕既然题目是“基于情感词典的文本情感分析”,那么情感词典就是必不可少的了。对于情感词典的要求:要包含积极的词语和消极的词语、每一种类的数量要足够多、包含足够广…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文由来

为了赚足学分丰富假期生活,初衷是分析老师对学生作业的评价和学生对老师的评价的。本来这个任务是在N多天前就应该完成了,无奈本人懒癌晚期+拖延症不想治疗,不是因为火烧眉毛就绝对没有今天的文章。本文旨在记录自己的学习过程,就这样,开干啦!

序幕

既然题目是“基于情感词典的文本情感分析”,那么情感词典就是必不可少的了。对于情感词典的要求:要包含积极的词语和消极的词语、每一种类的数量要足够多、包含足够广的范围。由此,拥有一个好的词典是非常有必要的。然后才是如何进行情感分析。

强大的snowNLP

其实就在今天,我发现了snowNLP这个Python的三方库,它可以方便的处理中文文本的内容,它有以下功能:

中文分词

词性标注

情感分析

文本分类

文本转拼音

繁体转简体

提取文本关键词

提取文本摘要

分割成句子

文本相似

很强大的有没有,膜拜作者大神。纵观这么多的功能真是让人眼花缭乱,其实这个题目只需要情感分析这一个功能就够了,情感分析的功能是:你给它一个句子,它给你一个positive值。比如你向它传递“你今天真的好美”,它会返回你“0.9838430726152845”,这个值就代表了“你今天真的好美”这句话有多么的positive,即这句话有多么的积极、正向,这就很符合题目的要求好不好。

安装snowNLP

强烈推荐这种方式!!!其实就本题目而言个人认为不安装snowNLP库会更方便一点,只要将下载的压缩包( 提取码:c6qz )解压后复制到pycharm的项目文件夹下就可以了,也可以点击这里下载我的程序文件(提取码:xeng),下载完解压后后使用pycharm打开emotion_analysis文件夹就可以了。

除了上面的方法,也可以正经安装。到目前为止snowNLP的最新版本是0.12.3,可以在终端下使用 pip install snownlp==0.12.3 来安装,如果是使用anaconda管理Python包的话可以使用conda install –channel https://conda.anaconda.org/roccqqck snownlp安装,因为网络的问题我安装了好几次都没有成功,conda install snownlp的方式也不好使,可以换一种方式安装,首先到官网手动下载snowNLP的压缩包,.zip或.tar.gz格式的,不想去官网下载的话可以点击百度云链接,提取码:pl3e ,解压,我解压到了桌面,之后打开Anaconda Prompt,cd到解压之后的文件夹内,如图,

QQ截图20200229184347.png

依次输入python setup.py build和python setup.py install,等待完成即可。

测试snowNLP

就在我满心欢喜的认为这次终于轻松加愉快地完成了任务的时候,positive当即给了我一jio,我测试了几组常见的语句,发现函数返回的positive值和现实差了八万十千里,在一阵慌乱中查阅了资料,发现原本的库训练的数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,心想之前的大费周章不是全白费了嘛。接着我又阅读了关于情感分析部分的源码,发现了解决的办法。

解决办法

话不多说,直接上代码:

classSentiment(object):

def__init__(self):

self.classifier = Bayes()

defsave(self, fname, iszip=True):

self.classifier.save(fname, iszip)

defload(self, fname=data_path, iszip=True):

self.classifier.load(fname, iszip)

defhandle(self, doc):

words = seg.seg(doc)

words = normal.filter_stop(words)

returnwords

deftrain(self, neg_docs, pos_docs):

data = []

forsent inneg_docs:

data.append([self.handle(sent), ‘neg’])

forsent inpos_docs:

data.append([self.handle(sent), ‘pos’])

self.classifier.train(data)

defclassify(self, sent):

ret, prob = self.classifier.classify(self.handle(sent))

ifret == ‘pos’:

returnprob

return1 – prob

classifier = Sentiment()

classifier.load()

deftrain(neg_file, pos_file):

neg_docs = codecs.open(neg_file, ‘r’, ‘utf-8’).readlines()

pos_docs = codecs.open(pos_file, ‘r’, ‘utf-8’).readlines()

globalclassifier

classifier = Sentiment()

classifier.train(neg_docs, pos_docs)

defsave(fname, iszip=True):

classifier.save(fname, iszip)

defload(fname, iszip=True):

classifier.load(fname, iszip)

defclassify(sent):

returnclassifier.classify(sent)

我在源码中关于情感分析的部分看到了train函数,并且函数的参数也简单明了。通过源码可以看到,snowNLP的sentiment模块是支持训练的,只需要将表示消极意义的文本和表示积极意思的文本当做参数传入到train函数中,然后再利用save函数保存训练好的文件即可,虽然我不知道源码的意思,但依据函数的命名和sentiment文件夹下文件的命名,我大胆地试了一下,果然可以训练文件。

成果

说了这么多没用的就是为了凑篇幅,下面来点重要的。

from snownlp import sentiment

sentiment.train(‘ntusd-negative.txt’, ‘ntusd-positive.txt’)

sentiment.save(‘sentiment.marshal’)

上面的是训练函数, ‘ntusd-negative.txt’,与’ntusd-positive.txt’分别是消极的与积极的词典文件名字,sentiment.train(‘ntusd-negative.txt’, ‘ntusd-positive.txt’)调用了sentiment模块下的train函数,用于训练情感词典,sentiment.save(‘sentiment.marshal’) 用于保存训练好的文件,保存的文件名字叫“ sentiment.marshal .3”,是一个.marshal.3文件,虽说上面写的是“ sentiment.marshal ”,但因为是Python3的缘故,会自动在文件后面加上“.3”,用以区分Python3之前版本产生的文件,但在程序中使用该文件时不需要添加“.3”,程序会自动在文件后面加上“.3”,别问我是怎么知道的

3.png

训练完后就要让程序引用我们训练的文件,上代码:

# data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),# ‘sentiment.marshal’)data_path = (“E:/emotion_analysis/sentiment.marshal”)

在sentiment文件夹内有一个__init__.py文件,修改其中data_path的值,将之前的代码注释掉,将data_path改为绝对路径,即 sentiment.marshal 所在的位置,比如我的 sentiment.marshal放在“E:/emotion_analysis/sentiment.marshal”,就把data_path改为“ E:/emotion_analysis/sentiment.marshal ”。

上面的都完成后,就要测试了,不说话了,上代码

fromsnownlp importSnowNLP

s = SnowNLP(“你今天真的好美”)

print(s.sentiments)

下面的是结果

image.png

关于情感词典

本文用到的情感词典是融合了N多位大牛整理出的词典,包括清华大学——李军中文褒贬义词典、台湾大学NTUSD、知网Hownet等等。请点击此处( 提取码:0fz8 )下载本文用到的情感词典,可也点击此处 (提取码:xeng) 下载我的完整程序。

写在最后

虽然这篇博客看起来很low,事实上也真的很low,不过看在这是我的第一篇博客的份上就凑合着看吧,关于snowNLP的源码到现在我也没有看懂,在这里立一个flag,三天之内看懂源码!

最后的最后

关于文本情感分析还有一种方法,就是给每一个词语赋予一个权值,越积极权值越大,越消极权值越小。处理文本时先分词,去掉一些不重要的词,对剩余的词语进行处理,不过这种方法我不会,具体可以参考这篇博客的上半部分。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172423.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 中石化项目都是些什么工程_中海油石化工程待遇

    中石化项目都是些什么工程_中海油石化工程待遇石化项目是什么?石化项目是什么工程?下面就让中策大数据为你解答。石油化工工程就是涵盖整个石油化工系统的工程。石化项目工程内容可以划分为以下几种:1、石油化工总的区分包括化工工程、石油工程、油气工程、储运工程等;2、按照行业划分包括石油开采工程、石油加工工程、化工化纤工程、石油化工后加工工程等;3、按照建设装置的工程区分,包括常减压装置工程、催化裂化装置工程、气体分馏装置工程、加氢裂化装置工程、加氢精制装置工程、脱硫制硫装置工程、重整装置工程、芳烃装置工程、乙烯工程、等等。4、按照

    2022年10月16日
    0
  • Linux Bash漏洞修复

    Linux Bash漏洞修复特别提醒:Linux官方已经给出最新解决方案,已经解决被绕过的bug,建议您尽快重新完成漏洞修补。openSUSE镜像已经给出修复方案了。【已确认被成功利用的软件及系统】所有安装GNUbash版本小于或者等于4.3的Linux操作系统。【漏洞描述】该漏洞源于你调用的bashshell之前创建的特殊的环境变量,这些变量可以包含代码,同时会被bash执行。【漏洞检测方法】漏洞检测命令:env-iX='(){(a)=>\’bash…

    2025年7月23日
    0
  • oracle创建用户、密码、分配权限、基本权限的作用「建议收藏」

    oracle创建用户、密码、分配权限、基本权限的作用「建议收藏」创建用户和密码:createuserusernameidentifiedbypassword;//建用户名和密码例子:oracle,oracle分配权限:grantconnect,resource,dbatousername;//授权例子:grantconnect,resource,dba,sysdbatousername;创建同义词:创建同义词…

    2022年5月12日
    34
  • 【实战】javaweb学生信息管理系统[通俗易懂]

    javaweb学生信息管理系统总的来说整个项目通过Maven来管理jar包,实现了学生信息管理系统的登录,增删改查等基本操作,然后不喜写css样式,页面有点丑,但是代码中的逻辑基本正确。项目下载链接csdn下载链接github地址一、项目架构二、数据库的设计操作1.user表2.student表三、登录界面(动态生成验证码、提示账号or密码or验证码输入有误)四、登录的主界面五…

    2022年4月15日
    89
  • Unity Cinemachine插件全功能详解

    Unity Cinemachine插件全功能详解实现电影级别的分镜,推拉式镜头等,需要2017以上的版本才能使用,配合TimeLine一起使用,和Animator一起.虚拟摄像机不支持AlignwithView【有BUG】还是手动拖比较好1:实现简单的相机跟随效果使用TimeLine实现,由于这次不同于“Unity动画系统案例1”那样需要对人物进行控制。这个项目只是单纯的做CG效果。所以不需要指定动画状态机【但必须挂在Animator…

    2022年6月8日
    56
  • 密立根实验的java数据处理

    密立根实验的java数据处理importjavax.swing.JOptionPane;importjava.text.DecimalFormat;publicclassurl{ publicstaticvoidmain(String[]args) {  StringnumStr,tstr1,tstr2,tstr3,tstr4,tstr5,result;  intU,again

    2022年5月11日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号