自然语言处理导论(张奇)——分词
分词方法
条件随机场 CRF(Conditional Random Field)
条件随机场试图对多个变量在给定观测值后的条件概率进行建模。条件随机场的目标是构建条件概率
P
(
y
∣
x
)
P(y|x)
P(y∣x)模型。在中文分词任务中,观察序列对应输入的字序列
{
c
1
,
c
2
,
⋯
,
c
n
}
\{c_1,c_2,\cdots,c_n\}
{c1,c2,⋯,cn},标记序列为每个字对应的BIES标签。在实际应用中,对序列任务进行建模的时候,通常使用如下图所示练市结构,即线性链条件随机场。
条件随机场使用势函数和图结构上的团来定义条件概率
P
(
y
∣
x
)
P(y|x)
P(y∣x)。给定观测序列x,线性链条件随机场主要包含两种关于标记变量的团:单个标记变量
y
i
y_i
yi和相邻的标记变量
y
i
−
1
,
y
i
y_{i-1},y_i
yi−1,yi。选用指数势函数并引入特征函4数,条件概率则定义为:
P
(
y
∣
x
)
=
1
Z
(
x
)
e
x
p
(
∑
j
∑
i
=
2
n
λ
j
t
j
(
x
,
y
i
,
y
i
−
1
,
i
)
+
∑
k
∑
i
=
1
n
μ
k
s
k
(
x
,
y
i
,
i
)
)
P(y|x)=\frac{1}{Z(x)}exp(\sum_{j}\sum_{i=2}^{n}\lambda_jt_j(x,y_i,y_i-1,i)+\sum_k\sum_{i=1}^{n}\mu_ks_k(x,y_i,i))
P(y∣x)=Z(x)1exp(j∑i=2∑nλjtj(x,yi,yi−1,i)+k∑i=1∑nμksk(x,yi,i))
Z
(
x
)
=
∑
y
e
x
p
(
∑
j
∑
i
=
2
n
λ
j
t
j
(
x
,
y
i
,
y
i
−
1
,
i
)
+
∑
k
∑
i
=
1
n
μ
k
s
k
(
x
,
y
i
,
i
)
)
Z(x)=\sum_yexp(\sum_{j}\sum_{i=2}^{n}\lambda_jt_j(x,y_i,y_i-1,i)+\sum_k\sum_{i=1}^{n}\mu_ks_k(x,y_i,i))
Z(x)=y∑exp(j∑i=2∑nλjtj(x,yi,yi−1,i)+k∑i=1∑nμksk(x,yi,i))
其中,
t
j
(
x
,
y
,
y
i
−
1
,
i
)
t_j(x,y,y_i-1,i)
tj(x,y,yi−1,i)是特征转移函数,用于刻画相邻标记之间的相关关系以及观测序列对它们的影响。
s
(
x
,
y
i
,
i
)
s(x,y_i,i)
s(x,yi,i)是状态特征函数,用于刻画观测序列对标记变量的影响。
Z
(
x
)
Z(x)
Z(x)为规范化因子,在所有可能的输出序列上进行求和,确保第一个公式是正确定义的概率。通常转移特征函数
t
J
t_J
tJ和状态特征函数
s
k
s_k
sk的取指为0或1,当满足特征条件的时候取指为1,否则为0.线性链式条件随机场完全由特征函数
t
j
,
s
k
t_j,s_k
tj,sk以及其对应的参数
λ
j
\lambda_j
λj和
μ
k
\mu_k
μk决定。
针对中文分词任务,典型的转移特征如下:
t
j
(
x
,
y
i
,
y
i
−
1
,
i
)
=
1
t_j(x,y_i,y_{i-1},i)=1
tj(x,yi,yi−1,i)=1
if
x
i
=
"
a
"
x_i="a"
xi="a" or
y
i
=
"
b
"
y_i="b"
yi="b" or
y
i
−
1
=
"
c
"
y_{i-1}="c"
yi−1="c"
表示当第i个观测值为a时,相应的标记
y
i
y_i
yi和
y
i
−
1
y_{i-1}
yi−1很可能分别为B和E。
如何设计有效的特征函数对于标注任务是至关重要的。针对中文分词问题,可以使用模板的方式从当前字的上下文中构建特征。
基于感知机的中文分词方法
中文分词可以定义为将连续子序列转换为对应的词序列的过程。
F
(
x
)
F(x)
F(x)表示最优分词结果。
F
(
x
)
=
arg max
y
∈
G
E
N
(
x
)
S
C
O
R
E
(
y
)
F(x)=\argmax_{y \in GEN(x)} SCORE(y)
F(x)=argmaxy∈GEN(x)SCORE(y)
GEN(x)代表对于每个输入句子x可能的所有候选输出,SCORE(y)为针对分词结果的评分函数。
基于感知机中文分词方法,将每一个分词后的单词序列定义为一个特征向量
Φ
(
x
,
y
)
\Phi(x,y)
Φ(x,y),其中d代表模型中的特征数量,评分函数
S
C
O
R
E
(
y
)
SCORE(y)
SCORE(y)为:
S
C
O
R
E
(
y
)
=
Φ
(
x
,
y
)
⋅
α
SCORE(y)=\Phi(x,y)\cdot\alpha
SCORE(y)=Φ(x,y)⋅α
。
词序列预测
在给定输入序列的情况下,如何输出最优词序列,即模型解码算法。
每一个句子都有数量极其庞大的候选分词结果,如果将所有可能的结果都枚举一遍的话,搜索空间将变得非常巨大。故我们常采用集束搜索。
集束搜索:限制搜索空间的启发式算法。在每一步解码的过程中,从上一步解码的所有候选集中选取前K个得分最高的结果继续解码,而舍弃得分排在第K名之后的所有结果。
算法思路:针对输入的句子,解码器每次读入一个字,根据每次读入的字,每次采用两种方式进行评分,分别为:1.将字作为下一个新词的开始 2.将字作为上一个词的一部分。然后保留得分最高的K个候选分词结果。
模型参数学习:在给定语料的时候,调整参数
α
\alpha
α,使其能得到很好的分词结果。
模型根据模型参数解码得到分词结果,与正确答案对比,错了就更新
α
\alpha
α,同时,可以采用平均感知器来避免训练过程中的过拟合问题。
特征定义:给定输入序列
x
x
x和分词后的词序列
y
y
y,如何定义特征对词序列进行描述,并能区分分词序列的优劣。即构建
Φ
(
x
,
y
)
\Phi(x,y)
Φ(x,y)。
与CRF对比 :基于感知机的方法可以使用词作为特征,而基于线性链条件随机场的方法只能使用字作为特征。
基于双向长短期记忆神经网络的中文分词方法
RNN相较于前馈神经网络等要求固定输入长度的神经网络结构而言,更适用于处理长度不固定的序列数据。长短期记忆神经网络是循环神经网络的一个变体,可以在一定程度上缓解简单循环神经网络的梯度消失和梯度爆炸问题。
LSTM循环单元结构如下图所示:
网络引入了新的内部状态
c
i
c_i
ci,专门用于进行信息传递。此外LSTM网络还引入了门控机制来控制信息传递路径。通过遗忘门
f
i
f_i
fi控制上一个时刻的内部状态
c
t
−
1
c_{t-1}
ct−1需要遗忘多少信息。输入门
i
t
i_t
it用来控制当前时刻的候选状态
c
t
c_t
ct有多少信息需要保存。输出门
o
t
o_t
ot控制当前时刻内部状态
c
t
c_t
ct有多少信息需要输出给外部状态
h
t
h_t
ht。
输入门、输出门、遗忘门计算公式为:
i
t
=
σ
(
W
i
x
i
+
U
i
h
t
−
1
+
b
i
)
i_t=\sigma(W_ix_i+U_ih_{t-1}+b_i)
it=σ(Wixi+Uiht−1+bi)
f
t
=
σ
(
W
f
x
i
+
U
f
h
t
−
1
+
b
f
)
f_t=\sigma(W_fx_i+U_fh_{t-1}+b_f)
ft=σ(Wfxi+Ufht−1+bf)
o
t
=
σ
(
W
o
x
i
+
U
o
h
t
−
1
+
b
o
)
o_t=\sigma(W_ox_i+U_oh_{t-1}+b_o)
ot=σ(Woxi+Uoht−1+bo)
其中
σ
\sigma
σ为Logistic函数。候选状态、内部状态以及隐藏输出通过如下公式计算。
c
t
~
=
t
a
n
h
(
W
c
x
t
+
U
c
h
t
−
1
+
b
c
)
\widetilde{c_t}=tanh(W_cx_t+U_ch_{t-1}+b_c)
ct
=tanh(Wcxt+Ucht−1+bc)
c
t
=
f
t
⨂
c
t
−
1
+
i
t
⨂
c
t
~
c_t=f_t\bigotimes c_{t-1}+i_t \bigotimes \widetilde{c_t}
ct=ft⨂ct−1+it⨂ct
h
t
=
o
t
⨂
t
a
n
h
(
)
c
t
h_t=o_t \bigotimes tanh()c_t
ht=ot⨂tanh()ct
双向长短期记忆神经网络
在自然语言处理的很多任务中,一个时刻的输出不但与过去某个时刻的信息相关,也与后续时刻的信息相关。
BILSTM是由两层长短期记忆神经网络组成,它们的结构相同但是信息传递的方向不同。双向长短期记忆神经网咯还可以结合条件随机场,更有效地利用结构化学习和神经网络的特点,在很多自然语言处理任务上都取得了很好的结果。
在基于神经网络的分词算法中,通常采用与基于字的统计方法类似的问题建模方法,将分词任务转换为字的序列标注任务,对于给定一个中文句子,根据它在分词结果中的位置以及所采用的标签系统,输出标签序列。BiLSTM-CRF主要包含三层:输入层、双向长短期记忆网络层和CRF层。在输入层,需要将每个字转换为低维稠密的字向量
x
i
x_i
xi。
BiLSTM层采用双向LSTM,其主要作用为提取句子特征。将句子中的每个字向量序列,输入到双向LSTM的各个时间步,再将正向LSTM输出的隐状态序列与反向LSTM隐状态序列按位置进行拼接,从而得到完整的隐状态序列。