title: 基于机器阅读理解框架的命名实体识别方法subtitle: A Unified MRC Framework for Named Entity Recognition
date: 2020-07-07
author: NSX
catalog: true
tags:
- NER
- MRC
基于机器阅读理解框架的命名实体识别方法
论文标题:A Unified MRC Framework for Named Entity Recognition
论文作者:Xiaoya Li, Jingrong Feng, Jiwei Li
今天,我们向大家介绍香侬科技被ACL 2020接收的第三篇论文: A Unified MRC Framework for Named Entity Recognition 。本文提出 使用基于 机器阅读理解 (Machine Reading Comprehension, MRC) 的框架 代替序列标注模型 (sequence labeling) 统一 处理嵌套与非嵌套命名实体识别问题。该方法解决了序列标注模型无法处理嵌套命名实体识别的缺陷, 在8个中英数据集(OntoNotes4.0/5.0、ACE2004/2005、GENIA、KBP17、MSRA、CoNLL)上取得接近或超过当前最佳效果的表现 ,尤其是在嵌套任务上大幅超越之前最优结果。
1. 概述
近年来关于命名实体识别(NER)的研究非常多,其中大多数都是针对的“非嵌套型”的NER(Flat NER),然而在实际场景中,“嵌套型”的NER(Nested NER)占了相当的比例。如下图所示的两个例子所示。如此一来,以往针对Flat NER的模型就不对Nested NER起效,这是因为它们大多数是序列标注模型,这就没有办法直接迁移到Nested NER上。
另一方面,过去对Nested NER的解决方法大都是构建一个pipelined的模型结构,即先抽取所有的实体,然后再判断每个实体的实体类型。这种方法尽管比较简单,但是由于其pipeline性质,实体抽取的错误直接会导致整体正确率的降低。而且,将Flat NER与Nested NER分开考虑本身也不够简洁。
我们想要一种将二者联系起来,并且不失效果的方法。受到近来机器阅读理解问答(MRC-QA)的启发, 我们提出使用机器阅读理解框架去合并处理Flat NER与Nested NER。比如,现在想要抽取PER类型的实体,那幺我就可以问“Which person is mentioned in the text”。使用这种方法,无论是Flat NER还是Nested NER,都能很直观地抽取出来。
总的来说, 本文贡献如下 :
- 提出一种基于MRC的方法抽取命名实体,该方法适用于Flat和Nested两种类型的NER。相比序列标注方法,该方法简单直观,可迁移性强。
- 我们将会通过实验说明,基于MRC的方法能够让问题编码一些先验语义知识,从而能够在小数据集下、迁移学习下表现更好。
- 在8个中英数据集上取得当前最佳效果(OntoNotes4.0/5.0、ACE2004/2005、GENIA、KBP17、MSRA、CoNLL等)。
2. 模型设计
2.1 NER任务
给定一个句子,其中是句子中的字符,n是句子的长度。实体识别
就是找出句子X中的所有实体,并给所有实体赋予一个标签(其中Y是预先定义好的标签类型,如:PER,LOC等)。
2.2 MRC任务
给定上下文C和问题Q,其中,MRC(片段抽取型)任务要求模型从C中抽取连续的子串 其中( )。
2.3 基于MRC框架的NER解决方案
将NER任务转换为MRC任务,如:抽取句子中PER(PERSON)
实体的NER任务
,可以转换为回答问题which person is mentioned in the text
的MRC任务
。此种方式天然适配falt NER
和nested NER
任务。(当需要抽取不同类别的重叠实体时,只需要回答两个独立的问即可)。
2.4 数据构建
先来回顾一下NER任务。给定一个文本序列,它的长度为n,我们要抽取出其中的每个实体,其中实体都有各自的实体类型。假设该数据集的所有实体标签集合为,那幺对其中的每个实体标签y,比如地点LOC,都有一个关于它的问题 #card=math&code=q%28y%29)。这个问题可以是一个词,也可以是一句话等等。现在,我们给模型输入 和 #card=math&code=q%28y%29),就可以期望模型输出所有具有标签 的所有实体。
question的构建
那幺,训练数据如何构建呢?首先来构造问题q(y)。我们使用 “标注说明”
作为每个标签的问题。所谓“标注说明”,是在构造某个数据集的时候提供给标注者的简短的标注说明。比如标注者要去标注标签为LOC的所有实体,如下图所示:
在有了问题 #card=math&code=q%28y%29) 之后(现在假设问题的长度为m),我们就有了一个训练实例三元组 ,也就是%2C%20Answer%2C%20X%EF%BC%89#card=math&code=%EF%BC%88q%28y%29%2C%20Answer%2C%20X%EF%BC%89),这里Answer就是对应的所有实体。
我们用 #card=math&code=x%28start%3Aend%29) 表示其中的实体。其中start是实体的开始位置,end是实体的结束位置。比如在句子X=“北京欢迎你”这句话中,“北京”这个实体就可以表示为x(1:2),因为“北”是句子的第1个位置,“京”是句子的第2个位置。
2.6 模型细节
2.6.1 Model Backbone
将question
#card=math&code=q%28y%29) 和句子
拼接成 $ {[CLS],q(1),……, q(m),[SEP],x(1),…… ,x(n)}$ 的形式,输入BERT
进行特征提取,得到特征矩阵 ,其中n为句子长度,d为BERT最后一层提取的特征矩阵的向量维度。
2.6.2 Span Selection
MRC
抽取答案的方法是预测答案的开始位置和结束位置,有两种方案:
- 设计
2个n-classes分类器(n为句子长度)
,分别预测答案的开始位置和结束位置。这种方案在给定一个context
和一个question
时只能得到一个答案,无法处理句子中存有多个实体的问题,更不能解决实体嵌套的问题; - 设计
2个2分类器
,其中一个分类器负责预测每个字符是否是实体开始位置
,另一个分类器负责预测每个字符是否是实体的结束位置
。这种方案在给定一个context
和一个question
时支持多个实体开始位置
和多个实体结束位置
,因此有能力根据 抽取出所有相关的实体。模型采用的是本方案。
Start Index Prediction
%20%5Cin%20R%5E%7Bn%20%5Ctimes%202%7D#card=math&code=P%7Bstart%7D%3Dsoftmax%7Beach%20%5Cspace%20row%7D%28E%20%5Ccdot%20T_%7Bstart%7D%29%20%5Cin%20R%5E%7Bn%20%5Ctimes%202%7D)
其中:
- 是需要学习的参数;
- 每一行构成一个
是或不是实体开始位置
的概率分布;
End Index Prediction
%E2%88%88R%5E%7Bn%C3%972%7D#card=math&code=P%7Bend%7D%3Dsoftmax%7Beach%20row%7D%28E%E2%8B%85T_%7Bend%7D%29%E2%88%88R%5E%7Bn%C3%972%7D)
其中:
- 是需要学习的参数;
- 每一行构成一个
是或不是实体结束位置
的概率分布;
Start-End Matching
在句子X中,同一个类型下存在多个实体,这就意味着存在多个start-index
和多个end-index
,因此需要一个二分类器
去匹配start-index
和end-index
。
)#card=math&code=P%7Bi%7Bstart%7D%2Cj%7Bend%7D%7D%3Dsigmoid%28m%E2%8B%85concat%28E%7Bi%7Bstart%7D%7D%2CE%7Bj_%7Bend%7D%7D%29%29)
其中:
是需要学习的参数。
得到的这个概率就是x(i:j)是实体类型为y的实体的概率。
2.7 训练与推理
2.7.1 Train阶段
训练阶段有三个损失函数,分别是开始位置损失、结束位置损失和实体损失,分别定义如下:
在训练的时候,我们有三个损失,分别是开始位置损失、结束位置损失和实体损失,分别定义如下:
%0A#card=math&code=%5Czeta%7Bstart%7D%3DCE%28P%7Bstart%7D%2CY_%7Bstart%7D%29%0A)
%0A#card=math&code=%5Czeta%7Bend%7D%3DCE%28P%7Bend%7D%2Cy_%7Bend%7D%29%0A)
%0A#card=math&code=%5Czeta%7Bspan%7D%3DCE%28P%7Bstart%2Cend%7D%2CY_%7Bstart%2Cend%7D%29%0A)
即,分别把预测的和真实的结果做交叉熵。然后加起来就是最后的损失。如果p(i:j)>0.5,我们就认为x(i:j)是实体,否则就不是。
Train的损失函数为:,其中是超参。
2.7.2 Test阶段
- 使用
start index model
预测实体的start-index
; - 使用
end index model
预测实体的end-index
; - 使用
match model
对start-index
和end-index
进行匹配,当%3E0.5#card=math&code=P%7Bspan%7D%28i%7Bstart%7D%2Ci_%7Bend%7D%29%3E0.5)时,模型判定x(i:j)
是实体,否则不是。
3. NER实验
3.1 Nested NER效果
我们首先在Nested NER上做实验,数据集(英文)用ACE2004,ACE2005,GENIA,KBP2017。基线模型有Hyper-Graph,Seg-Graph,ARN,KBP17,Seq2seq-BERT,Path-BERT,Merge-BERT和DYGIE,具体实验设置详见原文。实验结果如下:
在所有数据集上,MRC的方法都取得显着更优。
3.2 Flat NER效果
下面我们在Flat NER上做实验,数据集分为中文和英文。英文有CoNLL2003,OntoNotes5.0;中文有MSRA,OntoNotes4.0,基线模型有BiLSTM-CRF, ELMo, CVT, BERT-Tagger(以上为英文), Lattice-LSTM, BERT-Tagger, Glyce-BERT(以上为中文)。实验结果如下:
可以看到,在两个OntoNotes数据集上,MRC的方法都有更多的提升,这是因为OntoNotes有更多的实体类型,一些类型数据非常稀疏。这表明MRC方法有助于缓解数据稀疏问题,因为MRC中的问题能够编码一部分先验信息。
4. 分析
下面我们从四个方面进行比对实验:
- 提升来源(MRC还是BERT);
- 问题构建策略;
- Zero-Shot表现;
- 训练集大小。
4.1 MRC or BERT ?
第一个问题是,实验的提升到底是来自BERT还是来自MRC呢?如果来自MRC,那幺把这种MRC方法加到其他非BERT模型上应该也会有显着提升。
所以,对非BERT模型,我们比较了普通的LSTM Tagger(non-MRC)和BiDAF/QAnet(MRC);对BERT模型,我们比较了BERT Tagger和BERT-MRC,实验结果如下:
很显然,无论对non-BERT还是BERT模型,MRC都比non-MRC好,尽管有了BERT也会有大幅提升。
4.2 如何构建Question ?
Question
的构建方式对结果有显著的影响,作者探索了一下几种方式:
- label的下标:直接使用label在标签集中的
下标
作为question
,如:one
、two
、tree
; - 关键词:使用
关键词
作为question
,如ORG
的question
为organization
; - 规则模板:用模板生成
question
,如ORG
的question
为which organization is mentioned in the text
; - 维基百科:用维基百科里的定义作为
question
,如ORG
的question
为:an organization is an entity comprising multiple people, such as an institution or an association
; - 近义词:使用label的近义词作为
question
,如ORG
的question
为:association
; - 关键词+近义词:将关键词和近义词连接起来作为
question
; - 标注说明:上文提到的方法,如
ORG
的question
为find organizations including companies, agencies and institutions
;
效果如下图所示:
使用标注说明
的模型效果最好,分析如下:
- 标签下标没有任何有用的信息,因此效果最差;
- 维基百科包含较多的无用信息,造成了干扰;
- 标注指南描述的最为准确,效果最好;
4.3 Zero-shot
上面我们说到,MRC的问题由于编码了一些先验信息,所以可能在标签迁移上效果较好,下表是结果。可以看到,在两个数据集迁移上,tagger都远差于MRC。
4.4 训练集大小
最后来看看不同数据集大小对MRC和Tagger效果的影响,下图可见,即使训练数据只有50%,MRC方法都能达到Tagger的最优结果。这也说明了MRC具有一定的先验知识编码能力。