http://geek.csdn.net/news/detail/139152
本文主要为大家介绍深度学习算法在自然语言处理任务中的应用——包括算法的原理是什么,相比于其他算法它具有什么优势,以及如何使用深度学习算法进行情感分析。
原理解析
在讲算法之前,我们需要先剖析一下我们要完成的任务,我们希望算法能够最大程度模拟大脑对于人类语言的处理逻辑,对文本进行褒义、贬义、中性的判断。在大多应用场景下,只分为两类。比说如,对于“喜爱”和“厌恶”这两个词,就属于不同的情感倾向。有一点需要特别注意,这里面所说的褒义、贬义并不是绝对的,分类的类别是根据我们的目标自由定义的,并且严格以人的判断为基准,比如我们可以把句子分类为陈述句、疑问句、祈使句和感叹句。
我们的第一个模型——基于情感词典的情感分类模型。
传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如图所示。我们首先通过学习来记忆一些基本词汇,如否定词语有“不”,积极词语有“喜欢”、“爱”,消极词语有“讨厌”、“恨”等,从而在大脑中形成一个基本的语料库。然后,我们再对输入的句子进行分词,看看我们所记忆的词汇表中是否存在相应的词语,然后根据这个词语的类别来判断情感,比如“我喜欢数学”,“喜欢”这个词在我们所记忆的积极词汇表中,所以我们判断它具有积极的情感。
基于上述思路,我们可以通过以下几个步骤实现基于情感词典的情感分类:包括预处理、分词、训练情感词典、判断,整个过程可以如下图表示。
1.文本的预处理
由网络爬虫爬取到的原始语料,通常都会带有我们不需要的信息,比如额外的Html标签,所以需要对语料进行预处理。这里的预处理工作主要是为了提取完整的句子,去掉一些多余的标记符号。处理之后我们需要对原始语料进行情感标注,我们可以用-1标记消极情感评论,1标记积极情感评论。
2.分词
为了判断句子中是否存在情感词典中相应的词语,我们需要把句子准确切割为一个个词语,即分词。现有可选择的分词工具有很多,我们可以研读各分词工具的测试报告,根据自己的需求选择合适的分词工具。
3.构建情感词典
情感词典可分为四个部分:积极情感词典、消极情感词典、否定词典以及程度副词词典。为了得到更加完整的情感词典,我们可以收集多个情感词典,对它们进行整合去重,同时需要对部分词语进行调整,以达到尽可能高的准确率。
此外,我们需要根据需求加入某些行业词汇,以增加分类中的命中率。不同行业某些词语的词频会有比较大的差别,而这些词有可能是情感分类的关键词之一。比如手机行业,“耐摔”和“防水”就是在这个领域有积极情绪的词。因此,有必要将这些因素考虑进模型之中。
4.分类
为了简单起见,我们将每个积极情感词语赋予权重1,将每个消极情感词语赋予权重-1,并且假设情感值满足线性叠加原理;我们已经将句子进行分词,如果分词后的词语向量包含相应的词语,就加上其对应的权值,其中,否定词和程度副词会有特殊的判别规则,否定词会导致权值取反,而程度副词则让权值加倍。最后,根据总权值的正负性来判断句子的情感。基本的规则如图所示。
最后我们需要对模型的效果进行检验。通过在我们爬取的微博语料上进行测试,基于情感词典的模型准确率只有76%,这个结果有点差强人意。
那么,为什么这个模型的效果不那么好?这是由于这个任务本身的复杂性所致的。
文本情感分类的困难在于:
- 语言系统是相当复杂的
人的语言是一个相当复杂的文化产物,一个句子并不是词语的简单线性组合,它有相当复杂的非线性在里面。我们在描述一个句子时,都是将句子作为一个整体而不是词语的集合看待的,词语的不同组合、不同顺序、不同数目都能够带来不同的含义和情感,这导致了分类工作的困难。因此,这个任务实际上是对人脑思维的模拟。我们前面的模型,实际上已经对此进行了最简单的模拟。然而,我们模拟的不过是一些简单的思维定式,真正的情感判断并不是只靠一些简单的规则。
- 大脑做的事情比情感分类要多
事实上,我们在判断一个句子的情感时,我们不仅仅在想这个句子是什么情感,而且还会判断这个句子的类型(祈使句、疑问句还是陈述句?);当我们在考虑句子中的每个词语时,我们不仅仅关注其中的积极词语、消极词语、否定词或者程度副词,我们会关注每一个词语(主语、谓语、宾语等等),从而形成对整个句子整体的认识;我们甚至还会联系上下文对句子进行判断。这些判断我们可能是无意识的,但我们大脑确实做了这些事情,以形成对句子的完整认识,才能对句子的情感倾向做出准确的判断。也就是说,我们的大脑是一个非常高速而复杂的处理器,我们做情感判断,其实同时做了很多事情。
通过上面的分析,我们不难发现传统的方法存在着两个难以克服的局限性:
- 精度问题:传统的模型无法模拟语言中复杂的非线性关系,故难以进一步提高精度;
- 背景知识依赖问题:传统思路需要事先提取好情感词典,而这一步骤,往往需要专业人员的大量人工操作才能保证准确率。
下面我给大家解释深度学习是如何做到的。
自然语言处理任务中,有一个非常核心的问题,就是如何把一个句子用数字的形式有效地表达出来?如果能够完成这一步,句子的分类就不成问题了。
那么,一个初步的思路是:给每个词语赋予唯一的编号,然后把句子看成是编号的集合,比如假设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模型共分四层:
- 第一层是词向量层,文本中的每个词,都将其映射到词向量空间,假设词向量为k维,则n个词映射后,相当于生成一张n*k维的图像;
- 第二层是卷积层,多个滤波器作用于词向量层,不同滤波器生成不同的feature map;
- 第三层是池化层,取每个feature map的最大值;
- 第四层是一个全连接 + softmax层,输出是每个类别的概率。
我们使用这种基于词向量 + CNN的方法做文本分类,不需要人工提取特征,不需要领域知识,整个训练过程高度自动化。在我们的任务中,这个模型的准确度可以达到90%以上,远远超过传统模型。
自然语言处理任务中,另一个常用到的方法是循环神经网络(RNNs)。它的作用跟卷积神经网络是一样的,将矩阵形式的输入编码为较低维度的一维向量,而保留大多数有用信息。跟卷积神经网络的区别在于,卷积神经网络更注重全局的模糊感知(就好像我们看一幅照片,事实上并没有看清楚某个像素,而只是整体地把握图片内容),而RNNs则是注重邻近位置的重构,由此可见,对于语言任务,RNN似乎更具有说服力。因为语言总是由相邻的字构成词,相邻的词构成短语,相邻的短语构成句子,因此,语言任务需要把邻近位置的信息进行有效的整合。
基于词向量 + LSTM(Long-Short Term Memory)的模型结构和基于CNN的模型结构是类似的,只需要把卷积层和池化层换成一个LSTM层即可。
不难发现,不管是CNN的模型还是RNN的模型,都使用词向量(Word Embedding)来进行语义表示,事实上,基于神经网络的自然语言处理方法大都是在词向量的基础上进行的。所以,理解Word Embedding,对于我们理解和使用深度学习的自然语言处理方法至关重要。
海航舆情云平台实践
下面我会讲上面介绍的深度学习算法在海航舆情云平台中的应用。
首先我简单介绍一下海航的舆情云平台:舆情云平台项目的初衷是为了加强海航集团及其下属各成员企业的品牌效应,并且减少关键信息传播的成本,及时洞悉客户评价和舆论走向,以及指导舆论引导工作,加快对紧急事件的响应速度。目前主要功能如下,包括数据爬取、数据存储、微博舆情、新闻舆情、热词统计、情感分析、舆情监测、数据接口服务、热点事件梳理:
- 数据爬取:每天定时计划爬取指定微博,新闻媒体最新发布信息,存储以供分析
- 数据存储:存储微博、新闻内容、图片等,以及中间分析结果、计算结果
- 微博舆情:统计分析、信息监测、信息检索
- 新闻舆情:统计分析、信息监测、信息检索
- 热词统计:高频度热词统计
- 情感分析:文本分析、根据文字内容定位情感倾向
- 舆情监测:根据指定敏感词进行信息过滤,并提供通知功能
- 数据接口服务:提供对外的Rest的API数据服务
- 热点事件梳理:提供检索,优先列出热度高的新闻、微博记录
- 图像识别和内容分析:(这部分正在做)
部分展示效果图:
在舆情云平台开发过程中,我们训练了多个基于词向量 + CNN模型,来实现情感分析的相关功能。
我们的机器学习工作流,如下图:
1.定义预测目标
我们的客户比较关注用户对其服务的评价和反馈情况,微博平台就是一个很好的信息收集渠道,新浪微博中有大量对于其服务的肯定或者吐槽的信息,类似于商品评论,我们很容易就能判断出某条微博的情感倾向。
此外,客户常会关注一些敏感的新闻信息,和微博不同,新闻大多数都是在客观地陈述某件事情,并没有主观的情绪在里面,那该如何定义『负面新闻』呢?通过进一步的沟通和梳理,我将『负面新闻』定义为:对于一个企业/组织/个人不利的、有消极影响的新闻,就可以被认为是『负面新闻』。
2.数据收集
收集数据的方式有很多,我们使用定向爬虫从网上爬取需要的数据。数据源包括微博、主流媒体网站、大型论坛、指定行业网站等。
3.数据预处理
这里的主要工作是对上一步收集的数据进行情感标注,规则是:负面的标记0,中性及以上标记为1。我们的模型是监督训练的,所以这一步必不可少。
4.构建并训练模型
不同行业的常用词汇和表述是不一样的,为了简化模型结构,同时保证准确率,我对不同行业的语料分开建模,这里以财经新闻为例,具体步骤是:
- 取10W条(越多越好)财经类新闻,对每条新闻进行分词,统计每个词出现的频次,并将词按频次从高到低进行排序,形成一个序数——词语的关系映射表。
- 构建基于词向量 + CNN的网络。
- 将数据划分为训练集和测试集。将训练集数据进行分词,通过查找映射表将文本转化为模型所需要的输入形式,然后把处理后的数据喂给模型进行训练,密切关注训练过程以防止过拟合。
- 在测试集上进行预测,计算得到准确率、召回率等指标。
- 交叉验证。保证从多个方向学习样本,避免陷入局部极小值。
5.评估模型
我认为评估模型可以从以下方面考虑:
- 精度方面:包括准确度(Accuracy)、精确度(Precision)、召回率(Recall)、ROC曲线等评价指标。
- 性能方面:在数据量有限、任务不复杂的情况下,尽量设计浅层的模型,它们计算开销小,并且易于扩展。
6.使用模型
对于训练好的模型,我们使用标准的API接口进行封装,新爬取的数据无需经过任何加工,直接批量地送入模型,就可以批量地返回分类结果。
一般认为准确率达80%以上的模型具有生产价值。我们使用微博语料、财经新闻语料、科技新闻语料训练的情感分类模型,平均准确率达到了90%以上,并且随着数据量的逐步增长,我们的模型还可以进一步优化。
答疑
Q1:情感的强度如何量化?
杨欣伟:其实这对人来说也是一个难题,比如我们很容易判断一段评论是积极的还是消极的,但是我们难以对评论的情感倾向进行更细粒度的量化;机器在学习我们的判断逻辑,我们做不到的,机器也做不到。Q2:情感分析的情感是指什么?
杨欣伟:情感是指态度、意见和感情。换句话说,它们是主观印象,而不是客观事实。我在分享中延伸了它的概念,『情感』是可以由我们自由定义的。Q3:能推荐一款比较好的分词工具吗?
杨欣伟:出于对效率的考虑,我选择了Jieba。这里有一个关于中文分词工具的评测,您可以参考下。Q4:咱们平台用了哪些深度学习开源工具?
杨欣伟:使用了Keras和Tensorflow。Tensorflow是时下最流行的深度学习框架,随着版本的更迭它的功能也越来越完善。但是它的API非常的低层,使用的时候往往需要编写大量代码,即便是构建一个相对简单的模型。Keras则是一个高层的库,它的后台可以在Tensorflow和Theano之间自由切换,并且,Keras代码可以和Tensorflow代码无缝衔接。