细粒度的情感分析Gated Convolutional Networks——tensorflow实战

首先简要介绍一下基于Aspect的情感分析(Aspect based sentiment analysis——ABAS),ABAS的主要任务:是判断句子所在的场景在某一方面的情感极性。举个例子,假如我们拿到一条餐厅评价文本数据如下:这家餐厅的环境还不错,可以菜做的不怎么样。

ABSA的任务就是去判断出下面两方面的情感极性:
1.在‘环境’这个aspect,文本的情感是积极的,
2.在‘做菜’这个aspect,文本的情感是消极的。

和普通的情感分析的不同点是,此类情感分析任务除了需要给出文本的情感极性,还要确切知道这个情感是发生在哪个方面。

ABAS任务简介

ABAS有两个子任务:

  • 1.基于aspect类的情感分析(aspect-category sentiment analysis ——ACSA),主要任务是判断关于句子中的某个实体(entity)的情感极性。举个任务例子:
    输入:文本是“这块手表的颜色不错” 。 entity是“颜色 ”
    输出:情感极性

  • 2.基于aspect词的情感分析(aspect-term sentiment analysis ——ATSA):主要任务是判断判断句子在某方面的情感极性。
    输入:文本是“这家餐厅的环境还不错,可以菜做的不怎么样”
    输出 :环境方面的情感极性,交通便利方面的情感极性,做菜方面的情感极性。
    其中ATSA类似于一个多标签(multi-label)的任务。

ABAS算法简介

由于ABAS一般会有两块输入
1.特征文本,
2.以及entity或者aspect词。
所以一般会使用entity或者apect词的信息,对特征文本做attention去提取出和entity和apect词关联度比较高的特征去做情感分析。所以基于注意力机制(attention-based)的LSTM,CNN是经常采用的算法,但是由于attention和LSTM的计算效率都比较低,但是为了充分利用entity和aspect词的信息,基于门控制机制(Gate-mechanisms)CNN也是一种重要的解决此类问题的算法。

实验部分:

这里我们会使用Aspect Based Sentiment Analysis with Gated Convolutional Networks论文(发表在2018年ACL会议)中介绍的一种基于Tanh-ReLU门控制机制的CNN模型在SemEval-2014 task4数据集上做ATSA的任务。我们会对原网络做一点修改,同时加入2018年谷歌提出Scaled Dot-Product Attention对网络进行加强。

GCAE(Gated Convolutional Networks Aspcet Embedding)

GCAE主要前向网络的流程如下图所示:

  • 1,首先将句子使用的是Glove的词向量表示,然后通过一层CNN,得到句子的表示特征S_1,和S_2。
  • 2.Aspect词则通过一层embedding层,得到其向量表示A。
  • 3.最关键的一部则是门机制的部分:首先将句子的表示特征S_1通过激活函数tanh得到tanh(S_1),然后将表示特征S_2和A相加送入激活函数relu得到relu(S_2+A),最后将tanh(S_1)和 relu(S_2+A)做element-wise-product 得得到最终的特征向量。
  • 使用max pooling处理特征向量之后经过一层全连接层(fully connected layer),然后使用softmax激活函数就得到最终分类的结果。

此网络的优点是摆脱了RNN和attention 等耗时耗内存的网络结构,同时门机制又很好的利用了aspect词的信息,使得模型的精度不减反增。


image.png

模型架构如下,这里和原文有一点小小不同,就是apect词的表示采用的是Glove的词向量表示,然后通过了一层max pooling之后得到的。而不是采用原文的embedding层。

def gate_cnn_model(sentence,aspect,kernel_num,kernel_size,class_num):
    sentence_rep =  [tf.nn.tanh(tf.keras.layers.Conv1D(kernel_num,i)(sentence)) for i in kernel_size]###[batch_size,  seq_len-kernel_size(i),  kernel_num] *len(kernel_size)
    aspect_rep = tf.keras.layers.Dense(kernel_num)(aspect)###[batch_size,asp_len,kernel_num]
    aspect_rep = tf.keras.layers.GlobalMaxPool1D()(aspect_rep)###[batch_size,kernel_num]
    aspect_rep = tf.expand_dims(aspect_rep,1)
    join_rep = [tf.nn.selu(tf.keras.layers.Conv1D(kernel_num,i)(sentence)+aspect_rep) for i in kernel_size] 
    gate = [i*j for i,j in zip(sentence_rep,join_rep)]
    out = [tf.keras.layers.GlobalMaxPool1D()(i) for i in gate]###[batch_size,kernel_num]*len(kernel_size)
    out = tf.concat(out,1)###[batch_size,kernel_num*len(kernel_size)]
    out = tf.keras.layers.Dense(class_num,activation="softmax")(out)

GCAE_ATT (Gated Convolutional Networks Aspcet Embedding with attention)

此网络基本符合原有网络架构,但是在网络第一步:在句子glove向量和CNN之间加了一层Scaled Dot-Product Attention,其作用是更好的表达了句子的特征,提取出更多的信息,其代码如下:

def gate_cnn_model_att(sentence,aspect,kernel_num,kernel_size,class_num):
    sentence = Scaled_Dot_Product_Attention(sentence,10,30)###不同之处
    sentence_rep =  [tf.nn.tanh(tf.keras.layers.Conv1D(kernel_num,i)(sentence)) for i in kernel_size]###[batch_size,  seq_len-kernel_size(i),  kernel_num] *len(kernel_size)
    aspect_rep = tf.keras.layers.Dense(kernel_num)(aspect)###[batch_size,asp_len,kernel_num]
    aspect_rep = tf.keras.layers.GlobalMaxPool1D()(aspect_rep)###[batch_size,kernel_num]
    aspect_rep = tf.expand_dims(aspect_rep,1)
    join_rep = [tf.nn.relu(tf.keras.layers.Conv1D(kernel_num,i)(sentence)+aspect_rep) for i in kernel_size] 
    gate = [i*j for i,j in zip(sentence_rep,join_rep)]
    out = [tf.keras.layers.GlobalMaxPool1D()(i) for i in gate]###[batch_size,kernel_num]*len(kernel_size)
    out = tf.concat(out,1)###[batch_size,kernel_num*len(kernel_size)]
    out = tf.keras.layers.Dense(class_num,activation="softmax")(out)
    return out

实验结果:

下表对比一下GCAE,GCAE_ATT在测试集上的最高准确率

网络结构 测试集精度
GCAE 0.7239
GCAE_ATT 0.7495

我们发现GCAE_ATT由于增加了Transformer 网络中的Scaled Dot-Product Attention层,使得句子特征表达更加充分,提升了网络的性能,而且由于Scaled Dot-Product Attention不是循环递归结构,也不会影响网络的速度方面的性能

结论

Attention 对于文本的表达还是有很好的效果,本次实验通过对句子自身的Scaled Dot-Product Attention提升了模型的准确率,之后我们可以尝试其他更好的attention方式去更充分的提取文本特征,从而提升情感分析任务的精度。

参考文献:
https://spaces.ac.cn/archives/4765
https://blog.csdn.net/qq_41664845/article/details/84969266
Attention Is All You Need
Aspect Based Sentiment Analysis with Gated Convolutional Networks

你可能感兴趣的:(细粒度的情感分析Gated Convolutional Networks——tensorflow实战)