当前位置:   article > 正文

自然语言处理NLP——文本分类之模型建立_自建一个自然语言处理模型

自建一个自然语言处理模型

一、朴素贝叶斯分类器

朴素贝叶斯分类器是在属性条件独立性假设下,基于贝叶斯定理的有监督的机器学习算法。假设分类变量为 y y y,样本特征向量为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,则
P ( y ∣ x 1 , . . . , X n ) = P ( y ) P ( x 1 , . . . , x n ∣ y ) P ( x 1 , . . . , x n ) P(y|x_1,...,X_n)=\frac{P(y)P(x_1,...,x_n|y)}{P(x_1,...,x_n)} P(yx1,...,Xn)=P(x1,...,xn)P(y)P(x1,...,xny)
基于属性条件独立性假设,上式可写为:
P ( y ∣ x 1 , . . . , x n ) = P ( y ) ∏ i = 1 n P ( x i ∣ y ) P ( x 1 , . . . , x n ) P(y|x_1,...,x_n)=\frac{P(y)\prod_{i=1}^nP(x_i|y)}{P(x_1,...,x_n)} P(yx1,...,xn)=P(x1,...,xn)P(y)i=1nP(xiy)
使用最大后验估计来估计后验概率 P ( y ∣ x 1 , . . . , x n ) P(y|x_1,...,x_n) P(yx1,...,xn),由于 P ( x 1 , . . . , x n ) P(x_1,...,x_n) P(x1,...,xn)相对于 y y y来说是独立的,可以忽略 P ( x 1 , . . . , x n ) P(x_1,...,x_n) P(x1,...,xn),因此贝叶斯判定准则为
y ^ = arg max ⁡ y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \hat{y}=\argmax_{y}P(y)\prod_{i=1}^nP(x_i|y) y^=yargmaxP(y)i=1nP(xiy)
朴素贝叶斯分类器是利用训练集D来估计先验概率 P ( y ) P(y) P(y) P ( x i ∣ y ) P(x_i|y) P(xiy)。假设样本独立同分布,那么先验概率
P ( y ) = ∣ D y ∣ ∣ D ∣ P(y)=\frac{|D_y|}{|D|} P(y)=DDy
其中|D_y|表示训练集D中分别为 y y y的样本的集合。
假设 P ( x i ∣ y ) ∼ N ( μ y , i , σ y , i ) P(x_i|y)\sim N(\mu_{y,i},\sigma_{y,i}) P(xiy)N(μy,i,σy,i),其中 μ y , i \mu_{y,i} μy,i σ y , i \sigma_{y,i} σy,i分别是第 y y y类样本在第 i i i个属性上的均值、方差。则,
P ( x i ∣ y ) = 1 2 π σ y 2 e x p ( − ( x i − μ y ) 2 2 σ y 2 ) P(x_i|y)=\frac{1}{\sqrt{2\pi\sigma_y^2}}exp(-\frac{(x_i-\mu_y)^2}{2\sigma_y^2}) P(xiy)=2πσy2 1exp(2σy2(xiμy)2)
使用高斯朴素贝叶斯分类器的代码如下:

from sklearn.naive_bayes import GaussianNB
nb=GaussianNB()
nb.fit(train_X,train_y)
print('acc=','%.2f%%'%(nb.score(test_X,test_y)*100))
  • 1
  • 2
  • 3
  • 4

二、支持向量机

支持向量机是一种有监督的机器学习算法。其基本思想是将低维的样本空间的线性不可分问题转化为更高维样本空间的线性可分问题。支持向量机通过找到使得不同类别的样本在高维样本空间中具有最大间隔的超平面来解决分类问题。超平面方程如下:
w T x + b = 0 w^Tx+b=0 wTx+b=0
其中 w = ( w 1 ; w 2 ; . . . ; w d ) w=(w_1;w_2;...;w_d) w=(w1;w2;...;wd)为超平面的法向量,决定超平面的方向; b b b为偏移项,决定超平面与原点的距离。
假设样本特征向量为 x i ∈ R , i = 1 , . . . , n x_i \in R,i=1,...,n xiR,i=1,...,n,样本标签为 y ∈ { 1 , − 1 } y \in \{1, -1\} y{1,1},支持向量机的原问题为:
min ⁡ w , b 1 2 w T w \min_{w,b}\frac{1}{2}w^Tw w,bmin21wTw
s . t . y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , . . . , m s.t. y_i(w^Tx_i+b) \geq 1,i=1,2,...,m s.t.yi(wTxi+b)1,i=1,2,...,m

三、决策树

决策树是一种非参数的有监督学习算法。决策树可以用来处理分类和回归问题。本文利用决策树对上市公司公告进行分类。决策数的训练过程就是根据训练数据生成一颗具备良好泛化性能的决策树的过程。生成决策树的基本流程如下:

输入: 训练集 D = { ( x 1 , y 1 ) , ( X 2 , y 2 ) , . . . , ( x m , y m ) } D=\left\{(x_1,y_1),(X_2,y_2),...,(x_m,y_m)\right\} D={(x1,y1),(X2,y2),...,(xm,ym)}
    属性集 A = a 1 , a 2 , . . . , a d A={a_1,a_2,...,a_d} A=a1,a2,...,ad
过程: 函数: T r e e G e n e r a t e ( D , A ) TreeGenerate(D,A) TreeGenerate(D,A)
生成节点node;
if D中样本全部属于同一类别C then
  将node标记为C类叶节点;return
end if
从A中选择最优划分属性 a ∗ a_* a;
for a ∗ a_* a的每一个值 a ∗ v a_*^v av do
  为node生成一个分支;令 D v D_v Dv表示 D D D中在 a ∗ a_* a上取值为 a ∗ v a_*^v av的样本子集;
  if D v D_v Dv为空 then
    将分支节点标记为叶节点,其类别标记为D中样本最多的类;return
  else
    以 T r e e G e n e r a t e ( D v , A \ a ∗ ) TreeGenerate(D_v,A\backslash {a_*}) TreeGenerate(Dv,A\a)为分支节点
  end if
end for
输出: 以node为根结点的决策树
生成决策树的关键在于如何选择最优划分属性,最优的划分属性即是能够使得当前样本集合 D D D最快变纯的属性。本文采用CART决策树学习算法,CART算法是Classification and Regression的缩写,该算法使用基尼指数来选择最优划分属性。假设属性 a a a V V V个可能的取值 { a 1 , a 2 , . . . , a V } \left\{a^1,a^2,...,a^V \right\} {a1,a2,...,aV},则使用属性 a a a对样本集合 D D D进行划分,得到 V V V个分支节点,设第 v v v个分支节点中的样本集合为 D v D^v Dv,当前样本集合中属性 a a a的基尼指数公式如下:
G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini\_index(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|}Gini(D^v) Gini_index(D,a)=v=1VDDvGini(Dv)
其中, G i n i ( D v ) Gini(D^v) Gini(Dv)是基尼值,用来度量样本集合 D v D^v Dv的纯度。其公式如下:
G i n i ( D ) = 1 − ∑ k p k 2 Gini(D)=1-\sum_{k}p_k^2 Gini(D)=1kpk2
其中 p k p_k pk为当前样本集合 D D D中第 k k k类样本所占的比例。
基尼值反映了当前样本集合中随机抽取两个样本,其类别标记不一致的概率,基尼值越小,则样本集合 D D D的纯度越高。基尼指数是度量使用属性值a对样本集合进行划分前后的纯度提升量。基尼指数越小,杨本集合的纯度提升越大。设候选属性集合为 A A A,则最优划分属性:
a ∗ = arg min ⁡ a ∈ A G i n i _ i n d e x ( D , a ) a_*=\argmin_{a \in A} Gini\_ index(D,a) a=aAargminGini_index(D,a)
使用决策树分类器的代码如下:

from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(train_X,train_y)
print('acc=','%.2f%%'%(dtc.score(test_X,test_y)*100))
  • 1
  • 2
  • 3
  • 4

四、随机森林

随机森林是以决策树为基分类器的集成学习算法。该算法在通过同时生成 N N N棵独立的决策树,且在决策树的训练过程中引入了随机属性选择,最后通过投票法决定分类的结果,即少数服从多数。该算法在决策树的基础上,通过引入样本扰动和属性扰动来提升模型的泛化性能。本文生成了100颗相互独立的决策树,并使用投票法得出最终夺得分类结果。随机森林的代码如下:

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import balanced_accuracy_score,f1_score
forrest=RandomForestClassifier(
    n_estimators=100,
    n_jobs=8,
    random_state=26366,
    #class_weight="balanced")
forrest.fit(train_X,train_y)
print('acc=','%.2f%%'%(forrest.score(test_X,test_y)*100))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

五、卷积神经网络

卷积神经网络(Convolutional neural Network,简称CNN)是一种采取权重共享策略的有监督深度学习算法。其结构主要包括卷积层和采样层。每个卷积层由多个特征映射(feature map)构成,每个特征映射通过滤波器(filter)提取上一层的局部特征得到;采样层又叫池化(pooling)层,其作用是对卷积层得到的特征映射进行亚采样。本文使用卷积神经网络提取文本的特征,输入不定长的向量序列,通过卷积层使用多个不同大小的卷积滤波器得到多个特征映射,并针对这些特征映射作时间维度上的最大池化。

六、深层长短期记忆网络

长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种加入了记忆单元 c c c、输入门 i i i、遗忘门 f f f及输出门 o o o的循环神经网络,这些门和记忆单元的加入避免了循环神经网络在训练过程中容易出现梯度消失或梯度爆炸的现象,能更好的处理长序列文本。
h t = F ( x t , h { t − 1 } ) h_t=F(x_t,h_{\{t-1\}}) ht=F(xt,h{t1})
i t = σ ( W x i x t + W h i h t − 1 + W c i c t − 1 + b i ) i_t=\sigma (W_{xi}x_t+W_{hi}h_{t-1}+W_{ci}c_t-1+b_i) it=σ(Wxixt+Whiht1+Wcict1+bi)
f i = σ ( W x i x t + W h f h t − 1 + W + c f c t − 1 + b f ) f_i=\sigma (W_{xi}x_t+W_{hf}h_{t-1}+W+{cf}c_{t-1}+b_f) fi=σ(Wxixt+Whfht1+W+cfct1+bf)
c t = f t ⊙ c t − 1 + i t ⊙ tanh ⁡ ( W h c h t − 1 + b c ) c_t=f_t \odot c_{t-1}+i_t \odot \tanh(W_{hc}h_{t-1}+bc) ct=ftct1+ittanh(Whcht1+bc)
o t = σ ( W x o x t + W h o c t + b o ) o_t=\sigma (W_{xo}x_t+W_{ho}c_t+b_o) ot=σ(Wxoxt+Whoct+bo)
h t = o t ⊙ t a n h ( c t ) h_t=o_t \odot tanh(c_t) ht=ottanh(ct)
其中, x t x_t xt是文本序列第t时刻的词向量, h t − 1 h_{t-1} ht1为t-1时刻隐藏层的状态值, c t c_t ct为记忆单元, i t i_t it为输入门,控制输入记忆单元的强度, f t f_t ft遗忘门,控制记忆单元维持上一时刻值的强度, o t o_t ot为输出门,控制输出记忆单元的强度, σ \sigma σ为sigmoid激活函数,W为隐藏层到隐藏层的权重矩阵, b h b_h bh为隐藏层的偏置矩阵, ⊙ \odot 为逐元素乘法操作, tanh ⁡ \tanh tanh为双曲正切函数。

七、多头自注意力机制网络

基于点积并进行了缩放的多头自注意力机制网络通过计算词向量之间的相似度(点积)来学习词向量之间的相关性,即学习每个词上下文语境,再通过两层全连接神经网络,将学到的含有上下文语境的词向量序列表示到固定的特征空间中,最后通过softmax得到分类为不同类别的概率分布。自注意力机制的基本思路是将输入的词向量序列通过三个不同的权重矩阵得到 Q , K , V Q,K,V Q,K,V三个矩阵,其中 Q Q Q称为查询矩阵, K 和 V K和V KV是键值对, Q Q Q与不同的 K K K的乘积之和作为 K K K对应的 V V V的权重。多头是指将词向量序列矩阵,在词向量纬度上均分为多个不同的词向量序列矩阵,然后分别计算词向量之间的相似度,通过基于点积的自注意力网络层之后再将其合并,最后传入接下来的全连接神经网络。基于点积的多头自注意力机制的公式如下:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) MultiHead(Q,K,V)=Concat(head_1,...,head_h) MultiHead(Q,K,V)=Concat(head1,...,headh)
其中, h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt d_k})V Attention(Q,K,V)=softmax(d kQKT)V

八、ERNIE

由百度开发的预训练模型。使用少量数据就能够达到很好的效果。本人使用ernie训练了多标签文本分类模型。一千条数据通过三次迭代准确率达到了78.5%。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/397539
推荐阅读
相关标签
  

闽ICP备14008679号