如何做中文文本的情感分析?

这是本学期在大数据哲学与社会科学实验室做的第三次分享了。

第一次分享的是:如何利用“wordcloud+jieba”制作中文词云?

第二次分享的是:如何爬取知乎中问题的回答以及评论的数据?

本次给大家分享两种实现中文文本情感分析的方式,第一种是借助百度AI平台的文本情感分析,第二种是使用snownlp的文本情感分析。

1. 百度AI平台的文本情感分析

使用百度AI平台的文本情感分析主要分为两个步骤,第一步是创建一个账号,第二步是根据SDK调用平台提供的API函数进行情感分析。

第一步:创建账号

首先,我们打开百度AI网站,然后点击控制台。

http://ai.baidu.com/

跳转到登陆界面,输入账号密码后,跳转到管理界面,此时我们点击自然语言处理。进入到自然语言处理应用界面。

然后创建一个应用(如已创建好,就点击管理应用)。

创建好后,进入到应用列表中,记下来AppIDAPI KeySecret Key这三个参数的值。在后面对API进行调用的时候需要用到这三个参数。

第二步:进行文本情感分析

有关百度AI平台的自然语言处理的SDK(Software Development Kit)文档见如下网址:

http://ai.baidu.com/ai-doc/NLP/tk6z52b9z

这份SDK文档,包括了词法分析、词向量表示、词义相似度、短文本相似度、评论观点抽取、情感倾向分析、文章标签、文章分类、文本纠错、中文分词、词性标注、新闻摘要、地址识别等常用NLP功能。有关这些功能的使用,我们后面再来写图文进行详细介绍,下面只介绍情感分析功能。

首先,我们先安装要使用到的库。

pip install baidu-aip

安装好后,我们就可以调用API函数来对包含主观观点信息的文本进行情感极性类别(积极、消极、中性)的判断了,代码如下:

from aip import AipNlp""" 你的 APPID AK SK """
APP_ID = '你的APP_ID'
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
text = "王建红真帅"""" 调用情感倾向分析 """
dict = client.sentimentClassify(text)
print(dict)

sentimentClassify(text)函数:用于对文本的情感分析,参数text是进行分析的文本内容(GBK编码),最大2048字节。

它的返回示例:

{'log_id': 5284845474026755873,'text': '王建红真帅','items': [{'positive_prob': 0.999855,   #表示属于积极类别的概率'negative_prob': 0.000144523,  #表示属于消极类别的概率'confidence': 0.999679,   #表示分类的置信度'sentiment': 2     #表示情感极性分类结果}]
}

返回数据参数详情如下:

参数 类型 说明
text string 输入的文本内容
items array 输入的词列表
+sentiment number 表示情感极性分类结果, 0:负向,1:中性,2:正向
+confidence number 表示分类的置信度
+positive_prob number 表示属于积极类别的概率
+negative_prob number 表示属于消极类别的概率

【例子】测试一个有关中医的文本

text = u"因为中医自己都不认可自己,你就别为难外人了。中医们嘴上吹嘘自己有多厉害," \u"实际上,他们能当上中医,还得西医给他们体检合格了才能入职。中医理论不能指导中医入职体检," \u"中医术语不能用于中医入职体检报告,甚至中医死了,他的死亡证明也和中医理论与术语没什么关系。" \u"你看中医自己都不用,只能说明中医药是专供中医粉的。"dict = client.sentimentClassify(text)
print(dict['items'])
# [{'positive_prob': 1.76205e-05, 'confidence': 0.999961, 'negative_prob': 0.999982, 'sentiment': 0}]

我们可以发现这段关于中医的描述偏消极('sentiment': 0)。

2. 使用snownlp的文本情感分析

Python有一个第三方库snownlp,它是专门用来处理中文文本内容的库,有中文分词(s.words)、词性标注(s.tags)、情感分析(s.sentiments)、提取关键词(s.keywords())等功能。

首先,我们先安装要使用到的库(安装后可以直接用)。

pip install snownlp

安装好后,我们就可以调用函数来对包含主观观点信息的文本进行情感分析了,它会计算出文本语义接近积极的概率,越接近0情感表现越消极,越接近1情感表现越积极。代码如下:

from snownlp import SnowNLPtext = "王建红真帅"
s = SnowNLP(text)
print(text, s.sentiments)# 王建红真帅 0.868676346818001

【例子】测试一个有关中医的文本

from snownlp import SnowNLPtext = u"因为中医自己都不认可自己,你就别为难外人了。中医们嘴上吹嘘自己有多厉害," \u"实际上,他们能当上中医,还得西医给他们体检合格了才能入职。中医理论不能指导中医入职体检," \u"中医术语不能用于中医入职体检报告,甚至中医死了,他的死亡证明也和中医理论与术语没什么关系。" \u"你看中医自己都不用,只能说明中医药是专供中医粉的。"s = SnowNLP(text)for sentence in s.sentences:print(sentence, SnowNLP(sentence).sentiments)# 因为中医自己都不认可自己 0.816024132542549
# 你就别为难外人了 0.6792294609027675
# 中医们嘴上吹嘘自己有多厉害 0.32479885192764957
# 实际上 0.478723404255319
# 他们能当上中医 0.7191238537063072
# 还得西医给他们体检合格了才能入职 0.2899327459226514
# 中医理论不能指导中医入职体检 0.9719464371262481
# 中医术语不能用于中医入职体检报告 0.9964791023333988
# 甚至中医死了 0.5308849018309401
# 他的死亡证明也和中医理论与术语没什么关系 0.994350435104035
# 你看中医自己都不用 0.6714833680109371
# 只能说明中医药是专供中医粉的 0.9076878772503925print(s.sentiments)
# 0.9999999813523964from snownlp import sentimentsen = sentiment.classify(text)
print(sen)
# 0.9999999813523964

我们看到snownlp的情感分析结果与百度AI的情感分析结果相反。所以,在实际的项目中,需要根据实际的数据重新训练情感分析的模型。

首先,我们看一下snownlp的语料库:

C:\ProgramData\Anaconda3\Lib\site-packages\snownlp

sentiments目录下有5个文件,其中__init__.py是程序,neg.txtpos.txt分别是消极和积极语料库(也就是用来训练的数据集)sentiment.marshal.3sentiment.marshal是训练保存的模型。(python2保存的是sentiment.marshal;python3保存的是sentiment.marshal.3)。

其次,我们看一下__init__.py文件中的代码。

data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'sentiment.marshal')class Sentiment(object):def __init__(self):self.classifier = Bayes()  # 使用的是Bayes的模型def save(self, fname, iszip=True):self.classifier.save(fname, iszip)  # 保存最终的模型def load(self, fname=data_path, iszip=True):self.classifier.load(fname, iszip)  # 加载贝叶斯模型# 分词以及去停用词的操作    def handle(self, doc):words = seg.seg(doc)  # 分词words = normal.filter_stop(words)  # 去停用词return words  # 返回分词后的结果def train(self, neg_docs, pos_docs):data = []# 读入负样本for sent in neg_docs:data.append([self.handle(sent), 'neg'])# 读入正样本for sent in pos_docs:data.append([self.handle(sent), 'pos'])# 调用的是Bayes模型的训练方法self.classifier.train(data)def classify(self, sent):# 1、调用sentiment类中的handle方法# 2、调用Bayes类中的classify方法ret, prob = self.classifier.classify(self.handle(sent))  # 调用贝叶斯中的classify方法if ret == 'pos':return probreturn 1 - probclassSentiment(object):classifier = Sentiment()
classifier.load()def train(neg_file, pos_file):neg_docs = codecs.open(neg_file, 'r', 'utf-8').readlines()pos_docs = codecs.open(pos_file, 'r', 'utf-8').readlines()global classifierclassifier = Sentiment()classifier.train(neg_docs, pos_docs)def save(fname, iszip=True):classifier.save(fname, iszip)def load(fname, iszip=True):classifier.load(fname, iszip)def classify(sent):return classifier.classify(sent)

从上述的代码中,classify函数和train函数是两个核心的函数,其中,train函数用于训练一个情感分类器,classify函数用于预测。在这两个函数中,都同时使用到的handle函数,handle函数的主要工作为:对输入文本分词和去停用词。

了解snownlp的语料库以及训练的代码之后,就可以用自己的语料库进行训练了。训练的过程大致分为如下的几个步骤:

  • 准备正负样本,并分别保存,如正样本保存到pos.txt,负样本保存到neg.txt;
  • 利用snownlp训练新的模型;
  • 保存好新的模型;

重新训练情感分析的代码如下:

from snownlp import sentiment# 重新训练模型
sentiment.train('./neg.txt', './pos.txt')
# 保存好新训练的模型
sentiment.save('sentiment.marshal')

训练完成后,可以把sentiment.marshal复制到sentiments目录下替换原来的或者改变读取模型的路径。

# data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
#                         'sentiment.marshal')data_path = '这里填入新模型的路径'

经过以上操作,就可以利用新的模型来做情感分析了。

3. 总结

本文介绍了两种对文本进行情感分析的方式,大家可以根据自身喜好来进行选择。百度AI的自然语言处理和snownlp库,不止这一种功能,后面我会写一系列图文来介绍它们的使用方法。

如何做中文文本的情感分析?相关推荐

  1. 基于BERT做中文文本分类(情感分析)

    Bert: BERT是一种预训练语言表示的方法,这意味着我们在大型文本语料库(例如Wikipedia)上训练通用的"语言理解"模型,然后将该模型用于我们关心的下游NLP任务,BER ...

  2. 如何用Python和BERT做中文文本二元分类?| 程序员硬核评测

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 作者 | 王树义 来源 | 王树芝兰(ID:nkwangshuyi) 兴奋 去年, Google 的 B ...

  3. 逐步视频讲解--用Tensorflow进行中文自然语言处理--情感分析

    本教程为原创,转载请注明教学视频地址, 视频教程链接:https://www.bilibili.com/video/av30543613 书面教程和代码链接:https://github.com/ae ...

  4. NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音简繁转换→情感分析→测试)

    NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音&简繁转换→情感分析→测试) 目录 NLP分词 NLP词性标注 NLP情感分析-TEA NLP常 ...

  5. 使用BERT做中文文本相似度计算与文本分类

    转载请注明出处,原文地址: https://terrifyzhao.github.io/2018/11/29/使用BERT做中文文本相似度计算.html 简介 最近Google推出了NLP大杀器BER ...

  6. 基于深度学习的汽车行业评论文本的情感分析

    使用卷积神经网络对汽车行业评论文本进行情感分析. dateset 爬取汽车之家车主口碑评论文本,抽取口碑中最满意以及最不满意评论文本,分别作为正向情感语料库和负向情感语料库. 爬虫技术视频链接:htt ...

  7. 【Bert、T5、GPT】fine tune transformers 文本分类/情感分析

    [Bert.T5.GPT]fine tune transformers 文本分类/情感分析 0.前言 text classification emotions 数据集 data visualizati ...

  8. 金融文本信息情感分析(负面及主体判定)

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 给定一条金融文本和文本中出现的金融实体列表, 负面信息判定:判定该文本是否包含金融实体的负面信 ...

  9. 情感分析的新方法,使用word2vec对微博文本进行情感分析和分类

    向AI转型的程序员都关注了这个号??? 大数据挖掘DT数据分析  公众号: datadw 情感分析是一种常见的自然语言处理(NLP)方法的应用,特别是在以提取文本的情感内容为目标的分类方法中.通过这种 ...

最新文章

  1. 红外遥感设计报告论文+电路原理图
  2. 5分钟 搭建免费个人博客
  3. 一起来开发Android的天气软件(二)——使用LitePal搭建数据库
  4. FAX modem和传真协议简介
  5. 复习.net/c#时的小文章之万年草稿版 (全是基础概念,请懂的人绕行)
  6. 简单排序--选择排序
  7. 09-Flutter移动电商实战-移动商城数据请求实战
  8. 深入理解Redis分布式锁
  9. Linux段错误-转
  10. Centos7.x 装机优化
  11. 拓端tecdat|R语言ARIMA、GARCH 和 VAR模型估计、预测ts 和 xts格式时间序列
  12. 优秀的程序员是这样的
  13. C语言动态规划——背包问题详解
  14. linux--封装redhat镜像
  15. MDK/KEIL4/KEIL5 安装教程
  16. matlab改进遗传算法求解带时间窗的路径优化问题
  17. 如何关闭正在运行的端口
  18. 超级简单的Python爬虫教程,python爬虫菜鸟教程官网
  19. 没有技术含量,但能每天赚50刀的GGAD赚钱办法分享
  20. 【JavaScript实现十进制转换成二进制】

热门文章

  1. 代码版本控制工具Concurrent Versions System(CVS)的三种用配置库更新本地工作目录文件的方法
  2. 参加Java培训需要注意什么
  3. Python 程序如何高效地调试?
  4. 云南实现手机自主补(换)领居民身份证
  5. 了解C++默默编写并调用哪些函数
  6. swift集成alamofire的简单封装
  7. Python-常用字符串转换实例
  8. Exchange2003-2010迁移系列之四,配置第一台Exchange CAS/HUB服务器
  9. 被人恨,但感觉不错!
  10. VIRTUAL COMMUNITY INFORMATICS