NER的过去、现在和未来综述-过去

背景

命名实体识别(NER, Named Entity Recognition),是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。

在这里插入图片描述

评价指标

使用实体级别的精确率、召回率、F1

本文主要讲解NER历史使用过的一些方法,如果更关注于现在使用功能的一些方法,可以参考:

基于词典和规则的方法

利用词典,通过词典的先验信息,匹配出句子中的潜在实体,通过一些规则进行筛选。

或者利用句式模板,抽取实体,例如模板"播放歌曲${song}",就可以将query="播放歌曲七里香"中的song=七里香抽取出来。

正向最大匹配&反向最大匹配&双向最大匹配。

原理比较简单,直接看代码:ner_rule.py

正向最大匹配:从前往后依次匹配子句是否是词语,以最长的优先。

后向最大匹配:从后往前依次匹配子句是否是词语,以最长的优先。

双向最大匹配原则:

  • 覆盖token最多的匹配。
  • 句子包含实体和切分后的片段,这种片段+实体个数最少的。基于机器学习的方法

CRF,原理可以参考:Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data

在这里插入图片描述

在随机变量X取值为x的条件下,随机变量Y取值为y的条件概率为:

P(y /mid x)=/frac{1}{Z(x)} /exp /left(/sum_{i, k} /lambda_{k} t_{k}/left(y_{i-1}, y_{i}, x, i/right)+/sum_{i, l} u_{l} s_{l}/left(y_{i}, x, i/right)/right)
//
Z(x)=/sum_{y} /exp /left(/sum_{i, k} /lambda_{k} t_{k}/left(y_{l-1}, y_{i}, x, i/right)+/sum_{i, l} u_{i} s_{l}/left(y_{l}, x, t/right)/right)

其中t_k,s_l是特征函数(如上图),/lambda_k,u_i对应权值,Z(x)是规范化因子。

来(chao)自李航的统计学习方法

引入深度学习语义编码器

BI-LSTM + CRF

Bidirectional LSTM-CRF Models for Sequence Tagging

BI-LSTM-CRF 模型可以有效地利用过去和未来的输入特征。借助 CRF 层, 它还可以使用句子级别的标记信息。BI-LSTM-CRF 模型在POS(词性标注),chunking(语义组块标注)和 NER(命名实体识别)数据集上取得了当时的SOTA效果。同时BI-LSTM-CRF模型是健壮的,相比之前模型对词嵌入依赖更小。

文章对比了5种模型:LSTM、BI-LSTM、CRF、LSTM-CRF、BI-LSTM-CRF,LSTM: 通过输入门,遗忘门和输出门实现记忆单元,能够有效利用上文的输入特征。BI-LSTM:可以获取时间步的上下文输入特征。CRF: 使用功能句子级标签信息,精度高。

在这里插入图片描述

比较经典的模型,BERT之前很长一段时间的范式,小数据集仍然可以使用。

stack-LSTM & char-embedding

Neural Architectures for Named Entity Recognition

stack-LSTM :stack-LSTM 直接构建多词的命名实体。Stack-LSTM 在 LSTM 中加入一个栈指针。模型包含chunking和

  1. 堆栈包含三个:output(输出栈/已完成的部分),stack(暂存栈/临时部分),buffer (尚未处理的单词栈)
  2. 三种操作(action):
    1. SHIFT: 将一个单词从 buffer 中移动到 stack 中;
    2. OUT: 将一个单词从 buffer 中移动到 output 中;
    3. REDUCE: 将 stack 中的单词全部弹出,组成一个块,用标签y对其进行标记, 并将其push到output中。
  3. 模型训练中获取每一步的action的条件概率分布,标签是真实每一步 action 的概率分布。预测时候,同坐预测每一步action概率,用概率最大action来执行action操作。
  4. 在REDUCE操作输出chunking块之后,通过lstm对其编码输出chunk的向量表达,然后预测其标签。

举例见图示:

在这里插入图片描述

stack-LSTM来源于:Transition-based dependency parsing with stack long-short-term memory

同时使用初始化的char-embedding,对于每一个词语,通过BI-LSTM将字符编码作为输入,输出词语的字符级别表达,然后concat词向量输入到BI-LSTM + CRF。

CNN + BI-LSTM + CRF

End-to-end Sequence Labeling via Bi-directional LSTM- CNNs-CRF

  • 通过CNN获取字符级的词表示。CNN是一个非常有效的方式去抽取词的形态信息(例如词的前缀和后缀)进行编码的方法,如图。
  • 然后将CNN的字符级编码向量和词级别向量concat,输入到BI-LSTM + CRF网络中,后面和上一个方法类似。整体网络结构:

IDCNN

2017Fast and Accurate Entity Recognition with Iterated Dilated Convolutions

针对Bi-LSTM解码速度较慢的问题,本文提出 ID-CNNs 网络来代替 Bi-LSTM,在保证和 Bi-LSTM-CRF 相 当的正确率,且带来了 14-20 倍的提速。句子级别的解码提速 8 倍相比于 Bi- LSTM-CRF。

CNN缺点:CNN 的上下文信息取决于窗口的大小,虽然不断地增加 CNN 卷积层最终也可以达到使每个 token 获取到整个输入句子作为上下文信息,但是其输出的分辨表现力太差。

于是出现了扩张卷积(or 空洞卷积):对于扩张卷积,有效 输入宽度可以随着深度呈指数增长,在每层不会有分辨率损失,并且可以估计 一定数量的参数

在这里插入图片描述

胶囊网络

Joint Slot Filling and Intent Detection via Capsule Neural Networks

Git: Capsule-NLU

NLU中两个重要的任务,Intent detection和slot filling,当前的无论pipline或者联合训练的方法,没有显示地对字、槽位、意图三者之间的层次关系建模。

本文提出将胶囊网络和dynamic routing-by-agreement应用于slot filling和intent detection联合任务.

  1. 使用层次话的胶囊网络来封装字、槽位、意图之间的层次关系。
  2. 提出rerouting的动态路由方案建模slot filling。

网络分为WordCaps、SlotCaps、IntentCaps。胶囊网络原理参考:Dynamic Routing Between Capsules

WordCaps

对于输入x = (w_1, w_2, …, w_T),输入BI-LSTM编码成为T个胶囊向量h_t=/overrightarrow{h_t}, /overleftarrow{h_t},和普通BI-LSTM并无区别:

/overrightarrow{h_t} = LSTM_{forward}(w_t, /overrightarrow{h_{t-1}}) //
/overleftarrow{h_t} = LSTM_{backward}(w_t, /overleftarrow{h_{t-1}})

SlotCaps

这里有k个slotCaps,对应k个ner的标签。作者利用第t个wordCap对于第k个slotCap的动态路由权重$c_{kt}$作为第t个字的ner预测标签的概率。初始向量:

/mathbf{p}_{k | t}=/sigma/left(/mathbf{W}_{k} /mathbf{h}_{t}^{T}+/mathbf{b}_{k}/right)

通过动态路由算法,更新权重:

在这里插入图片描述

输出胶囊向量:

/mathbf{v}_{k}=/operatorname{squash}/left(/mathbf{s}_{k}/right)=/frac{/left/|/mathbf{s}_{k}/right/|^{2}}{1+/left/|/mathbf{s}_{k}/right/|^{2}} /frac{/mathbf{s}_{k}}{/left/|/mathbf{s}_{k}/right/|}

最终slot filling的损失为:

/hat{y}_{t}^{k} = {argmax}_{k /in K}(c_{kt}) //
/mathcal{L}_{s l o t}=-/sum_{t} /sum_{k} y_{t}^{k} /log /left(/hat{y}_{t}^{k}/right)

IntentCaps

输入是slotCaps的输出胶囊向量,第k个slotCap对第l个intentCap的表达向量:

/mathbf{q}_{l | k}=/sigma/left(/mathbf{W}_{l} /mathbf{v}_{k}^{T}+b_{l}/right)

同样通过动态路由算法获得输出胶囊向量,向量的模作为属于l类的概率:

u_l = DYNAMIC / ROUTING(q_{l|k, iter_{intent}})

损失使用了max-margin Loss:

/begin{aligned} /mathcal{L}_{/text {intent}} &=/sum_{l=1}^{L}/left/{/mathbb{I} z=z_{l}/left/|/cdot /max /left(0, m^{+}-/left/|/mathbf{u}_{l}/right/|/right)^{2}/right./right.// &/left. +/lambda /mathbb{I} z /neq z_{l} /mathbb{U} /cdot /max /left(0,/left/|/mathbf{u}_{l}/right/|-m^{-}/right)^{2}/right/} /end{aligned}

Re-Routing

为了将Intent的信息提供给NER使用,提出了Re-Routing机制,它和动态路由机制很像,唯一改动在于权重更新中同时使用了v_k, /hat{u_{/hat{z}}},其中/hat{u_{/hat{z}}}是norm值最大的胶囊向量。

/mathrm{b}_{k t} /leftarrow /mathrm{b}_{k t}+/mathbf{p}_{k | t} /cdot /mathbf{v}_{k}+/alpha /cdot /mathbf{p}_{k | t}^{T} /mathbf{W}_{R R} /hat{/mathbf{u}}_{/tilde{z}}^{T}

Transformer

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

直说吧,就是BERT,bert之前万年bilstm+crf,bert之后,基本没它什么事儿了,bert原理不多赘述,应用在NER任务上也很简单,直接看图,每个token的输出直接分类即可:

语义特征

char-embedding

Neural Architectures for Named Entity Recognition

将英文字符拆解为字母,将词语的每个字母作为一个序列编码。

Attending to Characters in Neural Sequence Labeling Models

Attending to Characters in Neural Sequence Labeling Models

使用了单词或字符级别embedding组合,并在两种embedding之间使用attention机制“灵活地选取信息”,而之前模型是直接将两种embedding concat。

直接看公式,z是一个动态权重:

z=/sigma/left(W_{z}^{(3)} /tanh /left(W_{z}^{(1)} x+W_{z}^{(2)} m/right)/right) /quad /tilde{x}=z /cdot x+(1-z) /cdot m

并交叉熵上增加额外的loss:

/widetilde{E}=E+/sum_{t=1}^{T} g_{t}/left(1-/cos /left(m^{(t)}, x_{t}/right)/right) /quad g_{t}=/left/{/begin{array}{ll}{0,} & {/text { if } w_{t}=O O V} // {1,} & {/text { otherwise }}/end{array}/right.

非OOV单词希望m和x越相似越好(期望解决oov问题)。

char-embedding学习的是所有词语之间更通用的表示,而word-embedding学习的是特特定词语信息。对于频繁出现的单词,可以直接学习出单词表示,二者也会更相似。

Radical-Level Features(中文部首)

Character-Based LSTM-CRF with Radical-LevelFeatures for Chinese Named Entity Recognition.

也是一种char embedding方法,将每个中文字拆分为各个部首,例如“朝”会被拆分为字符:十、日、十、月。后面结构都类似。

n-gram prefixes and suffixes

Named Entity Recognition with Character-Level Models

提取每个词语的前缀和后缀作为词语的特征,例如:"aspirin"提取出3-gram的前后缀:{"asp", "rin"}.

包含两个参数:n、T。n表示n-gram size,T是阈值,表示该后缀或者前缀至少在语料库中出现过T次。

多任务联合学习

联合分词学习

Improving Named Entity Recognition for Chinese Social Mediawith Word Segmentation Representation Learning

将中文分词和 NER任务联合起来。使用预测的分割标签作为特征作为NER的输入之一,为NER系统提供更丰富的边界信息。

在这里插入图片描述

分词语料目前是很丰富的。如果目标域数据量比较小,不妨用分词的语料作为源域,来预训练一个底层编码器,然后再在目标域数据上联合分词任务fine-tuning.

联合意图学习

slot-gated

Slot-Gated Modeling for Joint Slot Filling and Intent Prediction

slot-gated这篇文章提出了slot-gate将槽位和意图的关系建模,同时使用了attention方法,所以介绍这篇文章直接一起介绍attention,之前attention相关的就不介绍了,

image-20181014174328660

底层特征:

使用BiLSTM结构,输入:x = (x_1, x_2,… x_T),输出:h_t = [/overrightarrow{h_t}, /overleftarrow{h_t}]

attention:

  1. slot filling attention:
  2. 权重计算:
c_i^S = /sum^T_{j=1} /alpha^S_{i,j} h_j, //
/alpha^S_{i,j} = /frac{exp(e_{i,j})}{/sum_{k=1}^T exp(e_{j,k})} //
e_{i,k} = V^T /sigma(W_{he}^S h_k + W_{ie} h_i)
  1. Slot
y_i^S = softmax(W_{hy}^S (h_i+c_i^S))
  1. Intent Prediction:其输入时BiLSTM的最后一个单元的输出$h^T$以及其对应的context向量,c的计算方式和slot filling的一致,相当于其i=T。
y^I = softmax(W_{hy}^I (h_T+c^I))

Attention具体细节见:Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling,博客:Attention

slot-Gate:

利用意图上下文向量来建模槽意图关系,以提高槽填充性能。如图3:

  1. 槽位的context向量和意图的context向量组合通过门结构(其中v和W都是可训练的):
g = /sum v /cdot tanh(c_i^S + W /cdot c^I)
  1. 用g作为预测$yi^S$的权重向量:
y_i^S = softmax(W_{hy}^S(h_i+c_i^S /cdot g))

Stack-Propagation

A Stack-Propagation Framework with Token-level Intent Detection for Spoken Language Understanding

Git

首先什么是Stack-Propagation呢,如下图所示:

它是区别于多任务, 不同的任务通过stack(级联?)的方式一起学习优化。

然后本文将意图任务的输出stack输入给NER任务,具体做法:

  • Token intent(意图阶段):假设每个token都会有一个意图的概率分布(标签是句子的意图,通过大量数据训练,就能够学到每个token的意图分布,对于每个意图的’偏好‘),最终句子的意图预测通过将每个token的意图预测结果投票决定。
  • Slot Filling:输入包含三部分:/mathbf{h}_{i-1}^{S}, /mathbf{y}_{i-1}^{S}, /mathbf{y}_{i}^{I} /oplus /mathbf{e}_{i},其中y_i^I是上一阶段token intent的预测结果的intent id,然后经过一个意图向量矩阵,转化为意图向量,输入给实体预测模块,解码器就是一层lstm+softmax。
在这里插入图片描述

BERT for Joint Intent Classification and Slot Filling

BERT for Joint Intent Classification and Slot Filling

原理如图,底层编码器使用了BERT,token的输出向量接softmax预测序列标签,cls向量预测意图。

bert之后,似乎 之前的一些优化都变成了奇技淫巧,那么就没有新的方法了吗?bert之前实体识别都是以序列标注(sequence labeling)来识别,没有其他的解码方式吗?

暂且就以BERT为过去和现在的分界点,关于NER的现在,且听下回分解。

下篇:NER的过去、现在和未来综述-现在

Reference

  1. NER的过去、现在和未来综述-过去篇
  2. NER的过去、现在和未来综述-现在
  3. Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data
  4. Bidirectional LSTM-CRF Models for Sequence Tagging
  5. Neural Architectures for Named Entity Recognition
  6. Transition-based dependency parsing with stack long-short-term memory
  7. End-to-end Sequence Labeling via Bi-directional LSTM- CNNs-CRF
  8. Fast and Accurate Entity Recognition with Iterated Dilated Convolutions
  9. Joint Slot Filling and Intent Detection via Capsule Neural Networks
  10. Dynamic Routing Between Capsules
  11. Neural Architectures for Named Entity Recognition
  12. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  13. Neural Architectures for Named Entity Recognition
  14. Attending to Characters in Neural Sequence Labeling Models
  15. Character-Based LSTM-CRF with Radical-LevelFeatures for Chinese Named Entity Recognition
  16. Named Entity Recognition with Character-Level Models
  17. Improving Named Entity Recognition for Chinese Social Mediawith Word Segmentation Representation Learning
  18. Slot-Gated Modeling for Joint Slot Filling and Intent Prediction
  19. Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling
  20. A Stack-Propagation Framework with Token-level Intent Detection for Spoken Language Understanding
  21. BERT for Joint Intent Classification and Slot Filling

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/212364.html

(0)
上一篇 2021年12月16日
下一篇 2021年12月16日

相关推荐

发表回复

登录后才能评论