分享嘉宾:李明磊博士 华为云 NLP算法专家
编辑整理:付一韬
出品平台:DataFunTalk
导读:随着移动互联网的普及,网络上每天产生大量的文本数据,蕴含着巨大的有价值信息。情感分析作为自然语言处理中的一个重要研究方向。在实践中有着广泛的应用,如商品评论分析、政治、金融、旅游等领域中的商品推荐、产品辅助决策、公司政府的舆情监测、服务评价等等。本文主要介绍情感分析的概念、应用、任务和方法,进一步会介绍华为云在细粒度情感分析方面的实践,包括属性级情感分析和观点四元组分析。
主要内容包括:
文本情感分析介绍
属性级情感分析
观点四元组分析
总结
我们主要分析sentiment,从分析对象来看会包含文本、图像、语音,EEG(脑电波)、多模态分析情感。从任务方面来看,不仅是有情感的识别,还有情感生成的一些任务,像现在有情感对话的生成,还有虚拟人情感生成。在本报告中,主要侧重文本方面的情感识别。
1. 文本情感分析
上面文本情感分析五要素定义是采用刘冰老师的定义,这个定义分为了实体 ( entity )、实体的某一个方面 ( aspect )、针对这个实体的情感正负面 ( opinion=sentiment,即情感正负面也称作观点正负面 )、观点持有者 ( hold ) 和持有观点的时间 ( time ) 这五要素,一般来说hold和time文本很少提及。
另一个概念一般会把entity和aspect合并在一起成为一个target,是针对我们目标对象的情感或者观点。例如:“我觉得华为手机的拍照非常牛逼”这里面对应的实体是“华为手机”,对应的aspect是“拍照”,对应的情感是“非常牛逼”为正面,对应的观点持有者是“我”,而时间没有提及所以为空。
当前的文本情感分析就是根据输入文本,然后识别其中这五要素里的几个要素,现在还没有相关工作可以同时识别出五个要素。一般的话现在最简单的情感分析是只识别出这个文本的观点/情感,既不包含实体也不包含aspect并且也不包含观点持有者,再进一步的工作就是识别出针对哪一个aspect(实体)的观点(情感)。
这里简单介绍一些细粒度情感分析和我们说的一般情感分析的区别。一般的情感分析都是直接识别整个文本的正负面,然而细粒度情感分析会更细一些,这里面有两个概念,一个是从情感的粒度上会更细,比如从sentiment到emotion的情感粒度升级,之前我们只分析正负面,现在除了正负面还有情绪,如高兴、伤心等,从情感这个维度讲这是一种细粒度情感分析。还有一个是从分析对象的角度来讲,之前的情感分析是直接识别整个句子或整篇文章的情感,它不区分情感对象是谁,再细粒度一些的话就需要识别出整个句子里面情感针对的对象是谁,它是句子里的某个实体或者是某个实体的某个属性,从这个角度这也是细粒度情感分析的一种,我们今天主要侧重第二个针对对象角度的情感分析。
2. 情感分析任务
下面介绍一下情感分析的各个任务,这里面分析是情感的识别,不包含生成,还有前面提到的语音图片也不涉及。
针对文本的情感分析会分成几个等级:
词级别的情感分析:这个类似于情感词典的构建,怎么去构建一个大规模的情感词典,比如“车祸”这个词对应的情感就是负面的,“生日”这个词对应的情感就是正面的。
句子/文档级的情感分析:我们现在用比较多的,各大云服务厂商都会有的一个服务,针对句子或者文档的情感分析,输入一句话返回相应的情感正负面,但它不区分正负面针对哪一个句子里面哪个实体或者哪个对象。
目标级的情感分析:这是我们今天侧重的目标级的细粒度情感分析,这里面的目标就是上边说的target,它可以是一个实体也可以是一个属性,还可以是实体+属性的组合形式。
对于目标级的情感分析分为三种:
针对属性的情感分析 ( TG-ABSA ):这里面对象是固定然后只分析里面某几个属性的正负面,这就会涉及到两个任务,一个是对象的属性识别,另一个是该属性的情感识别。例如图中的例子“外观XXX”,这里的对象是固定说的是手机,我们只需要识别出其中的属性外观、内存和性能,然后分别识别出各个属性的情感正负面。针对属性识别也分成两个任务,一是属性词的抽取,就是我们要定位出属性描述词在文中的位置,另一个是该属性描述词对应的属性类别,因为针对某个属性的描述可能是“外观”也可能是“看起来很好看”,它这个描述不一定包含显性的属性描述词。针对情感识别会分为观点词抽取和观点分类。
针对实体的情感分析 ( TN-ABSA ):这里是文本中只有实体而没有属性,只针对实体的情感进行分析,这涉及到的两个任务,实体识别和情感识别。实体识别分为实体词抽取和实体分类,情感识别分为观点词抽取和观点分类。
针对目标的情感分析 ( T-ABSA ):这里面的目标就是实体+属性的组合,例如:“小米性价比”、“华为拍照”等,这会比上面两个任务相对更细一些。目标识别分为目标词抽取和目标分类,情感识别分为观点词抽取和观点分类。
针对情感分析,简单介绍一些方法简史。最早的一个方法是基于字典加规则的方式,我们人工构建一个情感词典,每个词都有对应的正负面,然后根据句子中正面词和负面词的数量,最后做一个投票,这是一个最简单的方法。后边就有了基于机器学习的方法,像传统的机器学习SVM等,将情感词典和词袋作为它的一个特征。再进一步就是深度学习,还有就是现在的基于预训练语言模型+fine tune的方法,应该是现在效果最好的一个方法。
下边我介绍一下我们其中的一个工作,属性级情感分析(TG-ABSA),这里面实体是固定的,分析它各个属性的正负面。像上面句子级情感分析是大部分厂商提供的,比如“买没几天就降价一点都不开心,闪存跑分就五百多点”,这个整体是负面,但是它针对价格和闪存两个属性都有相应情感,这里并没有区分。属性级情感分析这个任务就是给定属性的类别集合,然后预测它各个属性的正负面。其中,这里的表达也分为两种,一种是显式的观点表达,另一种是隐式的观点表达。显式的观点表达会显示提到属性的属性词和观点词,比如“手机内存非常大,系统流畅,性价比非常高”,这里属性词“内存”、“系统”和“性价比”都有显示的提到,而像“手机太贵了,颜值非常高,一点都不卡”,这里“手机太贵了”、“一点都不卡”表达的属性分别是“价格”和“性能”,但是没有相应的属性词。
针对这两种不同的表达方式,处理方式是不一样的,后边会介绍一种专门针对显示的方法。
1. 属性级情感分析—相关工作介绍
① 无监督方法:
最传统的一个方法是无监督的,这种方法的优势是不需要标注数据,比如使用基于句法解析的方法,先抽取句子里主语谓语宾语的表达方式,比如“服务员很漂亮”,通过抽到的主语“服务员”和它对应的形容词“漂亮”,这样我就可以知道它的评价对象是“服务员”,观点是“漂亮”,再根据查情感词典知道这是一个正面的情感,这样就可以得到针对服务员的评价是正面的。
这种方法只能处理显示的表达,如果是隐式的表达,因为句子中没有属性词,那么通过句法解析没法得到对应的角色,所以无法分析来处理隐式的表达。这种无监督方法的优点是不需要标数据,缺点是准确率相对低一些,没法处理隐式表达。
② 阅读理解方法:
最近的一个工作是复旦邱锡鹏老师组提出的基于深度学习的方法,分析一个句子里面各个属性的正负面,他把这个问题转化成一个阅读理解的问题,本来一个句子有N个属性集合,他把句子和属性转换成句子-属性 pair。输入一个句子,这里面aspect可以描述成阅读理解的一个问你题,比如“针对外观评价是怎么样的”,这样转换成问答对的方式,然后基于Bert来识别这个问答对正负面的答案,这是一个比较新的工作。
这种方式的优势是比较灵活,属性可以无限的扩充,不管是新增或者减少属性,都可以用这种方法直接取处理,而且准确率还比较高。但是这种方法的缺点就是它的效率相对要低一些,因为如果有N个属性,在预测的时候,它需要预测N次才能得到结果。
2. 属性级情感分析—方案介绍
我们提出了一个基于类似多标签,多任务的方法。整个任务给定属性类别集合,然后预测每个属性的正负面。
这里面的难点是,首先我们大框架使用的是有监督的方法,因为最终我们想要把应用部署到华为云的服务上,所以准确率要求是比较高的,要求达到90%以上,一般无监督的方法无法满足,所以还是需要有监督的方法。这就需要标注数据,如果是多个属性它的一个问题就是标注起来比较困难,比如说一个手机评论可能会涉及到二三十个属性或者说甚至上百种属性,如果要标数据的话,这会非常的困难。我们的方法不同于传统的多标签分类,像文本多标签分类任务的类别有政治、经济、新闻,该任务只涉及标签是否出现,但这里不一样的地方是它不仅涉及到属性是否出现,还要预测出属性的正负面,相当于每个属性都要预测出它的三个标签—正面、负面和未出现。相当于每个属性是一个多分类任务而不是一个二分类任务。之前那种多标签分类,一般最后会把每个标签转化成logits,这里的话用这种方法就没办法处理。然后还有就是隐式表达。
我们解决的技术思路是,把它转换成一个Multi-task多分类任务,每个属性都处理成一个多分类的任务,所以它输出不是二分类而是一个多分类。在标注数据的过程中,我们引入主动学习的思路,先标注一批少量的数据,然后用模型对剩余未标注的做一个预测,然后再对那些置信度比较低的再去人工审核标注这些数据,如果置信度比较高的就不用再标了,这样的话可以提高标注效率。另一个方法是,如果一个样本同时标注多个属性,这个标注成本是很高的,我们引入Label mask的思路,就是在训练的时候 某几个属性可能标也可能没标,如果没标的话就把这个属性mask掉,然后在计算loss的时候该属性就不参与计算了,只将那些已经标注的属性参与loss计算和反向传播的计算,这样的一个好处就是我在真正标注样本的时候想标注哪几个属性就标注哪几个属性,不用每个样本的所有属性都要标注,这样标注就更加灵活,可以先针对某一个属性只标注它,标完该属性后再标另一个属性,这实际上是一个很灵活的标注。
使用这个方法的一个优势是,它最终基于深度学习模型,准确率比较高,也支持隐式的表达,因为深度学习可以编码各种语义的表达,还有一个就是我们这种方法可以提高标注效率。在中间编码这块可以是基于bert、roberta这种预训练语言模型,最终输出使用label mask的方法。
3. 属性级情感分析—结果
上面是我们最终的实验结果,针对汽车领域测试样本大概有7000多个,每个样本平均的属性数量是4.27个,其中预定义的属性集合是8个,最终可以看到每个属性的准确率都是很高的,基本上达到90%以上。针对手机领域的结果基本上也是每个属性F值基本上能达到将近90%。
右上角的图是针对每个属性预测的标签的置信度的阈值,随着阈值的上升,命中的属性(即预测的标签的置信度在阈值以上的属性)准确率也在上升,而Attribute Hit Rate(即预测标签的置信度在阈值以上的属性占比)也随着阈值的上升而下降,即有些属性预测的标签的置信度低于阈值,但是命中的属性预测出标签的准确率是慢慢上升的,这个也是符合我们的一般认知的。这个的一个好处是最终产品上线之后,用户要求有一部分不需要人工审核,另一部分则需要人工审核,当达到某个阈值之后,他们就可以不用参与人工审核。通过调节阈值,让某些属性的指标达到了这个阈值,比如准确率都达到95%,这一部分就不需要人工审核。
4. 属性级情感分析—应用案例
这是我们基于多属性情感分析的一个应用案例,这是汽车领域的案例,针对网上很多的汽车领域的评论,我们可以分析汽车在八个属性维度上的正负面评价。上图左上角里红色的线就是一个行业的平均水平,蓝色的线是针对这个车它的各个维度的雷达图像,这样就可以很方便地对比出不同车型,它的一个好坏。可以方便用户在产品选型的时候做一个对比,也可以方便厂家针对评论本身对他们的产品做相应的改进。
1. 四元组观点挖掘—介绍
上面讲到的虽然可以分析出各个属性的正负面,但是它的一个缺点是没办法定位出针对某个属性具体评价的属性描述词位置和观点描述的位置,因为有些用户不仅想要找到属性正负面,还要找到它对应的评价位置,所以我们这个工作是针对观点四元组进行挖掘的。
观点四元组挖掘这个任务不仅要分析出各个属性的正负面,还要定位出它属性描述词的位置以及观点描述词的位置。比如“手机内存非常大”中属性描述词定位到“内存”,评价词定位“非常大”,对于“性价比非常高”这句话,属性描述词定位到“性价比”,观点描述定位到“非常高”,不仅要识别出属性的类别还要定位到位置,所以这里一共有四个要素要预测出来,分别是属性词、属性类别、评价词和评价极性,其中属性类别和评价极性在前面的工作已经做到了。
2. 四元组观点挖掘—方案
针对这个任务,我们提出了一个基于抽取加分类的联合模型,上图是我们现在采用的框架,底层是基于编码的模型,可以是bert或者roberta等,然后将句子编码成一个向量表示。
图中左边这侧是用于定位属性描述位置和观点描述位置的,是一个序列标注模型,比如这里B_A是属性描述词起始位置,I_A则是在属性描述词中间的位置,例如这里“内存”和“颜色”都是属性描述词。在这里最上层用的是CRF序列标注模型来进行属性描述词的抽取。图中右边这侧对应的跟上面的工作有点类似了,有N个属性对应有N个输出,然后对应每个属性预测它的正负面和未出现这几类。左边做属性词抽取,右边做属性正负面预测,最终可以输出每个属性的四元组(属性类别,属性描述词,观点描述词,观点类别)。
3. 四元组观点挖掘—数据标注
这里的比较耗时间的工作就是数据标注,因此我们专门做了四元组观点挖掘的数据标注平台。上面“简单”这个分类标签是为了解决标注过程中有些不同标注人员他可能对同一个样本就会有冲突,他觉得这个样本比较难标或者好标的话这里就是用这进行区分,如果样本好标会打个“简单”的分类标签,如果让他觉得不确定,他会不打“简单”的标签,即“复杂”标签。因为我们标的属性比较多,涉及到差不多三四十个属性,这里做了一个对属性做了大致的分类。
这里的标注任务是类似于关系抽取里面3元组的标注任务,先标注属性描述词,然后再标注它的观点描述词,这里面它两个其实是形成一个搭配关系,这个类似于一个三元组中实体和实体及他们的关系,只不过这里的关系是一种搭配的关系,将它们连起来就可以了,最后再加上它对应的正负面以及属性描述词对应的属性类别,这样每个样本的四元组就标出来了。
上图左边是我们标注大概两万条手机评论的数据分布,其实可以看到数据分布式非常不均衡的。这个是拿到真实用户在线上评论的数据,有些评论会偏的非常多,然而有些类别评论会非常少。上图右边是针对所有属性对应正负面的分布,这个也是非常不均衡的,正面的评论比较多,负面的评论会相对少很多。
4. 四元组观点挖掘—结果
上图为我们最终的评价结果,因为它是一个四元组既包含分类也包含抽取,对于评价指标我们用了一个Fuzzy F1值。我们对每一个属性加正负面标签作为一个评价对象,比如“外观正”作为一个评价对象,然后去找它对应的位置,计算这个位置它们字符的重合率(包括观点描述词和属性描述词的重合率)这样去算它的F值。EM F1值是预测描述词的位置完全精准匹配,稍微有一点不对也算错,这个比前面的指标更加严格。
在编码器这部分我们尝试了几个不同的编码器,包括bert、roberta还有nezha等。由于我们有很多未标注的数据,基于这些数据我们做了领域的预训练,然后再进行fine tune。右图展示了不同指标下的结果,可以看到在未标注数据上进行领域预训练的话是可以带了一个点的提升,Fuzzy F1能达到0.79。另外,这个评估指标对于人的实际感知不太直观,我们随机抽取500条数据进行人工评价。人工评价的过程是每个样本预测出每个属性标签和正负面且包括它们的位置,将这样的四元组抽取出来进行人工评价,判断预测是否合理,如果合理标记为1,如果不合理则标记为0,这样来看人工对模型预测的指标判断。人工评价的准确率是非常高的,差不多96%的准确率,即人工认为预测是合理的。这两个结果差别是比较大的,但也是比较合理的,因为在数据标注过程中,不同标注人员对观点描述词的位置以及属性描述的位置也可是会有歧义。比如“外观非常好看”这句话,有些人观点描述词会标“好看”,有些人就会标“非常好看”,这其实对最终预测结果影响不大,但是如果用字符重合率的方法,那会严重影响计算这个指标,所以说它两个差异比较大也是合理的。
5. 四元组观点挖掘—Demo
上图是我们一个简单的demo,输入一个样本,生成对应每个属性的正负面,当点击某个属性的时候它对应的评价词位置就可以高亮出来,红色代表属性描述词,绿色代表观点描述词。上面说的人工评价就是这些结果预测出来后,人工看看预测是否合理。
本文主要介绍了情感分析的一些基本任务,包括文本、语音、图像还有生成、识别。对于文本情感分析任务做了详细介绍,重点介绍了两个工作,一个是属性级情感分析,这个是给定属性集合情况下,预测每个属性的正负面,我们将它构建成了一个多任务分类。另一个工作比上面的粒度更细一点,不仅要预测出属性正负面,还要定位出它具体的属性描述词和观点描述词的位置,我们把它做成了一个抽取加分类的多任务联合模型,既包括抽取也包括分类。
对于未来的趋势,我们在实际做的过程中发现大家在工业界会碰到标注数据成本非常高的问题,每一个任务基本上我们需要标将近两万条数据,所以最终的效果准确率是比较高的。另一方面,对于模型加速这部分,由于使用深度学习像bert这种预训练模型,它的推理成本还是比较高的,我们华为可以对硬件进行底层适配。对于领域迁移未来也是关注重点,怎么能从更低成本从某一领域迁移到另一个领域,比如从汽车领域迁移到手机领域,或者从手机领域迁移到房地产领域等等。另外,还有自监督去训练超大规模的模型,比如像bert、roberta还有最近GPT3等等,这也是未来的趋势,然后再考虑如何将知识图谱加入到大模型当中进行知识增强来提升模型理解的效果。还有就是多模态这部分,怎么把图像、文本或者语音这些信息辅助来提升模型的效果。因为人在学习的时候不仅参考了文本的信息,还有视觉方面的信息等等。现在对于多模态情感分析我们也有一些工作正在做,比如说从视频中分析出一个人的情感,既考虑人脸的图像信息,也考虑他语音的一些信息,比如语气等等。
今天的分享就到这里,谢谢大家。
在文末分享、点赞、在看,给个3连击呗~
李明磊 博士
华为云 | 自然语言处理算法专家
李明磊,华为云NLP算法专家,博士毕业于香港理工大学,从事文本情感分析和情绪识别的研究,在TAC、ACL、EMNLP等发表论文多篇,获得IALP 2016 最佳论文奖,KSEM2017最佳学生论文奖。目前就职于华为云语音语义创新Lab,主要负责华为云文本分析、多模态分析等业务,所孵化服务已在多个实际业务场景中落地。团队DigScience2019,CCF BDCI 2019, WSDM Cup 2020比赛金牌。