nlp之文本情感分析 您所在的位置:网站首页 二维柱形图怎么加标题 nlp之文本情感分析

nlp之文本情感分析

2022-08-27 07:58| 来源: 网络整理| 查看: 265

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_result stop_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,否定词分值设为-1 sen_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]] = -1 elif 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_word def list_to_dict(word_list): """将分词后的列表转为字典,key为单词,value为单词在列表中的索引,索引相当于词语在文档中出现的位置""" data = {} for x in range(0, len(word_list)): data[word_list[x]] = x return data def get_init_weight(sen_word, not_word, degree_word): # 权重初始化为1 W = 1 # 将情感字典的key转为list sen_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 *= -1 elif i in degree_word.keys(): # 更新权重,如果有程度副词,分值乘以程度副词的程度分值 W *= float(degree_word[i]) return W def socre_sentiment(sen_word, not_word, degree_word, seg_result): """计算得分""" # 权重初始化为1 W = 1 score = 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 += 1 if 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 *= -1 elif 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 score def 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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有