NLP中情感分析是一个比较常见的任务,涉及文本的情感特征提取、情感特征分类、情感特征检索与归纳等方面。
基于情感特征进行分类的方法主要有:
1.基于情感词典的方法
项目详见GitHub:https://github.com/SoulDGXu/Sentiment-Analysis-Chinese-pytorch
以下是一些我们最常用的的用于试验情绪分析和机器学习方法的情绪分析数据集。 它们开源且可以免费下载 。
产品评论: 此数据集包含数百万亚马逊客户评论,星级评级,对培训情绪分析模型非常有用。(https://www.kaggle.com/bittlingmayer/amazonreviews )
餐饮评论:此数据集包含5,2百万条评论星级的Yelp评论。( https://www.kaggle.com/yelp-dataset/yelp-dataset)
电影评论:此数据集包含1,000个正面和1,000个负面处理评论。 它还提供5,331个正面和5,331个负面处理句子/片段。( http://www.cs.cornell.edu/people/pabo/movie-review-data/)
精美食品评论:此数据集包含来自亚马逊的约500,000份食品评论。 它包括产品和用户信息,评级以及每个评论的纯文本版本。( https://www.kaggle.com/snap/amazon-fine-food-reviews)
Kaggle上Twitter对航空公司的评论:该数据集包含约15,000条有关航空公司的标签推文(正面,中性和负面)。( https://www.kaggle.com/crowdflower/twitter-airline-sentiment)
第一次共和党辩论Twitter情绪:这个数据集由关于2016年第一次共和党辩论的大约14,000条标记的推文(正面,中立和负面)组成。( https://www.kaggle.com/crowdflower/first-gop-debate-twitter-sentiment)
在Seq2Seq(Encoder-Decoder)模型中,Encoder编码器的作用是把一个不定长的输入序列 x 1 , x 2 , … , x T x_1,x_2,\dots,x_T x1,x2,…,xT变换成一个定长的背景变量 c = q ( h 1 , h 2 , … , h T ) c=q(h_1,h_2,\dots,h_T) c=q(h1,h2,…,hT),并在该背景变量中编码输入序列 x 1 , x 2 , … , x T x_1,x_2,\dots,x_T x1,x2,…,xT的信息。给定训练样本中的输出序列 y 1 , y 2 , … , y T ′ y_1,y_2,\dots,y_{T'} y1,y2,…,yT′,对每个时间步 t ′ t' t′,Decoder解码器输出 y t ′ y_{t'} yt′的条件概率将基于之前输出序列 y 1 , y 2 , … , y t ′ y_1,y_2,\dots,y_{t'} y1,y2,…,yt′和背景变量 c c c,即 P ( y t ′ ∣ y 1 , y 2 , … , y t ′ − 1 , c ) P(y_{t'}|y_1,y_2,\dots,y_{t'-1},c) P(yt′∣y1,y2,…,yt′−1,c)。
attention机制通过对Decoder编码器所有时间步的隐藏状态做加权平均来得到背景变量。Decoder在每一时间步调整这些权重,即注意力权重,从而能够在不同时间步分别关注输入序列中的不同部分并编码进相应时间步的背景变量。
加入attention机制后,Decoder每一时间步可以使用可变的背景变量 c t ′ c_{t'} ct′。Encoder在时间步 t t t的隐藏状态为 h t h_t ht,且总时间步数为 T T T,Decoder在时间步 t ′ t' t′的背景变量为所有Encoder隐藏状态的加权平均:
c t ′ = ∑ t = 1 T α t ′ t h t c_{t'}=\sum_{t=1}^{T}\alpha_{t't}h_t ct′=t=1∑Tαt′tht
给定 t ′ t' t′,权重 α t ′ t \alpha_{t't} αt′t在 t = 1 , … , T t=1,\dots,T t=1,…,T的值是一个概率分布。为了得到概率分布,可以使用softmax运算:
α t ′ t = e x p ( e t ′ t ) ∑ k = 1 T e x p ( e t ′ k ) , t = 1 , … , T \alpha_{t't}=\frac{exp(e_{t't})}{\sum_{k=1}^{T}exp(e_{t'k})},t=1,\dots,T αt′t=∑k=1Texp(et′k)exp(et′t),t=1,…,T
现在,我们需要定义如何计算上式中softmax运算的输入 e t ′ t e_{t't} et′t,由于 e t ′ t e_{t't} et′t同时取决于Decoder的时间步 t ′ t' t′和Encoder的时间步 t t t,不妨以Decoder在时间步 t ′ − 1 t'-1 t′−1的隐藏状态 s t ′ − 1 s_{t'-1} st′−1与Encoder在时间步 t t t的隐藏状态 h t h_{t} ht为输入,并通过函数a计算 e t ′ t e_{t't} et′t:
e t ′ t = a ( s t ′ − 1 , h t ) e_{t't}=a(s_{t'-1},h_t) et′t=a(st′−1,ht)
函数a有多种选择,如果两个输入向量长度相等,可以取內积 a ( s , h ) = s T h a(s,h)=s^Th a(s,h)=sTh。而最早提出注意力机制的论文则将输入连结后通过含单隐藏层的多层感知机变换:
a ( s , h ) = v T t a n h ( W s s + W h h ) a(s,h)=v^Ttanh(W_ss+W_hh) a(s,h)=vTtanh(Wss+Whh)
其中 v v v、 W s W_s Ws、 W h W_h Wh都是可以学习的模型参数。
这里会给一个情感分类的例子,使用的是BiLSTM+Attention的Seq2Seq模型。
项目详见GitHub:https://github.com/SoulDGXu/Sentiment-Analysis-Chinese-pytorch
利用深度学习来解决情感分类问题,最重要的是考虑如何语义表征/如何融合信息,至于分类,其实很简单,一个线性层即可。
Pipeline流程:
注意:model保存为state_dict形式更好,重载model框架以及存在state_dict里的参数更稳定,不受pytorch和其他package的版本影响。
关于数据:
关于代码:
关于运行:
运行示例:
Sentiment_Analysis_main.py运行效果:
Sentiment_Analysis_eval.py运行效果:
文本情感分析方法小结 LeonG ( https://zhuanlan.zhihu.com/p/106588589)
Chineses-Sentiment Analysis-Pytorch :李狗嗨
(https://github.com/Ligouhai-bigone/Sentiment-Analysis-Chinese-pytorch)
Recall . Precision
(https://www.zhihu.com/question/19645541/answer/91694636)
Bilstm+attention(https://www.cnblogs.com/jiangxinyang/p/10208227.html)
Lstm (https://zybuluo.com/hanbingtao/note/581764)