文本情感分析:又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。对于意见、情感或观点,我们进行如下建模:对于给定的文本d,任务从文本中获取(e,a,s,h,t)五元组,即态度持有者h在t时间(条件下)对实体e的a方面有观点s。传统情感分析任务主要为情感分类,即确定s的极性。
从分析的粒度上,情感分析可以分为文章级(document level)、句子级(sentence level)和单词级(word level)情感分析,其中句子级情感分析在前沿领域有细粒度的情感分析。细粒度的情感分析在完成传统任务情感分类的基础上,还可以确定观点(情感)s针对了对象的哪一方面。例如,“这家餐厅披萨很好吃但是服务太差了”这句话,通过细粒度的分析可以提取出(披萨,+),(服务,-)。细粒度的情感分析可以进一步细分为三个小任务,分别是对象抽取(aspect extraction),对象级情感分类(aspect-level sentiment analysis)以及通过单个模型完成上述两个任务的方法(协同训练)。
本文首先简要介绍传统情感分析任务与方法,之后详细介绍细粒度情感分析相关前沿。
传统情感分析主要为情感分类,是nlp入门级的任务,相信很多人都做过豆瓣的影评情感分类(二分类),使用SVM等传统机器学习方法就可以很轻松的得到90%以上的准确率。但是很少有人想过:为什么豆瓣影评数据集只包含正面情感、负面情感两个类别,不应该有更多的数据是中性的吗?例如:“这个电影的主要内容是关于爱情的”,这样一个句子,很难说是包含了情感极性,而使用豆瓣影评数据集训练出来的模型,真的能够实际在豆瓣影评数据中进行分析吗?这恐怕是不行的,因为它没有能力处理大量的中性数据。
因此,当我们说传统情感分析是入门级的任务,我们默认了我们要去进行二分类,二分类哪怕使用传统机器学习模型,也可以很轻松的跑到95%以上的准确率,就是一个小学生,学会了编程,也能很好的解决二分类的任务。但是如上文所述,二分类的任务一般缺乏现实依据,其数据集往往是精挑细选的,当传统情感分析涉及三分类甚至五分类时,准确率会直线下滑。根据论文Deep Learning-Based Sentiment Classification: A Comparative Survey(2020),三分类任务在不同数据集上准确率为70%-85%,五分类任务准确率在60%左右。
一般对于显示数据集,三分类(正面、负面、中性)就可以很好概括数据集中的所有情况了,但是三分类任务哪怕在万能的深度学习方法的加持下,也只能达到75%左右的准确率。这是由于以下几个原因造成的:
综上,尽管传统情感分析是入门级的任务,但其中也包含着大量未解决的内容,联系着很多NLP领域的核心问题。现在,尽管更多顶会(ACL、NAACL、EMNLP)新论文是关于细粒度情感分析的,但是每年还是会有5篇左右顶会论文用于改进传统情感分析。相信未来会在这一方面取得突破性的进展。
在上文,我们通过(e,a,s,h,t)五元组,即态度持有者h在t时间(条件下)对实体e的a方面有观点s,定义了情感分析问题。传统情感分析任务主要为情感分类,即确定s的极性。细粒度情感分析在传统情感分析的基础上,能够分析对于实体e的方面a,所表达的情感极性s。细粒度的情感分析在完成传统任务情感分类的基础上,还可以确定观点(情感)s针对了对象的哪一方面。例如,“这家餐厅披萨很好吃但是服务太差了”这句话,通过细粒度的分析可以提取出(披萨,+),(服务,-)。细粒度的情感分析可以进一步细分为三个小任务,分别是对象抽取(aspect extraction),对象级情感分类(aspect-level sentiment analysis)以及通过单个模型完成上述两个任务的方法(协同训练)。
近三年来,细粒度情感分析的文章在nlp相关顶会之中大放异彩。越来越多的学者开始关注细粒度情感分析问题。
对象抽取(aspect extraction)的任务在过去的十几年之间均有研究。早期任务往往使用基于规则或者语法的方法,这种方法虽然准确率高且可解释性强,但是往往难以广泛应用。例如论文ICSE-Lin2019(Pattern-Based Mining of Opinions in Q&A Websites)为几千条数据就设计了100余条语法和依存句法的规则约束。
较新的方法使用LDA等主题模型,LDA通过两层贝叶斯模型对文档-主题-词进行了建模。在对象抽取任务中,一些研究将LDA得到的主题视为对象(aspect)进行研究。这一类研究往往影响较小(个人意见),是因为主题模型得到的主题词只从文档中词共现的角度去获取了语义,同时只能分析目标文本库(例如100篇新闻文章),因此数据量小+粒度大。词向量的方法可以根据滑动窗口捕获语义,粒度更小,且可以根据大语料库进行计算,数据量大+粒度小,得到的词向量具有更好的语义。
因此,较新的对象抽取方法主要基于词向量和深度学习模型。下文将逐一分析其中较为典型或比较有意思的文章。
emnlp2015liu论文可以说是最早通过深度学习方法将细粒度情感分析中的对象抽取任务转化为BIO标注任务的文章之一。文章基于SemEval-2014数据集,这是一个细粒度标注的数据集,对于一个句子既标注了情感极性,也标注了句子中提到的aspect word以及每一个aspect的情感极性。
The tech guy then said the service center does not do 1-to-1 exchange and I have to direct my concern to the "sales" team, which is the retail shop which I bought my netbook from.
emnlp2015liu论文在SemEval-2014数据集标注数据的基础上,基于Bi-LSTM设计模型学习解决BIO标注问题。
跟据emnlp2015论文可知,监督学习主要将aspect提取任务转化为BIO标注任务,更新的相关工作主要集中于模型效果的提高。此处介绍的ACL2017He论文是使用无监督学习的方法,能够根据输入文本库(句子或文档),提取出aspect的embedding,将aspect和词向量映射到同一空间。因此,ACL2017He的方法可以无监督提取出aspect word,并对句子进行aspect的分类。
模型简介:ACL2017He方法的具体思路如下:首先,把词汇表中每个词都使用词向量进行表示。之后,我们可以使用多种方法对aspect嵌入向量进行初始化。例如,我们可以完全随机K个aspect向量(和词向量在同一空间);我们也可以使用高级一点的方法,例如使用k-means方法找到文本库中词的K聚类中心,将这些聚类中心的坐标作为aspect嵌入向量;或者我们可以通过弱监督对aspect嵌入向量进行初始化。之后,我们根据每一个词的词向量,加上对这个词计算得到的ATTENTION,计算句子的加权向量(这里attention的作用被解释为把“看起来”更像aspect-word的词权重提高,把“看起来”就很水的non-aspect-word的权重减少)。我们将这一步得到的句子向量记为 z s z_s zs。将 z s z_s zs经过全连接层W并通过Softmax处理为概率分布 p t p_t pt(代表这一句子描述每一个aspect的可能性)。得到了 p t p_t pt之后,结合我们之前已经有了的aspect嵌入向量,以 p t p_t pt为权重计算第二个同一句子的表示向量 r s r_s rs。目标函数就是要 z s z_s zs和 r s r_s rs尽量接近。
模型评估:ACL2017He的方法(ABAE)主要对比了LDA及其变种,作者定义了主题(方面)的相关性分数,并计算了LDA、ABAE得到结果的相关性分数。结果显示ABAE明显优于LDA及其变种方法。
代码分析:作者在GitHub上开源了自己的代码(作者是个漂亮小姐姐),github链接
- libs
- ---custum_layers.py
- ---model.py
- ---optimizer.py
- ---reader.py
- ---...
- preprocess.py
- word2vec.py
- reader.py
- train.py
- evaluation.py
代码中libs主要是模型实现部分,其中运行顺序为preprocess.py–>word2vec.py–>train.py–>evaluation.py。代码的部分问题为,如果使用现成的谷歌词向量,模型对将整个词向量文件加载到内存(或显存中)导致速度过慢或无法运行,考虑之后对这一弊端进行更改。代码的另一个问题是运行环境为比较旧的python2.7环境,使用的tensorflow也比较过气了,之后考虑重写代码,改进弊端,发到GitHub上。github项目链接
前文中,我介绍了ABAE方法,可以说是近几年来第一个使用深度学习和注意力机制解决aspect extraction的方法,算是一个小级别的开山鼻祖。之后EMNLP2018这篇文章在ABAE方法的基础上进行了改进,将方法变为了弱监督,从而实现了更好地效果。新方法被命名为MATE(Multi-Seed Aspect Extractor),其效果如下图所示。
MATE方法对于每一个aspect,假设存在一个小集合的种子词(seed word,类似的思路其实挺常见的)。这些种子词即可以人工设定,也可以通过一个人工标注的句子集提取。MATE不同于ABAE,使用种子词得到(或者说初始化,在实际程序中可以选择aspect是否进行迭代更新)aspect的嵌入向量。MATE模型示意图如下图所示。
种子词向量到aspect嵌入向量的计算过程中,作者并不是单纯的求和取平均,而是为每一个seed word设计了一个可学习的权重系数,从而让模型可以判断哪个seed word更重要,或者说,可以减少标注数据中存在噪声的影响。但是这样做会导致模型所需要的数据量增多。如果去分析这个项目的github开源代码,会发现作者所谓的”弱监督“数据量并不小。不过是否需要这个权重矩阵,在模型中也是可选的。
我的GitHub改进项目上也会改进这一项目的代码。github项目链接
这一方面我个人还没有研究到,可参考博文ACL2018和博文TNet