本文思路来源于基于Aspect Level思路的解决方案.
这篇文章的主要目的是记录复现过程中的心得和体会。

训练词向量

预处理

  • 将繁体字转换为简体字,使用了zhconv
  • 去掉停用词
  • 中文分词,使用了jieba分词
  • 去除了标点符号(训练词向量时)

训练词向量

word2vec模型

  • 词向量模型参数如下
model = Word2Vec(sentences, sg=1, size=100, compute_loss=True, window=5, worker=8, iter=8, min_count=2)
  • 字向量模型参数如下
model = Word2Vec(sentences, sg=1, size=100, compute_loss=True, window=10, worker=8, iter=15, min_count=2)

TFIDF特征提取

  • 首先使用TfidfVectorizer()将文本转换为特征矩阵,仅在训练集上面训练
  • 然后使用TruncatedSVD()将上一步中得到的特征矩阵进行降维(80),这一步也是仅仅在训练集上训练
    具体实现可以参考:使用Tfidf和TruncatedSVD做文本主题分析

Aspect选取

这部分作者没有给出源码,我尝试了将Tfidf特征用于LightGBM对每个类别做二分类,得到的结果比较近似,关键源码如下。有点需要指出的是,只使用TF特征貌似也能得到不错的结果,因此可以同时使用两种特征,然后再根据得到的两种结果进行挑选。
根据特征重要性取TopK作为Aspect,(原作者)得到如下结果:

subjects = ['地铁站 地铁 地理位置 位置 公交车 公交车站 公交站','百货 商圈 商场 广场 购物中心 城 商业街','容易 位置 醒目 找到 找 地理位置 显眼','小时 排队 等 排 排号 队 号','态度 服务员 热情 服务态度 老板 服务 服务生','开车 停车费 停车位 停 停车场 车位 泊车','很快 催 慢 速度 分钟 上菜 等','小贵 不贵 价位 原价 块钱 价格 性价比','不划算 物有所值 不值 物美价廉 超值 性价比 实惠','活动 团 霸王餐 代金券 团购 优惠 券','装修 布置 灯光 古色古香 装饰 优雅 情调','安静 环境 装修 氛围 嘈杂 吵闹 音乐','大 宽敞 空间 面积 装修 拥挤 店面','整洁 干净 环境 卫生 苍蝇 不错 脏','吃不完 一份 量 量足 个头 好大 少','入味 吃 不错 味道 好吃 口味 好喝','造型 颜色 精致 卖相 好看 色香味 食欲','推荐 强烈推荐 值得 强推 一试 极力推荐 菜品','好 满意 纪念品 内地 之 肠 灌','还会 机会 再 不会 来 值得 推荐']

模型

小细节

  • 对于长评论不截断,以最长的评论为准
  • 词向量对于未知词使用(−0.01,0.01)(-0.01,0.01)(0.01,0.01)的均匀分布初始化,此处只有一个word2id['<pad>'] = 0.
  • 对于类别不平衡问题对于每个类标加上权重,即数量少的样本被分错了会得到更大的losslossloss,具体实现如下,不直接取倒数是防止数量多的类别的系数太小,即分错误了带来的影响太小。
cost_w = [12, 11, 10, 1000]
cost_w = [11/12, 11/11, 11/10, 11/1000]
# 再softmax
cost_w = softmax(cost_w)
  • 使用了数据增强,即将Train_data:(samples, words)中的某一行中的某些列随机置零。
  • 使用了earlystop,如果连续两次f1score值没有上升则停止训练
  • 记录最优的epoch和sub_epoch(每轮验证三次),保存最近的7个模型,然后进行模型内集成,集成方法是按照对f1score进行计算得到的权重进行加权和
  • 使用了模型间集成

字词向量联合表示

借鉴R-NET(R-NET:MACHINE READING COMPREHENSION WITH SELF-MATCHING NETWORKS)的方法,采用词向量和字向量联合表示。这里是将每个词视为由7个字组成的,不足补零。

例如:奶茶十分好喝词向量表示:[W2V(奶茶),W2V(十分), W2V(好喝)]经过BiRNN的字向量:[BiRNN(,),BiRNN(,), BiRNN (,)]最终向量表示:[Concat(W2V(奶茶), BiRNN(,)), Concat(W2V(十分), BiRNN(,)), Concat(W2V(好喝), BiRNN(,))]

下面详细说明一下数据的流动:

context(bs, len_contex)-embedding->(bs, len_context, edim)context_ch(bs, len_context, len_words)-embedding->(bs, len_context, len_words, edim_ch)-reshape->(bs*len_context, len_words, edim_ch)-biRnn->(bs*len_context, 1, 2*edim_ch)-reshape->(bs, len_context, 2*edim_ch)context = concat(context, context_ch)->(bs, len_context, 2*edim_ch+edim)

aspect可以用类似的方法推导得到。

Model 1

Abstrac

该模型来源于论文Aspect Based Sentiment Analysis with Gated Convolutional Networks。
论文中将基于aspect的情感分析(ABSA)分为两个子任务,一个是aspect-category的(ACSA),一个是aspect-term(ATSA)的。之前的方法大多是基于LSTM和注意力机制取预测相应目标的情感极性,这种方法同城很复杂并且很耗时。本文提出了一个基于卷积神经网络和门控机制的模型,相较于之前的模型更高效并且更准确。首先,新提出的Tanh-ReLU门控单元可以根据给定的aspect和entity有选择性的输出情感特征。这种结构相较于之前的注意力模型更简单。其次,该模型可以在训练的过程中实现并行化。

Model Structure

我们称这种模型为Gated Convolutional network with Aspect Embedding(GCAE)。

Gated Tanh-ReLU Units(GTRU)


上图中的ReLU接受aspect信息来控制情感特征的传播。之后两个门的输出按元素相乘后送入max pooling层。
在每一个位置t都有两个卷积提取特征分别经过不同的门进入后面的max pooling层。下面我们看一下数据流动过程:
ai=relu(Xi:i+k∗Wa+Vava+ba)a_i = relu(X_{i:i+k}*W_a + V_av_a + b_a)ai=relu(Xi:i+kWa+Vava+ba)
si=tanh(Xi:i+k∗Ws+bs)s_i = tanh(X_{i:i+k}*W_s + b_s)si=tanh(Xi:i+kWs+bs)
ci=si×aic_i = s_i \times a_ici=si×ai
其中vav_ava是给定的category的embedding(ACSA)或者是对aspect terms(ATSA)经过另一个CNN卷积得到的。上述公式中,可以理解为sis_isi是用来产生情感特征的,而aia_iai是用来产生指定的aspect的情感特征的。后面的maxpooling和softmax都是常规情况,无须多说明。
目标函数:
L=−∑i∑jyijlogy^ijL = - \sum_i \sum_jy_i^jlog\hat{y}{_i^j}L=ijyijlogy^ij
其中iii为样本的索引,jjj为情感类别的索引。

门控机制

这一部分和我理解有出入,放一段原文内容:

The ReLU gate in Equation 2(ReLUReLUReLU) does not have upper bound on positive inputs but
strictly zero on negative inputs. Therefore, it can output a similarity score according to the relevance between the given aspect information vav_ava and the aspect feature aia_iai at position ttt. If this score is zero, the sentiment features sis_isi would be blocked at the gate; otherwise, its magnitude would be amplified accordingly. The max-over-time pooling further removes the sentiment features which are not significant over the whole sentence

ReLU门的输出对于正面的输入来说没有上界,但是对于负面的输入来说就会变为0.因此可以根据给定的aspect vav_ava和位置ttt处的aspect 特征aia_iai计算一个相似度分数,如果分数为0,则说明情感特征sis_isi会被阻塞;否则,它的值会被相应的放大。之后,时间上的max pooling会进一步移除那些对于整个句子不太重要的情感特征。

GCAE on ATSA

在ACSA中,控制情感特征流动的aspect信息来源于一个aspect单词;然而在ATSA中,这个信息由一个卷积网络在一系列aspect terms[wi,wi+1,...,wi+k][w_i, w_{i+1}, ..., w_{i+k}][wi,wi+1,...,wi+k]上面卷积得到。如下入所示:

作者改进

  • 字词向量联合表示
  • 句子先经过一个单向的 LSTM 再做上图中操作
  • 在最后的线性层之前加了 一个CNN
  • 同时预测 20 个aspect

Model 2

此模型来源于Effective Attention Modeling for Aspect-Level Sentiment Classification.

Abstrac

一个句子中通常会包含很多不同的target,并且对于不同的target,情感极性不一定相同。因此该任务最大的挑战就是如何根据不同的target将他们对应的情感极性分出来。此前,注意力机制在此问题上面得到了SOTA的结果,注意力机制通过对语义信息进行建模然后捕捉每种target对应的重要的语境信息。本文中提出了两种新方法改进注意力机制。首先,提出了一种target representation的方法以便更好的捕捉到观点目标的语义;其次,把语法信息和注意力机制结合得到一种新的注意力方法。

Model Description

Task Definition and Notation

给定一个评论的句子:s=(w1,w2,...wn)s = (w_1, w_2,...w_n)s=(w1,w2,...wn),该句子包含nnn个词。那么它的判定目标应该是sss中的mmm个连续的词组成的sss的一个子序列,表示如下:a=(a1,a2,...am)a =(a_1,a_2,...a_m)a=(a1,a2,...am).aspect-level的情感分析的目标就是对给定的判定目标进行情感极性分析。

Target Representation

之前的工作对于目标地表示无外乎两种,一种是直接把几个词的embedding平均;另一种是使用带注意力机制的LSTM得到一个hidden vectors表示。简单的求均值很难完全捕捉到目标的语义,因此我们使用基于aspect embedding的加权和来表示目标,如下图所示。

上图中,T∈RK×dT\in \mathbb{R}^{K\times d}TRK×d表示aspect embedding,KKK是由使用者自己定义,这个值应该远远小于VVV,个人认为也应该小于ddd,但图中远远小于可能不太合理。计算过程如下所示:
cs=Average(1m∑i=1m,1n∑j=1newj)c_s = Average(\frac 1 m \sum_{i=1}{m}, \frac 1 n \sum_{j=1}^ne_{w_j})cs=Average(m1i=1m,n1j=1newj)
qt=softmax(Wt⋅cs+bt)q_t = softmax(W_t\cdot c_s + b_t)qt=softmax(Wtcs+bt)
ts=TT⋅qtt_s = T^T\cdot q_tts=TTqt
其中eai,ewj,cs,ts∈Rd,Wt∈RK×d,qt∈RKe_{a_i}, e_{w_j}, c_s, t_s\in \mathbb{R}^d, W_t \in \mathbb{R}^{K\times d}, q_t \in \mathbb{R}^Keai,ewj,cs,tsRd,WtRK×d,qtRK
AverageAverageAverage函数返回输入函数的均值,csc_scs可以同时捕捉到目标信息和语境信息。qtq_tqtKKK个aspect embeddings的权重向量,每个权重都表示该目标属于对应的aspect的概率。
我们希望学到的aspect embedding跟我们预训练的词向量空间具有一致性,这样我们就可以从词向量空间中寻找一个和它相近的词来解释它。然而,TTT是随机初始化的,如果我们仅仅训练情感分类器,那么很难得到一致性的结果。因此我们添加了一个无监督的目标函数来确保aspect embedding的质量,这将和基于注意力机制的LSTM联合训练。实际上,我们可以将csc_scstst_sts这几步视为自编码器,我们首先将csc_scs的维度由ddd维约简到K维通过使用softmaxsoftmaxsoftmax非线性函数。这一步后只有和aspect相关的维度被保留在了qtq_tqt中,其他的维度都被去除了。然后我们通过qtq_tqt使用aspect embedding的线性组合重构csc_scs。无监督的目标函数就是最小化重构误差,如下所示:
U(θ)=−∑(s,a)∈Dlog(min(ϵ,CosSim(ts,cs))U(\theta) = -\sum_{(s,a)\in D}log(min(\epsilon, CosSim(t_s, c_s))U(θ)=(s,a)Dlog(min(ϵ,CosSim(ts,cs))
其中,CosSim()CosSim()CosSim()函数用于相似性度量,ϵ\epsilonϵ表示一个非常小的正数。实验中使用了10−710^{-7}107(s,a)(s,a)(s,a)表示句子-目标对。

Syntax-based Attention Mechanism

之前的注意力机制往往认为所有的语境词都是同等重要的,这样就会导致注意力的权重仅仅是目标和语境词相似度的度量。但是,我们知道往往距离目标更近的词或者是修饰目标的词是更重要的,这些词应该获得更高的权重。尤其是在一个句子中有多个目标词的情况下。为了解决这个问题,我们提出了一种编码了句子的语法结构的注意力机制,语法信息来自于句法分析树。如下图所示:

在语法树中,离目标词越近的判定词往往对于确定情感极性耕种。在我们的模型中,我们定义了lll为一个语境词和目标词之间的路径长度。注意力模型根据位置有选择性地选择一个小窗内的语境词,我们使用wswsws来表示注意力窗口大小。并且我们根据距离远近来为窗口内的语境词分配不同的权重。基本原则是距离的越近得到的权重越大。
di={12li−1⋅exp(fscore(hi,ts))ifli∈[1,ws]0otherwised_i=\begin{cases} \frac 1 {2^{l_i-1}}\cdot exp(f_{score}(h_i,t_s)) &amp; if l_i \in [1, ws] \\ 0 &amp; otherwise \end{cases}di={2li11exp(fscore(hi,ts))0ifli[1,ws]otherwise

pi=di∑jdjp_i = \frac {d_i} {\sum_j d_j}pi=jdjdi
fscore(hi,ts)=tanh(hiT⋅Wa⋅ts)f_{score}(h_i, t_s) = tanh(h_i^T \cdot W_a \cdot t_s)fscore(hi,ts)=tanh(hiTWats)
其中,Wa∈Rd×dW_a \in \mathbb{R}^{d \times d}WaRd×d是一个可以训练的权重矩阵。

Overall Architecture and Training Objective

基于注意力机制的LSTM这一部分的损失函数如下:
J(θ)=−∑(s,a)∈D∑c∈CPs,ag(c)log(Ps,a(c))J(\theta)=-\sum_{(s,a)\in D}\sum_{c\in C}P_{s,a}^g(c)log(P_{s,a}(c))J(θ)=(s,a)DcCPs,ag(c)log(Ps,a(c))
其中CCC是所有情感类别的集合,P(s,a)g(c)P_{(s,a)}^g(c)P(s,a)g(c)000111,表示ccc是否是(s,a)(s,a)(s,a)的正确分类,而Ps,a(c)P_{s,a}(c)Ps,a(c)是预测(s,a)(s,a)(s,a)属于ccc类的概率。
TTT中的aspect embedding在训练过程中不iii同的aspect可能会很相似,为了确保不同aspect之间的差异性,我们定义了一个正则化项来确保这种差异性:
R(θ)=∣∣(Tnorm⋅TnormT−I)2∣∣R(\theta) = ||(T_{norm}\cdot T_{norm}^T-I)^2||R(θ)=(TnormTnormTI)2
这里面III是单位矩阵,TnormT_{norm}TnormTTTL2L_2L2归一化,∣∣∣∣|| ||表示矩阵中所有entries的和。当任意两个不同aspect embedding的点积为000的时候R最小(显然∣∣Ti∣∣2=1||T_i||_2 = 1Ti2=1)。因此,正则化项最终可以使得TTT的行之间正交,这就放置了aspect之间存在冗余。
最终的目标函数可以定义为:
L(θ)=J(θ)+λuU(θ)+λrR(θ)L(\theta)=J(\theta)+\lambda_uU(\theta)+\lambda_rR(\theta)L(θ)=J(θ)+λuU(θ)+λrR(θ)

结果分析

  • 基于语法的注意力机制带来的好处:更容易找到那些修饰target的词
  • Target Representation
    简单的平均target的向量难以捕捉到所有目标的正确的语义,因为在词向量空间中目标表示可能距离food-related(or others)很远。但在我们提出的方法中能够根据给定的targets捕捉到正确的aspect语义,因此注意力机制可以结合aspect语义捕捉到正确的观点语境。
    除此之外,论文提出的target representation方法在训练完成后还可以输出aspect embedding,即可以把输入的target映射到到一个aspect。但是论文中作者并没有进行相关的实验。

作者改进

  • 字词向量联合表示
  • 在最后的线性层之前加了 一个CNN
  • 同时预测 20 个aspect

模型融合

模型内融合

对于每一个模型都有一个f1score值,假设我们由5个模型,计算方法如下:

f1_score_list = [0.71, 0.69, 0.701, 0.705, 0.689]
f1_score_list *= 200
w = softmax(f1_score_list)

softmax之前先进行缩放:

  • 如果是放大一个倍数,则差异被放大,之后再softmax中会更明显,大的更大,小的更小。
  • 如果是缩小一个倍数,则差异被缩小,这样就会使得大的概率被缩小,小的概率被放大来以达到减小差异的效果。

多模型融合

实现类似于单模型融合。

待解决的问题

  • 第二个模型的实现

Al_challenger_2018_sentiment_analysis_top17_基于Aspect Level思路的解决方案相关推荐

  1. #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 关键词: 监控 .dashboard.PHP.graphite.statsd.whisper.carbon.grafana.i ...

  2. 单例设计模式-静态内部类-基于类初始化的延迟加载解决方案及原理解析

    刚刚线程1看不到线程0的重排序,我们创建一个类,这个方案是使用静态内部类来解决,一会我们也会分析一下原理,我们创建一个静态内部类,静态内部类的代理模式,JVM在类的初始化阶段,也就是class被加载后 ...

  3. RBAC(Role-Based Access control)权限模型--基于角色的权限分配解决方案

    一.背景 为了达成不同的帐号登陆系统后能看到不同的页面,能执行不同的功能的目标,我们有很多种解决方案,RBAC(Role-Based Access control)权限模型 ,也就是基于角色的权限分配 ...

  4. Deep Mask Memory Network with Semantic Dependency and Context Moment for Aspect Level Sentiment Clas

    这篇博文是Deep Memory Network在Aspect Based Sentiment方向上的应用的一部分,如果你已经熟知深度记忆网络并且看过其在ABSA的应用,只想看这篇论文,可以跳过直接阅 ...

  5. 基于云ESB的API解决方案

    随着云计算技术的不断发展,信息化上云是大势所趋,随着当前SaaS.IaaS越来越成熟之际,PaaS将是主要发力点.AEAI ESB云服务总线是在基于K8S云管理平台(UMC)部署的数通畅联iPaaS云 ...

  6. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    构建一个基本的前端自动化开发环境 -- 基于 Gulp 的前端集成解决方案(四) 参考文章: (1)构建一个基本的前端自动化开发环境 -- 基于 Gulp 的前端集成解决方案(四) (2)https: ...

  7. REST API 基于ACCESS TOKEN 的权限解决方案

    REST API 基于ACCESS TOKEN 的权限解决方案 参考文章: (1)REST API 基于ACCESS TOKEN 的权限解决方案 (2)https://www.cnblogs.com/ ...

  8. 基于FastJson的通用泛型解决方案

    基于FastJson的通用泛型解决方案 参考文章: (1)基于FastJson的通用泛型解决方案 (2)https://www.cnblogs.com/scy251147/p/9451879.html ...

  9. 氮化镓 服务器电源管理系统报价,基于氮化镓的电源解决方案总体拥有成本评估...

    引言 近年来,电信市场正在朝云计算的方向转变,这导致超大规模数据中心空前快速的增长,而每个机架需要处理的功能也越来越多. 反过来,这种趋势也意味着对功率的需求快速增加,而重点则是采用消耗更少电力的更高 ...

最新文章

  1. python入门(13)获取函数帮助和调用函数
  2. oracle将一个表中字段的值赋值到另一个表中字段(批量)
  3. 如何进行良好的程序设计(1)
  4. 发送请求_发送soap请求调用WSDL
  5. CF Gym102059 H. Fractions
  6. 链表竟然比数组慢了1000多倍?(动图+性能评测)
  7. 数论及Python实践
  8. Server.ScriptTimeOut,Response.IsClientConnected
  9. mysql插入汉子1366_mysql 向列表中添加漢字錯誤 1366
  10. windows环境下安装selenium
  11. win7打补丁显示不适用计算机,更新win7系统提示“此更新不适用于您的计算机”如何解决...
  12. 技术研发团队管理计划方案书
  13. java 压力测试_记一次完整的java项目压力测试
  14. 当前默认服务器维护尚未完成,更新公告 | 7月11日早8点停服维护
  15. SQL Server选择题40个
  16. F5负载均衡器通过iRules实现http应用的灵活转发
  17. Extracting and Composing Robust Features with Denoising Autoencoders论文笔记
  18. dac 矩形波函数c语言,使用DAC接口生成矩形波
  19. inet_csk_get_port(...)
  20. WebRTC错误[1]Failed to set remote answer sdp: Called in wrong state: stable

热门文章

  1. 数学基础_设随机变量X1,X2,…Xn相互独立,且都服从(0,θ)上的均匀分布。求U=max{X1,X2,…Xn}数学期望
  2. 黑马程序员—[Android就业薪资] Android28期,毕业60天,就业率96.15%,平均薪水9378元!
  3. 新研究发现:太平洋上仅存的冰川将很快融化
  4. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格
  5. Hdu 5445 Food Problem 多重背包
  6. sql server查询分析器的一个选项...
  7. html把一张图片动态的代码,原神:4张动态图演示168皮肤琴的实机效果,三种玩家可入手...
  8. Websocket-sharp重连机制解决方案
  9. 编译原理课程实践——实现一个初等函数运算语言的解释器或编译器
  10. Python中去除html中的标签,css(style样式)