直接看代码:
github传送门
数据集:
Conll2003
1. 数据预处理
将txt中的文件读出然后将句子和对应的标签序列存入csv文件中,便于使用torchtext完成数据读取。
2. 模型定义
上图是BiLSTM的结构图,数据流向由下往上。命名实体识别是一个序列标注任务,也就是对于句子中的每一个单词都有一个对应的标签。对于每一个单词而言,对它的标签的预测其实也就是一个多分类任务,下面通过提问的方式解构这个模型。
为什么需要BiLSTM ?
:对于单词的多分类任务,最简单的处理方式就是在得到单词对应的词向量表示后通过全连接层+softmax得到预测为各个标签的概率,选择概率最大的标签作为预测标签,这样的处理方式存在的问题就是单词对应的向量表示没有很好地融合单词上下文信息,使用BiLSTM地目的就是融合单词的上下文信息。
为什么需要CRF以及CRF是怎么工作的 ?
:上一步已经有了BiLSTM,能够在获取单词的向量表示时融入上下文信息,模型被认为能够很好地提取单词的语义信息并进行标签预测,注意直到现在我们也没有考虑标签序列自身包含的一些约束条件,例如标签序列 O O B-PER I-PER O O 肯定比 O O I-PER B-PER O O更加合理,单纯的使用BiLSTM是不能考虑这样的约束的,只能寄希望于BiLSTM能够从语义中学习到这些信息(当然,这不太现实),怎么更好地处理这个问题,之所以我们觉得第二个序列不合理是因为标签序列中出现了 O I-PER 这样的子序列,为了限制这样的不合法转移,使用线性链条件随机场模型。它是怎么工作的?假设在经过BiLSTM+全连接层后得到一个NxK的矩阵U,N为单词个数,K为标签种类数,U被称为发射矩阵,
U
[
i
]
[
j
]
U[i][j]
U
[
i
]
[
j
]
表示第
i
i
i
个单词被预测为标签
j
j
j
的得分,另外为了限制不合法转移,设置一个KxK的T矩阵,
T
[
i
]
[
j
]
T[i][j]
T
[
i
]
[
j
]
表示由标签
i
i
i
转移到标签
j
j
j
的得分,给定一个单词序列x,当对应的预测标签序列为y时将得分定义为:
s
c
o
r
e
(
x
,
y
)
=
e
x
p
(
∑
i
=
1
N
U
[
x
i
]
[
y
i
]
+
∑
i
=
1
N
−
1
T
[
y
i
]
[
y
i
+
1
]
)
score(x,y)=exp(\sum_{i=1}^{N}U[x_i][y_i]+\sum_{i=1}^{N-1}T[y_i][y_{i+1}])
s
c
o
r
e
(
x
,
y
)
=
e
x
p
(
i
=
1
∑
N
U
[
x
i
]
[
y
i
]
+
i
=
1
∑
N
−
1
T
[
y
i
]
[
y
i
+
1
]
)
给定单词序列x,对于任意一个可能的标签序列y都可以计算其得分,我们希望最终的模型能够使得x对应的真实标签序列
y
t
r
u
e
y^{true}
y
t
r
u
e
的得分最高,所以模型训练的过程就是最大化下面的式子:
P
(
x
,
y
t
r
u
e
)
=
s
c
o
r
e
(
x
,
y
t
r
u
e
)
∑
所
有
可
能
的
标
签
序
列
y
p
s
c
o
r
e
(
x
,
y
p
)
P(x, y^{true})=\frac{score(x,y^{true})}{\sum_{所有可能的标签序列y_p}score(x,y^p)}
P
(
x
,
y
t
r
u
e
)
=
∑
所
有
可
能
的
标
签
序
列
y
p
s
c
o
r
e
(
x
,
y
p
)
s
c
o
r
e
(
x
,
y
t
r
u
e
)
这样就能够将标签转移信息纳入到预测过程中,大体思路就是上面所述,更详细的解释比如怎么计算所有可能的标签序列的得分等问题见
implementing-a-linear-chain-conditional-random-field-crf-in-pytorch
,
线性链条件随机场代码较详细注释
。