【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等
本专栏主要方便入门同学快速掌握相关知识。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。
声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)
专栏订阅:
- 深度学习入门到进阶专栏
- 深度学习应用项目实战篇
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)
1.命名实体识别介绍
**命名实体识别(Named Entity Recoginition, NER)**旨在将一串文本中的实体识别出来,并标注出它所指代的类型,比如人名、地名等等。具体地,根据MUC会议规定,命名实体识别任务包括三个子任务:
- 实体名:人名、地名、机构名等
- 时间表达式:日期、时间、持续时间等
- 数字表达式:百分比、度量衡、钱、基数等
我们来看这句话,百度于2021年3月23日正式回香港上市,这句话中"百度"是个机构名,"香港"是个地名,"2021年3月23日"是个日期,命名实体识别任务能够通过建模的方式来帮助我们自动地发现这些实体。
命名实体识别是一项比较关键的NLP任务,具有广泛的应用场景,例如在对话意图理解(NLU)中,通过提取出相应的实体词,能够帮助系统更加准确地理解用户的需求,比如根据用户的问题提取出"天气",“北京”,"今天"这样的词汇,大概率就能知道用户在问些什么;在微博场景中,应用命名实体识别提取出微博短文中重要的实体词,也有利于微博信息的汇总,或者事件热度的统计。
NER任务一般会被建模成序列标注任务,也就是说,模型的输入是待识别的一串文本序列,模型的输出就是该文本序列对应的标签序列,不同于文本分类任务,这是一种序列到序列的任务。我们来举个例子:
姚 | 明 | 担 | 任 | 中 | 国 | 篮 | 协 | 主 | 席 |
---|---|---|---|---|---|---|---|---|---|
B-Person | I-Person | O | O | B-Organization | I-Organization | I-Organization | I-Organization | O | O |
这句话中的每个字分别对应着一个标签, 模型的输入就是上边的文本,模型的输出就是下面的标签序列,我们通过这样的标签序列就能识别出原始文本中的实体。
具体地,上边这串文本中,“姚明"对应着Person实体,其中"姚"字是"Person"实体的起始字,所以设置标签为"B-person”,其中标签前边的B代表Begin这个单词;“明"字是"Person"实体的中间字,所以设置标签为"I-Person”,其中标签前边的I代表Intermediate这个单词。 “中国篮协"对应这Organization实体,相应标签"B-Organization"和"I-Organization"的解读和Person实体是一致的。最后的标签"O"代表"other”,表示其他实体类型的标签。
看到这里,相信你已经知道,本节的NER任务要建模完成一件什么事情了,即建模一个序列到序列的模型来找出文本中蕴含的实体。
2.BiLSTM+CRF实现命名实体识别
BiLSTM + CRF是一种经典的命名实体识别(NER)模型方案,这在后续很多的模型improvment上都有启发性。如果你有了解NER任务的兴趣或者任务,或者完全出于对CRF的好奇,建议大家静心读一读这篇文章。
本篇文章会将重点放到条件随机场(CRF)上边,因为这是实现NER任务很重要的一个组件,也是本篇文章最想向你推荐的特色。但是如果你 对长短时记忆网络(LSTM)也不是很熟悉,那你也不用担心,笔者会去解释LSTM的用法,它的输入和输出等等内容,以保证你可以顺畅的读下去,领悟到这个模型的精髓。
2.1使用BiLSTM+CRF实现NER
为方便直观地看到BiLSTM+CRF是什么,我们先来贴一下BiLSTM+CRF的模型结构图,如图1所示。
从图1可以看到,在BiLSTM上方我们添加了一个CRF层。具体地,在基于BiLSTM获得各个位置的标签向量之后,这些标签向量将被作为发射分数传入CRF中,发射这个概念是从CRF里面带出来的,后边在介绍CRF部分会更多地提及,这里先不用纠结这一点。
这些发射分数(标签向量)传入CRF之后,CRF会据此解码出一串标签序列。那么问题来了,从图1最上边的解码过程可以看出,这里可能对应着很多条不同的路径,例如:
- B-Person, I-Person, O, …, I-Organization
- B-Organization, I-Person, O, …, I-Person
- B-Organization, I-Organization, O, …, O
CRF的作用就是在所有可能的路径中,找出得出概率最大,效果最优的一条路径,那这个标签序列就是模型的输出。
我们来总结一下,使用BiLSTM+CRF模型架构实现NER任务,大致分为两个阶段:使用BiLSTM生成发射分数(标签向量),基于发射分数使用CRF解码最优的标签路径。
2. 回归CRF建模原理本身
本节将开始聚焦在CRF原理本身进行讲解,力图为读者展现一个清楚明白,基础本质的CRF。那现在开始这趟学习之旅吧,相信你一定会有所收获。
2.1 线性CRF的定义
通常我们会使用线性链CRF来建模NER任务,所以本实验将聚焦在线性链CRF来探讨。那什么是线性链CRF呢,我们来看下李航老师在《统计学习方法》书中的定义:
设 X = [ x 1 , x 2 , . . . , x n ] , Y = [ y 1 , y 2 , . . . , y n ] X=[x_1, x_2, ..., x_n],Y=[y_1, y_2, ..., y_n] X=[x1,x2,...,xn],Y=[y1,y2,...,yn] 均为线性链表示的随机变量序列,若在给定随机变量序列的 X X X的条件下,随机变量序列 Y Y Y的条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X)构成条件随机场,即满足马尔可夫性:
P ( y i ∣ X , y 1 , . . . , y i − 1 , y i + 1 , . . . , y n ) = P ( y i ∣ X , y i − 1 , y i + 1 ) i = 1 , 2 , . . . , n ( 在 i = 1 和 n 时只考虑单边 ) \begin{align} P(y_i|X, y_{1},...,y_{i-1},y_{i+1},...,y_n) &= P(y_i|X,y_{i-1},y_{i+1}) \\ i &= 1,2,...,n (在i=1和n时只考虑单边) \end{align} P(yi∣X,y1,...,yi−1,yi+1,...,yn)i=P(yi∣X,yi−1,yi+1)=1,2,...,n(在i=1和n时只考虑单边)
则称 P ( Y ∣ X ) P(Y|X) P(Y∣X)为线性链条件随机场。
同学们看到这个定义,或许会有些疑惑,但是不用着急,我们来探讨下这个定义。图2展示了一种经典的线性链CRF的结构图,从这张结构图来理解这个定义,主要包含两个点:
- 确保输入序列 X X X和输出序列 Y Y Y是线性序列
- 每个标签 y i y_i yi的产生,只与这些因素有关系:当前位置的输入 x i x_i xi, y i y_i yi直接相连的两个邻居 y i − 1 y_{i-1} yi−1和 y i + 1 y_{i+1} yi+1,与其他的标签和输入没有关系。
这样的定义,其实帮助我们减小了建模CRF的代价。
2.2 发射分数和转移分数
上边我们探讨了线性链CRF的定义以及它的一种经典图结构,接下来我们继续回到我们建模的命名实体任务上来。
在图2中, x = [ x 0 , x 1 , . . . , x i , . . . , x n ] x=[x_0, x_1, ... , x_i, ... , x_n] x=[x0,x1,...,xi,...,xn]代表输入变量,对应到我们当前任务就是输入文本序列, y = [ y 0 , y 1 , . . . , y i , . . . , y n ] y=[y_0, y_1, ..., y_i, ..., y_n] y=[y0,y1,...,yi,...,yn]代表相应的标签序列,
其中,每个输入 x i x_i xi均对应着一个标签 y i y_i yi,这一步对应的就是发射分数,它指示了当前的输入 x i x_i xi应该对应什么样的标签;在每个标签 y i y_i yi之间也存在连线,它表示当前位置的标签 y i y_i yi向下一个位置的标签 y i + 1 {y_{i+1}} yi+1的一种转移。举个例子,假设当前位置的标签是"B-Person",那下一个位置就很有可能是"I-Person"标签,即标签"B-Person"向"I-Person"转移的概率会比较大。
这里我们带出了建模CRF过程中两个重要的概念:发射分数和转移分数,下边我们来看看他们是什么。
2.2.1 发射分数
前边我们在第2节已经提到过发射分数了,即BiLSTM后产生的标签向量。如果大家对这部分内容已经很熟悉,完全可以跳过这部分。图3以矩阵的形式展示了发射分数的生成过程。
当给定的文本序列 x = [ x 1 , x 2 , x 3 , . . . , x n ] x=[x_1, x_2, x_3,..., x_n] x=[x1,x2,x3,...,xn]映射为对应词向量之后,将会得到一个shape为 [ n , e m b e d d i n g _ s i z e ] [n, embedding\_size] [n,embedding_size]的词向量矩阵 e m b s embs embs,其中每对应一个字词(图5样例只使用了4个词),例如 x 0 x_0 x0对应的词向量是 [ e 00 , e 01 , e 02 , e 03 ] [e_{00}, e_{01}, e_{02}, e_{03}] [e00,e01,e02,e03]。
然后将 e m b s embs embs传入BiLSTM后,每个词的位置都会产生一个上下文向量,所有的向量组合之后会得到一个向量矩阵 c o n t e x t _ v e c t o r context\_vector context_vector,其中每行代表对应单词经过BiLSTM后的上下文向量。
这里的每个位置的上下文向量可以用来指导当前位置应该输出的标签信息,但这里有个问题,这个输出向量的维度并不是标签的数量,它不能直接用来指示应该输出什么标签。一般的做法是在后边加一层线性层,将这个上下文向量的维度映射为标签的数量,这样的话就会生成前边所讲的标签向量,其中的每个元素分别对应着相应标签的分数,根据这个分数可以用来指导最终标签的输出。
具体地,线性层这里只是做了这样的一个线性变换:
y
=
X
W
+
b
y = XW+b
y=XW+b,显然,这里的
X
X
X就是
c
o
n
t
e
x
t
_
v
e
c
t
o
r
context\_vector
context_vector,
y
y
y是相应的
e
m
i
s
s
i
o
n
_
s
c
o
r
e
emission\_score
emission_score,
W
和
b
W和b
W和b是线性层的可学习参数。
前边提到,
c
o
n
t
e
x
t
_
v
e
c
t
o
r
context\_vector
context_vector的shape为
[
n
,
c
o
n
t
e
x
t
_
s
i
z
e
]
[n,context\_size]
[n,context_size],那么线性层的
W
W
W的shape应该是
[
c
o
n
t
e
x
t
_
s
i
z
e
,
t
a
g
_
s
i
z
e
]
[context\_size, tag\_size]
[context_size,tag_size],经过以上公式的线性变换,就可以得到发射分数
e
m
i
s
s
i
o
n
_
s
c
o
r
e
emission\_score
emission_score,其中每个字词对应一行的标签分数(图3中只设置了三列,代表一共有3个标签),例如,
x
0
x_0
x0对第一个标签的分数预测为
t
00
t_{00}
t00,对第二个标签的分数预测为
t
01
t_{01}
t01,对第三个标签的分数预测为
t
02
t_{02}
t02,依次类推。
2.2.2 转移分数
下面我们来聊聊转移分数,这个转移分数表示一个标签向另一个标签转移的分数,分数越高,转移概率就越大,反之亦然。图4展示了记录转移分数的矩阵。
让我们从列到行地来看下这个转移矩阵 T T T,B-Person向I-Person转移的分数为0.93,B-Person向I-Organization转移的分数为0.02,前者的分数远远大于后者。I-Person向I-Person转移的概率是0.71,I-Organization向I-Organization转移的分数是0.95,因为一个人或者组织的名字往往包含多个字,所以这个概率相对是比较高的,这其实也是很符合我们直观认识的。
假设我们现在有个标签序列:B-Person, I-Person, O, O,B-Organization, I-Organization。那么这个序列的转移分数可按照如下方式计算:
S e q t = T I − P e r s o n , B − P e r s o n + T O , I − P e r s o n + T O , O + T O , B − O r g a n i z a t i o n + T B − O r g a n i z a t i o n , I − O r g a n i z a t i o n Seq_t = T_{I-Person,B-Person} + T_{O,I-Person} + T_{O,O} + T_{O,B-Organization} + T_{B-Organization, I-Organization} Seqt=TI−Person,B−Person+TO,I−Person+TO,O+TO,B−Organization+TB−Organization,I−Organization
这个转移分数矩阵是CRF中的一个可学习的参数矩阵,它的存在能够帮助我们显示地去建模标签之间的转移关系,提高命名实体识别的准确率。
2.3 其余内容见下一篇文章(字数限制)
更多文章请关注公重号:汀丶人工智能
3. 3 推荐!实体、关系、属性抽取实战项目合集(含智能标注)
实体、关系、属性抽取实战项目合集(含智能标注)