大数据,机器学习,人工智能大数据自然语言处理—学习

细粒度的情感分析Gated Convolutional Netw

2019-02-26  本文已影响2人  王同学死磕技术

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

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

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

ABAS任务简介

ABAS有两个子任务:

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主要前向网络的流程如下图所示:

此网络的优点是摆脱了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

上一篇 下一篇

猜你喜欢

热点阅读