怎么算 实体识别_命名实体识别总结(待续)

NER刚刚开始做的时候,主要是依赖特征工程,配合SVM, HMM,CRF等模型使用。之前听李宏毅老师说过一段历史,CRF用来做NER之类的序列标注问题开始的时候很火,后来证明了其实本质上还是HMM,经过推导确实可以发现,CRF的特征用转移和发射概率的时候,跟HMM等价,但是CRF可以加很多手工特征,HMM却不好做这一点。

NER目前的baseline是字符级别的IDCNN/LSTM/Bert+CRF,主要利用了IDCNN/LSTM/Bert提取上下文语义特征能力,CRF建模状态转义的能力。字符级别是不分词,预测每个中文字符的BIO标签。深度学习前期主要是LSTM/IDCNN + CRF,随着Bert等大规模预训练模型出来之后,就加bert上去。但是Bert模型主要是基于transformer的,其position-embedding是绝对位置编码,缺少相对位置编码的能力

下面简单介绍一下流程:

train和inference阶段如下

1、train:LSTM/Bert提取上下文特征,送入CRF layer

CRF layer将上下文特征转化为发射score,最大化路径概率从而优化crf layer的两个weights,以及底层LSTM/Bert的参数

目标:最大化路径的对数似然概率

99ee3a21bbee48f496c6440ee512aad2.png

2、inference:得到的是转移score和发射score,需要用动态规划算法来算出每个tag的前向生成概率,用verterbi算法解码,得到最佳路径

整体架构如下:

08d0422ed8eff4fb9acb921fb59f1d23.png

对应的keras代码如下

def lstm_crf(n_words, embedding_size, out_dim):
    inp = Input(shape=(None, ))
    # 提取上下文特征
    x = Embedding(input_dim=n_words, output_dim=embedding_size, input_length=maxlen)(inp)
    x = Bidirectional(LSTM(units=128, return_sequences=True, recurrent_dropout=0.5))(x)
    # 定义CRF
    crf_layer = CRF(out_dim, sparse_target=True)
    x = crf_layer(x)
    model = Model(inputs=inp, outputs=x)
    model.compile(optimizer='adam', loss=crf_layer.loss_function, metrics=[crf_layer.accuracy])
    return model

字符级编码的改进

End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF, 2016年的paper,非常经典。主要思路是针对英文字符,用CNN+Pooling的方法得到字级别的embedding,与Word的embedding concatenate起来一起送入LSTM中训练。

0824c653869d18c8d8681f9af29775ca.png

a279c7b58766fbb45114ce508e4ccfb7.png

中文分词与实体识别联合训练

中文分词和实体识别其实可以起到很好的互补作用

ACL 16年的论文,其实也很好设计,就是一个multi-task,放一张图

共用底层的LSTM特征,NER引入了语法特征,实现了两个任务共同学习

d61d4d71b07852ad3eb5bef33dacc459.png

Lattice LSTM

ACL 18年的paper,分词结果会造成NER的错误,作者设计了一种门机制的lattice lstm来选择latent Word(潜在的分词结果)。模型架构如下,新增的红色lstm cell是为了抽取分词的Word cell state。横向的lstm cell不是普通的lstm,而是多输入lstm,每个输入代表一种分词结果的Word cell state,通过门机制去选择哪个分词结果。

bd052143a3948a85d4c29a93670bf1d1.png

如何抽取latent Word 的cell state,通过单输入的lstm cell,输入分词起始词的hidden state,以及分词的Word embedding,得到分词的cell state。

61c2b2bb7c03f4c96fe89d1e56902a95.png

处理到每个字符的时候,还输入潜在分词的Word cell state,在计算memory cell state的时候,所有潜在分词的Word cell state,以及当前计算的candidate memory cell state通过门机制去选择,加权

57b682fde7cf224c15dce760bca3644f.png

例如,处理到“桥”的时候,查表得出“大桥”和“长江大桥”。分别得到“大桥”(“大”hidden state+“大桥”embedding)的cell state,“长江大桥”的cell state,输入“桥”的lattice lstm cell。

lattice的缺点是不支持batch(每个句子里面词的潜在分词结果不同),并且对于识别新词的效果差(毕竟强烈依赖此表)。

知识图谱辅助(细粒度分类)

AAAI18的论文,用于细粒度实体分类,模型也很简单,像是来凑数的,知识库的embedding可以用trane得到,通过entity embedding对mention上下文的attention加权实现分类。

3f46faf4d3d4b06dc3627084a311770d.png

实体识别与实体链接联合抽取

Joint Learning of Named Entity Recognition and Entity Linking

四个区域

1、buffer:还没有处理的单词

2、stack:实体识别出来的实体,准备进行实体链接

3、output:处理完的

过程如下,具体细节论文描述的不是很清楚

4dc0d1cdc82813c7eb609e57457b2593.png

文档级别信息利用

Improving Clinical Named Entity Recognition with Global Neural Attention

NER的文章大多局限于一个句子,往往没有利用全局信息,特别是一些医疗文档里面,判断症状等等,全局信息很重要。paper提出了一种基于注意的神经网络结构来利用文档级的全局信息来缓解这一问题。一方面从具有神经注意的预训练双向语言模型(Bi-LM)表示的文档中获取全局信息,利用未标记数据的预训练Bi-LM的参数可以传递到NER模型中,进一步提高性能。另一方面,类似hierarchy attention的架构,用sentence embedding做attention,具体来说,就是句子的每一个token的hidden state,都作为key去关注document的各个句子的sentence embedding,得到attention vector之后concatenate到原来的token hidden state去。这里,只用了第一层LSTM 的hidden state。

4f21503e587e68a73c8a0dc3b8b0f12a.png

实验结果如下(提升的很不明显,加入了全局信息之后)

ab8b18d88f16b59fdee907447ab3069c.png

相对位置编码

Leveraging linguistic structures for named entity recognition with bidirectional recursive neural networks

前面提到transformer用的position embedding是绝对位置编码,不能很好的表示词于词之间的相对位置关系,从而不能很好的关注上下文以及其边界。因此,改进的transformer采用相对位置编码。另外,算attention的时候不进行scale,意义是让attention weighted更加sharp,切分边界更加准确。

22500b1a008c1e6feec578e85cd8785a.png

为了保证距离性质和方向性质,论文提到的attention计算过程如下,感觉跟transformer-XL很相似。

2351904090d5dd7aae0404a753ac91c1.png
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值