W2NER:统一NER模型SOTA

W2NER:统一NER模型SOTA论文:UnifiedNamedEntityRecognitionasWord-WordRelationClassification发表方:武汉大学,发表于AAAI2022论文链接:https://arxiv.org/

论文:Unified Named Entity Recognition as Word-Word Relation Classification

发表方:武汉大学,发表于AAAI2022

论文链接:https://arxiv.org/abs/2112.10070

开源代码:https://github.com/ljynlp/W2NER

这篇论文主要是针对“flat NER”(就是最普通的NER)、“重叠NER”和“不连续NER”三种NER的子任务,提出了一种统一的word-word pair的标注框架,并且提出了一个相对应的模型结构来进行学习,他们在三个tasks的多个数据集上取得了SOTA的成绩。

标注框架

标注框架

我们首先来看一个论文中举的NER样本:

{
    'text': 'I am having aching in legs and shoulders',
    'entity_list': [
        {'entity_text': 'aching in legs', 'index': [3, 4, 5], 'entity_type': 'Symptom'},
        {'entity_text': 'aching in shoulders', 'index': [3, 4, 7], 'entity_type': 'Symptom'}
    ]
}

4250366eff719954eb9cbdff3781b555.png

标注框架示例

上面的例子在这个标注框架中的示例如上图所示,对于一个句子,这个框架首先搞了一个word-word矩阵(如上图的右侧矩阵),在矩阵中定义了两种类型的标记:

  • NHW,Next-Neighboring-Word,这个类型的标记只会出现在上三角矩阵中(不包括对角线部分),上三角矩阵的元素取值只有0和1两种,(也就是图中矩阵中标注NHW的格子)表示,在某个实体中,第i个单词后面接着的是第j个单词,比如表示在某个实体中,第3个单词(从0开始数)aching后面跟着的单词是in。

  • THW-entity_type ,Tail-Head-Word-entity_type,这个类型的标记只会出现在下三角矩阵中(包括对角线部分),entity_type就是实体的类型,代码里面其实这个THW-entity_type直接就用entity_type的id就可以了,表示,第i个单词是某个实体类型ID为3的实体的结尾词(tail word),而第j个单词是这个实体的开始词(head word),比如表示单词shoulders是实体的结尾,这个实体的开头是aching,这个实体的类型是Symptom。

这个框架可以直接把三种NER的subtasks全部一勺烩了,借用论文中举的4个例子,大家感受一下:

a3a6160d1000ffbdf2ea964caf68fa07.png

不同类型的NER
解码方法

了解了标注框架后,我们来看看它的解码方法:

135ff0b1b574bbeeb69877c7dcebda4a.png

解码算法

其实就是一个DFS,大致步骤这里描述一下:

  1. 首先在下三角矩阵中找THW-entity_type标签,假设第i行第j列是THW-entity_type,如果,说明是一个单字实体,直接加入结果集E和T,否则去第2步

  2. 如果,则说明第i个单词是实体的尾部,第j个单词是实体的起始,那么一定会有,然后我们第j行的第j+1列开始找NNW,假设在第j行第k列找到NNW,则去第k行的第k+1列接着向后找,直到到达第i列为止,找到第i列的话,把从j开始通过NNW迄今为止串起来的token作为是一个实体加入结果集。

(但弱弱的说一句,这种情况的话,如果开头和结尾完全重叠,但中间不重叠的俩实体,岂不是就分不出来,是不是得在NNW上面也加上实体类型,哈哈)

模型结构

其实这篇论文这个标注的框架比较重要,但还是要介绍一下模型。

9ed5fb28b85aa902ae5f3025d1cfb4c9.png

模型整体结构

从图中大致可以看出,模型分为三个模块:Encoder Layer、Convolution Layer和Co-Predictor Layer,接下来我们一一介绍。

Encoder Layer

这部分主要是获取文本中每个Token的表征,对于一个输入文本序列,Encoder Layer通过如下步骤获取每个Token的表征

  1. 过BERT,获得文本序列的word pieces的表征,这里可以是BERT的最后一层,也可以是最后四层的平均,但这里获取到的是word pieces的表征,并不是每个Token的表征;

  2. 在word pieces的表征上面用Max Pooling获取Token的表征;

  3. 过BiLSTM获取最终的Token的表征。

这里说一下word pieces到Token的max pooline操作怎么做:

# 数据构造阶段:比如句子token长度是N,word piece的长度是M,然后构造一个N*M的矩阵W,每一行只在有word piece的部分是1,其他地方是0
W = np.zeros((N, M), dtype=np.bool)
start = 0
for i, pieces in enumerate(tokens):
    if len(pieces) == 0:
        continue
    pieces = list(range(start, start + len(pieces)))
    W[i, pieces[0] + 1:pieces[-1] + 2] = 1
    start += len(pieces)

# 模型里面:BERT的结果是[BS, M, dim](我们就叫他BE吧),扩展并且expand一下,到[BS, N, M, dim],就与矩阵W对上了,然后把矩阵W中为0的位置在BE中相对应的位置置为BE中的最小值,最后再M方向Max Pooling一下。
# W是[BS, N, M]
length = W.size(1)
min_value = torch.min(bert_embs).item()
_bert_embs = bert_embs.unsqueeze(1).expand(-1, length, -1, -1)
_bert_embs = torch.masked_fill(_bert_embs, pieces2word.eq(0).unsqueeze(-1), min_value)
word_reps, _ = torch.max(_bert_embs, dim=2)
Convolution Layer

这部分主要是通过「CLN」将Token的序列(不算batch维和特征dim维的话就是1D)表征变成word-word的网格表征(那它就是2D),并在网格表征上面添加「单词间相对位置表征」「上下三角表征」,最后进一步通过3个「空洞卷积」对网格表征进行进一步编码。

1. CLN

构造Word-Word的网格表征,假设表示第i个单词对第j个单词的关系,进一步说就是在给定第i个单词的情况下单词j的特征,为了达到这种效果,他们引入了Conditional Layer Normalization(CLN),公式如下:

b7b4fe7ddb31657f34533c047c4e5122.png

可以看到是对第j个单词的表征做normalization,但与传统LN相比不同的是,CLN的两个系数和是根据第i个单词的表征学习到的。关于这点,苏神在他的博客[^1]里面有过一张很清晰的图(图里的就是上面公式里的),这里我贴一下:

a5f4560c3ea55e708aa42593d098e4cd.png

CLN
a3b536c532f526f301b546f9a47cb5ea.png
LN
2. 构造BERT风格的网格表征

仿照BERT,除了CLN生成的网格表征以外,还生成了两个其他的表征:

  • CLN生成的网格表征

  • 单词间相对位置表征,(代码中他们共给距离设置了19个区间,从而降低了位置表征的范围,具体可以看代码)

  • 上下三角矩阵的表征

三个拼在一起过MLP,生成BERT风格的网格表征。

3. 多粒度空洞卷积

用膨胀系数分别为1,2,3的三个空洞卷积层+GELU,去捕获网格中不同位置的word pairs间的关系,进一步对网格表征进行编码,最后拼接得到网格最终编码。

Co-Predictor Layer

最后这部分就是预测层了,之前有研究证明双线性分类器可以增强MLP在关系预测上的效果,所以他们用了俩分类器,一个双线性分类器,一个MLP分类器,最后将两者的结果相加过softmax得到最终结果。

1. 双线性分类器

7f1fefe73c3563d67067c37c1924c3a4.png

2. 最终结果

402 Payment Required

Loss Function

4ccf8f56af07b118b82aa9a4344eca32.png

实验

在不同的subtasks的多个数据集上都取得了SOTA,并在仅有overlap和discontinuous的数据上的效果也好于之前的一些模型

0737183e0e1c0bf6aa87edc8d5905f8c.png
672e03286494221f0d3741a5660a3497.png
74dc6afa16246bcecc56a97bad7d44fa.png
2c08679b597869668df54a6d258d6211.png

实验结果
消融实验

ec6dcbb6b073f95b7bf24985830ffb05.png

消融实验
  • Region Emb:没有上下三角的emb

  • Distance Emb:没有相对位置的emb

  • All DConv:去掉所有膨胀卷积,下降很多

    • 膨胀卷积l=2去掉之后,下降是三个膨胀卷积里面最大的

  • Biaffine:去掉双线性分类器,下降不多,说明Biaffine有一定辅助提升作用,但还是没有MLP的效果好,也侧面说明DConv那一层比双线性要好很多

  • MLP:去掉MLP后,下降了好多

  • NNW:去掉NNW,只有THW的话,不同数据集下降的不同,CADEC上面下降的比较多,因为这个数据集里面非连续NER比较多

最后

这个标注框架还挺好的,确实统一了三个subtasks,而且看下来也不难,值得大家尝试尝试。

ε≡٩(๑>₃<)۶ 一心向学

一起交流

想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)

2c4584e8582ab63afdf2acfb3c5299e1.png

6bc84dffbb6d73397b1288a64273eff1.gif

今天的文章W2NER:统一NER模型SOTA分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66448.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注