1、导语

深度学习近些年取得突破性的发展,目前深度学习技术在人工智能领域应用最广泛的两方面就是CV(计算机视觉)和NLP(自然语言处理),在本次夏虹老师的《人工智能》课程上,我和我的小组成员选择将NLP作为我们的讨论主题,虽然我们的研究方向和NLP并不相关,但是想通过这次课的机会去了解人工智能的其他方面,并对其中的情感分析方向进行稍微深入一点的探究,撰写结课报告,对自己的收获进行记录,最后为此门课程画下完美的句号。

2、什么是NLP

上网查资料,首先要知道什么是NLP,简单来说即是计算机接受用户自然语言形式的输入。并在内部通过人类所定义的算法进行加工、计算等系列操作,以模拟人类对自然语言的理解,并返回用户所期望的结果。正如机械解放人类的双手一样,自然语言处理的目的在于用计算机代替人工来处理大规模的自然语言信息。它是人工智能、计算机科学、信息工程的交叉领域,涉及统计学、语言学等的知识。由于语言是人类思维的证明,故自然语言处理是人工智能的最高境界,被誉为“人工智能皇冠上的明珠”[1]。 人工智能中最难处理和解决的问题应该就是怎么处理好人的语言,尤其是像我们中国这些博大精深的汉语,让计算机处理起来可就更困难了。

可以说只要有文本的地方就会有自然语言处理,在社会科学领域,关系网络挖掘、社交媒体计算、人文计算等。在法律领域,中国裁判文书网上就有几千万公开的裁判文书,此外还有丰富的流程数据、文献数据、法律条文等,且文本相对规范,该领域已经有不少公司在做。在医疗健康领域,除了影像信息,还有大量的体检数据、临床数据、诊断报告等,同样也是NLP大展身手的地方。在教育领域,智能阅卷、机器阅读理解等都可以运用NLP技术。

3、什么是NLP中的情感分析

情感分析或观点挖掘是对人们对产品、服务、组织、个人、问题、事件、话题及其属性的观点、情感、情绪、评价和态度的计算研究。早在2000年,情感分析就成为NLP中最活跃的研究领域之一。它在数据挖掘、Web 挖掘、文本挖掘和信息检索方面得到了广泛的研究[2]。微博微信等社交网络的相继出现,使人们可以记录生活中的各种观点,人们情感相关的数据爆炸式增多,在数据量上来看给情感分析的研究做了铺垫。

情感分析可以怎么用呢?比如,酒店网站需要提取用户对酒店的评价,然后策略性的进行显示,比如把负面的评价排的稍微往后面一点,总不能上来满屏都是脏乱差吧!一些电商类的网站根据情感分析提取正负面的评价关键词,形成商品的标签。基于这些标签,用户可以快速知道大众对这个商品的看法比如。一些新闻类的网站,根据新闻的评论可以知道这个新闻的热点情况,是积极导向,还是消极导向,从而进行舆论新闻的有效控制。

4、情感分析的方法

情感分析的方法大概分为两部分:一种是基于情感词典的方法,通俗点讲就是我们把需要分析的语句进行处理将其变为一个个的词语,对照着一本“词典”(这本词典上有各种词语的情感属性、情感值等),我们对照着一个个匹配,将情感值迭代,得出情感得分进行判断,此方法实属有些“人工化”。另一种方法则是基于机器学习的方法,我们通过收集大量文本,利用SVM、贝叶斯等一系列机器学习算法获得分类器,对分类器进行训练,再把需要判断的数据输入到训练后的分类器中,输出相应分类概率,这种方式较为“智能化”。

4.1基于情感词典的文本情感分析

传统的基于情感词典的文本情感分类,是模拟我们人的大脑思维方式而产生的一种方法。我们大脑首先通过学习来记忆一些基本词汇,如否定词语有“不”,积极词语有“喜欢”、“爱”,消极词语有“讨厌”、“恨”等,从而在大脑中形成一个基本的语料库。然后,我们再对输入进大脑的句子进行最直接的拆分,看看我们所记忆的词汇表中是否存在相应的词语,然后根据这个词语的类别来判断情感,比如“我喜欢数学”,“喜欢”这个词在我们所记忆的积极词汇表中,所以我们判断它具有积极的情感。

图4-1 人脑对情感的分析示意图[3]

基于上述思路,我们可以通过以下几个步骤实现基于情感词典的文本情感分类:预处理、分词、训练情感词典、判断,整个过程可以如下图所示。

图4-2 基于情感词典的情感分析流程

基于情感词典的方法具有一定的局限性,不考虑词义,是对字面意思的直观理解和判断,特别对于“标题党”来讲,分析结果差距巨大。但这种情况都需要使用深度学习的方法才能有效解决,普通机器学习方法也是很难的。对于正负向文本的判断,该算法忽略了很多其他的否定词、程度副词和情感词搭配的情况,用于判断情感强弱也过于简单。

4.2基于机器学习的文本情感分析

大致的步骤我们举个例子来具体说明:

1、人工标注,给训练文本加类标签,这段文字属于什么感情我们先进行说明,比如这句话“手机非常好用!”,我给了它一个类标签“Positive”。

2、选择特征,里面有四个词(把感叹号也算上),“手机”,“非常”,“好用”,“!”。我可以认为这4个词都对分类产生了影响,都是分类的依据。也就是无论什么地方出现了这四个词的其中之一,文本都可以被分类为“积极”。这个是把所有词都作为分类特征。

3、特征降维,是要通过某个统计方法(词频、信息熵等方式)选择信息量丰富的特征。特征可以是词,可以是词组合。

4、把语料文本变成使用特征表示。比如上面那句话可以表示为这样的:[ {“手机”: True, “非常”: True, “好用”: True, “!”: True} , positive]

5、使用机器学习训练分类器。

图4-3 基于机器学习方法的分析流程

基于情感词典词典的方法效果较差,基于传统的机器学习算法虽然效果较好,但需要大量的人工特征,同时特征的好坏直接决定算法的效果。基于传统的机器学习方法的文本情感所使用的文本表示方法大多是词袋模型,词袋模型丢失了词的顺序信息,忽略了词的语义信息。所以深度学习成为了我的不二选择,对于一些“反讽”的词语有较好的识别率,不过深度学习最大的缺点是需要非常多样本防止过拟合。而且识别度极度依赖于语料,例如影评分类器拿去给书评用,注定是失败的。对于机器学习中的有监督学习来说,对训练数据做标注是一件非常困难的事情。

5、具体实现——基于情感词典的方法

我使用python具体实现基于情感词典的情感分析方法,使用的例句是“我十分的很开心”。

(1)四种情感词典的准备:BosonNLP情感词典(包含各类情感词)、停用词词典(一些用来去除句子中无关的词或符号)、程度副词词典(例如非常、很等词,此词典中具有程度副词及对应的程度值)、否定词词典。

图5-1 词典导入项目

(2)文本预处理,对语句进行分词并转化为字典。用jieba分词工具进行分词,

图5-2 分词相关代码

图5-3 分词结果

(3)对分词结果进行情感分类,找出其中的情感词、否定词和程度副词。

图5-4 对文本情感词分类相关代码

(4)文本情感得分的计算。其计算方式为:首先设置初始权重W为1,从第一个情感词开始,用权重W*该情感词的情感值作为得分(用score记录),然后判断与下一个情感词之间是否有程度副词及否定词,如果有否定词将W*-1,如果有程度副词,W*程度副词的程度值,此时的W作为遍历下一个情感词的权重值,循环直到遍历完所有的情感词,每次遍历过程中的得分score加起来的总和就是这篇文档的情感得分。

图5-5 情感得分计算相关代码

6、结课感言与总结

归根结底,这是因为我们大脑中的语言系统是相当复杂的。我们现在做的是文本情感分类,文本和文本情感都是人类文化的产物,换言之,人是唯一准确的判别标准。人的语言是一个相当复杂的文化产物,一个句子并不是词语的简单线性组合,它有相当复杂的非线性在里面。我们在描述一个句子时,都是将句子作为一个整体而不是词语的集合看待的,词语的不同组合、不同顺序、不同数目都能够带来不同的含义和情感,这导致了文本情感分类工作的困难。

事实上,我们在判断一个句子的情感时,我们不仅仅在想这个句子是什么情感,而且还会判断这个句子的类型(祈使句、疑问句还是陈述句);当我们在考虑句子中的每个词语时,我们不仅仅关注其中的积极词语、消极词语、否定词或者程度副词,我们会关注每一个词语(主语、谓语、宾语等等),从而形成对整个句子整体的认识;我们甚至还会联系上下文对句子进行判断。这些判断我们可能是无意识的,但我们大脑确实做了这个事情,以形成对句子的完整认识,才能对句子的感情做了准确的判断。也就是说,我们的大脑实际上是一个非常高速而复杂的处理器,我们要做情感分类,却同时还做了很多事情。[4]

总结两种方法后,无论是基于机器学习或是基于情感词典的方法,他们各有优缺点,因此我们就在想是否可以将两种方法结合起来,查了一下网上还真有。有一种基于词典和机器学习分类算法结合的文本情感分析方法,该方法结合基于词典的方法得出情感权值、情感均值、情感标准差三种情感特征和基于机器学习的方法得出的消极情感概率和积极情感概率两种倩感特征,综合得出其最强特征。另外比如说某些领域的文本没有标注,该领域的情感词典也不够完善,而人工标注需要耗费大量成本,数据的采集相对于人工成本小很多时;可以选取部分文本,利用基本情感词典的方法粗略地计算这些文本的情感得分值,选取分值偏高或偏低的文本作为已标注的训练文本 ,再结合机器学习的方法进行分析。

对于文中所进行的算法的实现,只是进行简单的功能实现,知道进行基于情感词典分析的方式大致的流程是怎么样的,对于复杂文本的处理并没有进行详细测试,所以并不知道效率的高低。总体来说肯定是基于机器学习的方式测试结果更具有准确性,在课后我还会对另外一种方法进行代码实现。感谢夏虹老师为我们带来一学期精彩的《人工智能》,激发了我们对人工智能新领域的不断发掘和无限探索的热情。

全部代码:

#-*-coding:utf-8-*-
from collections import defaultdict
import jieba
import codecs
#对文档进行分词并去除停用词
def seg_word(sentence):seg_list = jieba.cut(sentence);seg_result = [];for i in seg_list:seg_result.append(i)return seg_resultstop_word = set();#读取停用词文件fr = codecs.open('../NLP/stop.txt', 'r', 'utf-8')for word in fr:stop_word.add(word.strip())fr.close()# 去除停用词return list(filter(lambda x: x not in stop_word, seg_result))def classify_words(word_dict):#词语分类,找出情感词、否定词、程度副词# 读取情感字典文件sen_file = open('../NLP/BosonNLP_sentiment_score.txt', 'r+', encoding='utf-8')# 获取字典文件内容sen_list = sen_file.readlines()# 创建情感字典sen_dict = defaultdict()# 读取字典文件每一行内容,将其转换为字典对象,key为情感词,value为对应的分值for s in sen_list:# 每一行内容根据空格分割,索引0是情感词,索引01是情感分值sen_dict[s.split(' ')[0]] = s.split(' ')[1]# 读取否定词文件not_word_file = open('../NLP/not.txt', 'r+', encoding='utf-8')# 由于否定词只有词,没有分值,使用list即可not_word_list = not_word_file.readlines()# 读取程度副词文件degree_file = open('../NLP/degree.txt', 'r+', encoding='gbk')degree_list = degree_file.readlines()degree_dic = defaultdict()# 程度副词与情感词处理方式一样,转为程度副词字典对象,key为程度副词,value为对应的程度值for d in degree_list:degree_dic[d.split(' ')[0]] = d.split(' ')[1]# 分类结果,词语的index作为key,词语的分值作为value,否定词分值设为-1sen_word = dict()not_word = dict()degree_word = dict()# 分类for word in word_dict.keys():if word in sen_dict.keys() and word not in not_word_list and word not in degree_dic.keys():# 找出分词结果中在情感字典中的词sen_word[word_dict[word]] = sen_dict[word]elif word in not_word_list and word not in degree_dic.keys():# 分词结果中在否定词列表中的词not_word[word_dict[word]] = -1elif word in degree_dic.keys():# 分词结果中在程度副词中的词degree_word[word_dict[word]] = degree_dic[word]sen_file.close()degree_file.close()not_word_file.close()# 将分类结果返回return sen_word, not_word, degree_worddef list_to_dict(word_list):"""将分词后的列表转为字典,key为单词,value为单词在列表中的索引,索引相当于词语在文档中出现的位置"""data = {}for x in range(0, len(word_list)):data[word_list[x]] = xreturn datadef get_init_weight(sen_word, not_word, degree_word):# 权重初始化为1W = 1# 将情感字典的key转为listsen_word_index_list = list(sen_word.keys())if len(sen_word_index_list) == 0:return W# 获取第一个情感词的下标,遍历从0到此位置之间的所有词,找出程度词和否定词for i in range(0, sen_word_index_list[0]):if i in not_word.keys():W *= -1elif i in degree_word.keys():# 更新权重,如果有程度副词,分值乘以程度副词的程度分值W *= float(degree_word[i])return Wdef socre_sentiment(sen_word, not_word, degree_word, seg_result):"""计算得分"""# 权重初始化为1W = 1score = 0# 情感词下标初始化sentiment_index = -1# 情感词的位置下标集合sentiment_index_list = list(sen_word.keys())# 遍历分词结果(遍历分词结果是为了定位两个情感词之间的程度副词和否定词)for i in range(0, len(seg_result)):# 如果是情感词(根据下标是否在情感词分类结果中判断)if i in sen_word.keys():# 权重*情感词得分score += W * float(sen_word[i])# 情感词下标加1,获取下一个情感词的位置sentiment_index += 1if sentiment_index < len(sentiment_index_list) - 1:# 判断当前的情感词与下一个情感词之间是否有程度副词或否定词for j in range(sentiment_index_list[sentiment_index], sentiment_index_list[sentiment_index + 1]):# 更新权重,如果有否定词,取反if j in not_word.keys():W *= -1elif j in degree_word.keys():# 更新权重,如果有程度副词,分值乘以程度副词的程度分值W *= float(degree_word[j])# 定位到下一个情感词if sentiment_index < len(sentiment_index_list) - 1:i = sentiment_index_list[sentiment_index + 1]return score# 计算得分
def setiment_score(sententce):# 1.对文档分词seg_list = seg_word(sententce)# 2.将分词结果列表转为dic,然后找出情感词、否定词、程度副词sen_word, not_word, degree_word = classify_words(list_to_dict(seg_list))# 3.计算得分score = socre_sentiment(sen_word, not_word, degree_word, seg_list)return scoredef clearBlankLine():file1 = open('../NLP/degree.txt', 'r', encoding='gbk')  # 要去掉空行的文件file2 = open('../NLP/degree1.txt', 'w', encoding='gbk')  # 生成没有空行的文件try:for line in file1.readlines():if line == '\n':line = line.strip("\n")file2.write(line)finally:file1.close()file2.close()
if __name__ == '__main__':#clearBlankLine()sentence = '我十分的很开心'print(setiment_score(sentence))#seg_list = seg_word(sentence)#print(classify_words(list_to_dict(seg_list)))# print(seg_word(sentence))#print(setiment_score(sentence))

[1] 出自知乎百科 https://www.zhihu.com/topic/19560026/intro

[2] 微信公众号:机器之心 就喜欢看综述论文:情感分析中的深度学习

[3] 图片来源:https://kexue.fm/archives/3360

[4] 部分内容参考 https://kexue.fm/archives/3360

自然语言处理之文本情感分析相关推荐

  1. NLP之TEA:自然语言处理之文本情感分析的简介、算法、应用、实现流程方法、案例应用之详细攻略

    NLP之TEA:自然语言处理之文本情感分析的简介.算法.应用.实现流程.实现方法之详细攻略 目录 TEA的简介 TEA的应用 TEA的实现流程 TEA的实现方法 T1.词袋模型 TEA的案例应用 TE ...

  2. 自然语言处理(NLP)之使用LSTM进行文本情感分析

    情感分析简介 文本情感分析(Sentiment Analysis)是自然语言处理(NLP)方法中常见的应用,也是一个有趣的基本任务,尤其是以提炼文本情绪内容为目的的分类.它是对带有情感色彩的主观性文本 ...

  3. 自然语言处理—文本情感分析

    自然语言处理(NLP)中的文本情感分析是一个重要的应用领域,多用于评价性的用户信息回馈,如电影影评和购物后的评价.而情感分析主要是通过用户的回答文本数据(中文),进行文本情感量化分析,现有的情感分析方 ...

  4. 自然语言处理-文本情感分析

    本文为笔者学习阿里云大学的基于LSTM的文本情感分析教学视频总结. 一.何为文本情感分析 其实也就是,用户输入了一句话,我们需要靠机器来知道这句话的情感,本文会以开心和不开心为例,来进行情感分析,有点 ...

  5. 自然语言处理——对电影评论的文本情感分析

    题目(来自阿里云天池):数据主要包括IMDB网站上的电影评论文本数据. 数据分为训练数据和测试数据,分别保存在train.csv和test_noLabel.csv两个文件中. 字段说明如下: (1)I ...

  6. NLP 实战:手把手带你搞定文本情感分析

    随着移动互联网的普及,很多人已经习惯于在网络上表达意见和建议.比如电商网站上对商品的评价.社交媒体中对品牌.产品.政策的评价等等.这些评价中都蕴含着巨大的商业价值.而对这种评价的分析就是情感分析的主要 ...

  7. 深度解读NLP文本情感分析Pipeline

    随着移动互联网的普及,很多人已经习惯于在网络上表达意见和建议.比如电商网站上对商品的评价.社交媒体中对品牌.产品.政策的评价等等.这些评价中都蕴含着巨大的商业价值.而对这种评价的分析就是情感分析的主要 ...

  8. 让机器有温度:带你了解文本情感分析的两种模型

    摘要:本篇博文从模型和算法的视角,分别介绍了基于统计方法的情感分析模型和基于深度学习的情感分析模型. 文本情感分析(Sentiment Analysis)是指利用自然语言处理和文本挖掘技术,对带有情感 ...

  9. Python:snownlp中文文本情感分析

    hello,大家好,我是wangzirui32,今天来教大家如何使用snownlp的中文文本情感分析功能,开始学习吧! 1. pip 安装 命令: pip install snownlp -i htt ...

最新文章

  1. SCOM2016 安装OS或应用管理包
  2. 为ios 应用程序添加图标和添加名字
  3. 学生信息系统求助_Student Information Management -一个简单的学生信息管理系统(持续更新2)...
  4. bpython使用_使用Python实现一个简单的A/B测试
  5. Leetcode--102. 二叉树的层次遍历
  6. 2020年Java程序员应该学习的10大技术
  7. 超越MobileNet v3!华为诺亚、北大提出GhostNet​,使用线性变换生成特征图
  8. Pycharm远程调试:变量内容加载过慢或不能加载
  9. table 谷歌下不出现滚动条
  10. LRC软件测试自学,LRC滚动歌词制作编辑器
  11. 华为模拟器——eNSP安装教程
  12. Oracle锁表查询和解锁方法
  13. deepin 下安装xdroid
  14. 专业主义——大前研一
  15. 广东第二师范学院学计算机,广东第二师范学院计算机科学系党总支一行来我院调研交流...
  16. 秒杀活动(应对大并发:如何利用缓存+异步 )
  17. 4484: [Jsoi2015]最小表示 bitset+拓扑序
  18. 一款二维码签到app
  19. 极米Z6X Pro怎么样?极米Z6X Pro亮度如何?极米Z6X Pro值得入手吗?
  20. core data使用教程

热门文章

  1. iphone中背景图的设置方法
  2. 住建部:针对城镇居民及常住人口住房问题提两个新政策
  3. 电子协会 C语言 3级 50 、猴子吃桃
  4. 启功经典作品(多福)
  5. 练习-Java异常处理之常见异常类之输入类型异常
  6. 连接oracle数据库报错:ORA-12505
  7. python实现浏览器打开为手机浏览模式_python如何实现打开浏览器
  8. 2021年安全员-A证(江苏省)新版试题及安全员-A证(江苏省)作业模拟考试
  9. 泄密事件不断 如何保证信息安全?
  10. 解决idea创建项目没有src或不能新建包问题