热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转:利用深度学习方法进行情感分析以及在海航舆情云平台的实践

http:geek.csdn.netnewsdetail139152本文主要为大家介绍深度学习算法在自然语言处理任务中的应用——包括算法的原理是什么,相比于其他算法它具有什么优势,以及如何

http://geek.csdn.net/news/detail/139152

本文主要为大家介绍深度学习算法在自然语言处理任务中的应用——包括算法的原理是什么,相比于其他算法它具有什么优势,以及如何使用深度学习算法进行情感分析。

原理解析

在讲算法之前,我们需要先剖析一下我们要完成的任务,我们希望算法能够最大程度模拟大脑对于人类语言的处理逻辑,对文本进行褒义、贬义、中性的判断。在大多应用场景下,只分为两类。比说如,对于“喜爱”和“厌恶”这两个词,就属于不同的情感倾向。有一点需要特别注意,这里面所说的褒义、贬义并不是绝对的,分类的类别是根据我们的目标自由定义的,并且严格以人的判断为基准,比如我们可以把句子分类为陈述句、疑问句、祈使句和感叹句。

我们的第一个模型——基于情感词典的情感分类模型。

 

图片描述

 

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

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

 

图片描述

 

1.文本的预处理

由网络爬虫爬取到的原始语料,通常都会带有我们不需要的信息,比如额外的Html标签,所以需要对语料进行预处理。这里的预处理工作主要是为了提取完整的句子,去掉一些多余的标记符号。处理之后我们需要对原始语料进行情感标注,我们可以用-1标记消极情感评论,1标记积极情感评论。

2.分词

为了判断句子中是否存在情感词典中相应的词语,我们需要把句子准确切割为一个个词语,即分词。现有可选择的分词工具有很多,我们可以研读各分词工具的测试报告,根据自己的需求选择合适的分词工具。

3.构建情感词典

情感词典可分为四个部分:积极情感词典、消极情感词典、否定词典以及程度副词词典。为了得到更加完整的情感词典,我们可以收集多个情感词典,对它们进行整合去重,同时需要对部分词语进行调整,以达到尽可能高的准确率。

此外,我们需要根据需求加入某些行业词汇,以增加分类中的命中率。不同行业某些词语的词频会有比较大的差别,而这些词有可能是情感分类的关键词之一。比如手机行业,“耐摔”和“防水”就是在这个领域有积极情绪的词。因此,有必要将这些因素考虑进模型之中。

4.分类

为了简单起见,我们将每个积极情感词语赋予权重1,将每个消极情感词语赋予权重-1,并且假设情感值满足线性叠加原理;我们已经将句子进行分词,如果分词后的词语向量包含相应的词语,就加上其对应的权值,其中,否定词和程度副词会有特殊的判别规则,否定词会导致权值取反,而程度副词则让权值加倍。最后,根据总权值的正负性来判断句子的情感。基本的规则如图所示。

 

图片描述

 

最后我们需要对模型的效果进行检验。通过在我们爬取的微博语料上进行测试,基于情感词典的模型准确率只有76%,这个结果有点差强人意。

那么,为什么这个模型的效果不那么好?这是由于这个任务本身的复杂性所致的。

文本情感分类的困难在于:

  • 语言系统是相当复杂的

人的语言是一个相当复杂的文化产物,一个句子并不是词语的简单线性组合,它有相当复杂的非线性在里面。我们在描述一个句子时,都是将句子作为一个整体而不是词语的集合看待的,词语的不同组合、不同顺序、不同数目都能够带来不同的含义和情感,这导致了分类工作的困难。因此,这个任务实际上是对人脑思维的模拟。我们前面的模型,实际上已经对此进行了最简单的模拟。然而,我们模拟的不过是一些简单的思维定式,真正的情感判断并不是只靠一些简单的规则。

  • 大脑做的事情比情感分类要多

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

通过上面的分析,我们不难发现传统的方法存在着两个难以克服的局限性:

  1. 精度问题:传统的模型无法模拟语言中复杂的非线性关系,故难以进一步提高精度;
  2. 背景知识依赖问题:传统思路需要事先提取好情感词典,而这一步骤,往往需要专业人员的大量人工操作才能保证准确率。

下面我给大家解释深度学习是如何做到的。

自然语言处理任务中,有一个非常核心的问题,就是如何把一个句子用数字的形式有效地表达出来?如果能够完成这一步,句子的分类就不成问题了。

那么,一个初步的思路是:给每个词语赋予唯一的编号,然后把句子看成是编号的集合,比如假设1,2,3,4分别代表“我”、“数学”、“喜欢”、“讨厌”,那么“我喜欢数学”就是[1, 3, 2],“我讨厌数学”就是[1, 4, 2]。这种思路看起来有效,实际上非常有问题,比如一个稳定的模型会认为3跟4是很接近的,因此[1, 3, 2]和[1, 4, 2]应当给出接近的分类结果,但是按照我们的编号,3跟4所代表的词语意思完全相反,分类结果不可能相同。因此,这种编码方式并不可取。

有人可能会想到,把意思相近的词语的编号凑在一堆不就行了?确实如果把相近的词语编号放在一起,会大大提高模型的准确率。可是如果给每个词语唯一的编号,并且将语义相近的词语编号设为相近,实际上是假设了语义的单一性。然而事实并非如此,语义应该是高维的,一个词语在不同的语境下总是有着不同的语义。

语义既然是高维的,那么在计算机中,词语就应该表示成高维的向量。为什么高维向量可行?首先,高维向量解决了词语的多方向发散问题。其次,高维向量允许我们用变化较小的数字来表征词语。怎么说?我们知道,就中文而言,词语的数量就多达数十万,如果给每个词语唯一的编号,那么编号就是从1到几十万变化,变化幅度如此之大,模型的稳定性是很难保证的。如果是高维向量,比如说20维,那么仅需要0和1就可以表达220 = 1048576(100万)个词语了。变化较小则能够保证模型的稳定性。

现在有了这个思路,新的问题是,如何把词语放到正确的高维向量中?Google有一个著名的开源工具——Word2Vec,它完成了的我们想要做的事情。

Word2Vec使用高维向量(词向量,Word Embedding)表示词语,并把语义相近的词语放在相近的位置。我们只需要有大量的某语言的语料,就可以用它来训练模型,获得词向量。对于词向量,我们可以使用欧氏距离或余弦相似度找出具有相近语义的词语。有了Word2Vec,我们就可以用词向量来表示词语,那么句子就对应着词向量的集合,也就是矩阵,类似于图像处理,图像数字化后对应着一个像素矩阵。

对于图像处理来说,已经有一套成熟的方法了,那就是卷积神经网络(CNNs),它是能够将矩阵形式的输入编码为较低维度的一维向量,而保留大多数有用信息。事实上,卷积神经网络在图像处理的那一套方法也可以直接用到自然语言处理任务中。

下面我给出一个基于CNN的文本分类模型的结构图,非常直观:

 

图片描述

 

这个CNN模型共分四层:

  1. 第一层是词向量层,文本中的每个词,都将其映射到词向量空间,假设词向量为k维,则n个词映射后,相当于生成一张n*k维的图像;
  2. 第二层是卷积层,多个滤波器作用于词向量层,不同滤波器生成不同的feature map;
  3. 第三层是池化层,取每个feature map的最大值;
  4. 第四层是一个全连接 + softmax层,输出是每个类别的概率。

我们使用这种基于词向量 + CNN的方法做文本分类,不需要人工提取特征,不需要领域知识,整个训练过程高度自动化。在我们的任务中,这个模型的准确度可以达到90%以上,远远超过传统模型。

自然语言处理任务中,另一个常用到的方法是循环神经网络(RNNs)。它的作用跟卷积神经网络是一样的,将矩阵形式的输入编码为较低维度的一维向量,而保留大多数有用信息。跟卷积神经网络的区别在于,卷积神经网络更注重全局的模糊感知(就好像我们看一幅照片,事实上并没有看清楚某个像素,而只是整体地把握图片内容),而RNNs则是注重邻近位置的重构,由此可见,对于语言任务,RNN似乎更具有说服力。因为语言总是由相邻的字构成词,相邻的词构成短语,相邻的短语构成句子,因此,语言任务需要把邻近位置的信息进行有效的整合。

基于词向量 + LSTM(Long-Short Term Memory)的模型结构和基于CNN的模型结构是类似的,只需要把卷积层和池化层换成一个LSTM层即可。

不难发现,不管是CNN的模型还是RNN的模型,都使用词向量(Word Embedding)来进行语义表示,事实上,基于神经网络的自然语言处理方法大都是在词向量的基础上进行的。所以,理解Word Embedding,对于我们理解和使用深度学习的自然语言处理方法至关重要。

海航舆情云平台实践

下面我会讲上面介绍的深度学习算法在海航舆情云平台中的应用。

首先我简单介绍一下海航的舆情云平台:舆情云平台项目的初衷是为了加强海航集团及其下属各成员企业的品牌效应,并且减少关键信息传播的成本,及时洞悉客户评价和舆论走向,以及指导舆论引导工作,加快对紧急事件的响应速度。目前主要功能如下,包括数据爬取、数据存储、微博舆情、新闻舆情、热词统计、情感分析、舆情监测、数据接口服务、热点事件梳理:

  1. 数据爬取:每天定时计划爬取指定微博,新闻媒体最新发布信息,存储以供分析
  2. 数据存储:存储微博、新闻内容、图片等,以及中间分析结果、计算结果
  3. 微博舆情:统计分析、信息监测、信息检索
  4. 新闻舆情:统计分析、信息监测、信息检索
  5. 热词统计:高频度热词统计
  6. 情感分析:文本分析、根据文字内容定位情感倾向
  7. 舆情监测:根据指定敏感词进行信息过滤,并提供通知功能
  8. 数据接口服务:提供对外的Rest的API数据服务
  9. 热点事件梳理:提供检索,优先列出热度高的新闻、微博记录
  10. 图像识别和内容分析:(这部分正在做)

部分展示效果图:

 

图片描述

 

在舆情云平台开发过程中,我们训练了多个基于词向量 + CNN模型,来实现情感分析的相关功能。

我们的机器学习工作流,如下图:

 

图片描述

 

1.定义预测目标

我们的客户比较关注用户对其服务的评价和反馈情况,微博平台就是一个很好的信息收集渠道,新浪微博中有大量对于其服务的肯定或者吐槽的信息,类似于商品评论,我们很容易就能判断出某条微博的情感倾向。

此外,客户常会关注一些敏感的新闻信息,和微博不同,新闻大多数都是在客观地陈述某件事情,并没有主观的情绪在里面,那该如何定义『负面新闻』呢?通过进一步的沟通和梳理,我将『负面新闻』定义为:对于一个企业/组织/个人不利的、有消极影响的新闻,就可以被认为是『负面新闻』。

2.数据收集

收集数据的方式有很多,我们使用定向爬虫从网上爬取需要的数据。数据源包括微博、主流媒体网站、大型论坛、指定行业网站等。

3.数据预处理

这里的主要工作是对上一步收集的数据进行情感标注,规则是:负面的标记0,中性及以上标记为1。我们的模型是监督训练的,所以这一步必不可少。

4.构建并训练模型

不同行业的常用词汇和表述是不一样的,为了简化模型结构,同时保证准确率,我对不同行业的语料分开建模,这里以财经新闻为例,具体步骤是:

  • 取10W条(越多越好)财经类新闻,对每条新闻进行分词,统计每个词出现的频次,并将词按频次从高到低进行排序,形成一个序数——词语的关系映射表。
  • 构建基于词向量 + CNN的网络。
  • 将数据划分为训练集和测试集。将训练集数据进行分词,通过查找映射表将文本转化为模型所需要的输入形式,然后把处理后的数据喂给模型进行训练,密切关注训练过程以防止过拟合。
  • 在测试集上进行预测,计算得到准确率、召回率等指标。
  • 交叉验证。保证从多个方向学习样本,避免陷入局部极小值。

5.评估模型

我认为评估模型可以从以下方面考虑:

  • 精度方面:包括准确度(Accuracy)、精确度(Precision)、召回率(Recall)、ROC曲线等评价指标。
  • 性能方面:在数据量有限、任务不复杂的情况下,尽量设计浅层的模型,它们计算开销小,并且易于扩展。

6.使用模型

对于训练好的模型,我们使用标准的API接口进行封装,新爬取的数据无需经过任何加工,直接批量地送入模型,就可以批量地返回分类结果。

一般认为准确率达80%以上的模型具有生产价值。我们使用微博语料、财经新闻语料、科技新闻语料训练的情感分类模型,平均准确率达到了90%以上,并且随着数据量的逐步增长,我们的模型还可以进一步优化。

答疑

Q1:情感的强度如何量化? 
杨欣伟:其实这对人来说也是一个难题,比如我们很容易判断一段评论是积极的还是消极的,但是我们难以对评论的情感倾向进行更细粒度的量化;机器在学习我们的判断逻辑,我们做不到的,机器也做不到。

Q2:情感分析的情感是指什么? 
杨欣伟:情感是指态度、意见和感情。换句话说,它们是主观印象,而不是客观事实。我在分享中延伸了它的概念,『情感』是可以由我们自由定义的。

Q3:能推荐一款比较好的分词工具吗? 
杨欣伟:出于对效率的考虑,我选择了Jieba。这里有一个关于中文分词工具的评测,您可以参考下http://it.sohu.com/20161201/n474637590.shtml。

Q4:咱们平台用了哪些深度学习开源工具? 
杨欣伟:使用了Keras和Tensorflow。Tensorflow是时下最流行的深度学习框架,随着版本的更迭它的功能也越来越完善。但是它的API非常的低层,使用的时候往往需要编写大量代码,即便是构建一个相对简单的模型。Keras则是一个高层的库,它的后台可以在Tensorflow和Theano之间自由切换,并且,Keras代码可以和Tensorflow代码无缝衔接。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 建立分类感知器二元模型对样本数据进行分类
    本文介绍了建立分类感知器二元模型对样本数据进行分类的方法。通过建立线性模型,使用最小二乘、Logistic回归等方法进行建模,考虑到可能性的大小等因素。通过极大似然估计求得分类器的参数,使用牛顿-拉菲森迭代方法求解方程组。同时介绍了梯度上升算法和牛顿迭代的收敛速度比较。最后给出了公式法和logistic regression的实现示例。 ... [详细]
  • cs231n Lecture 3 线性分类笔记(一)
    内容列表线性分类器简介线性评分函数阐明线性分类器损失函数多类SVMSoftmax分类器SVM和Softmax的比较基于Web的可交互线性分类器原型小结注:中文翻译 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
author-avatar
巡山小妖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有