命名实体识别——Name Entity Recognition (NER)是在一段文本中,将预先定义好的实体类型识别出来;它是自然语言处理中一个非常重要且基础的问题。
什么是NER
NER是在一段文本中,将预先定义好的实体类型识别出来。栗 如,如果事先定义好的实体类型包含,“学校”,“地点”等。
给定一句话
武汉大学位于武汉
输出为
武汉大学/学校 位于 武汉/地点
NER如何标注的
B 开始位置、I 中间位置、O 其他类别、S 单字表示一个实体
BIO标注
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
武 | 汉 | 大 | 学 | 位 | 于 | 武 | 汉 |
B-学校 | I-学校 | I-学校 | I-学校 | O | O | B-地点 | I-地点 |
BIOES
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
武 | 汉 | 大 | 学 | 位 | 于 | 武 | 汉 |
B-学校 | I-学校 | I-学校 | E-学校 | O | O | B-地点 | E-地点 |
常用的模型和方法
NER领域常用模型主要划分为传统模型和基于深度学习模型两大类。本文将主要对第二大类模型进行阐述。
第一大类:传统模型包括,基于规则的模型,无监督模型和基于特征工程的浅层有监督模型。
基于规则的模型往往需要词表、词汇和领域知识,(感觉有点像词表匹配)。这种方法准确率高,召回率低,对于新词缺乏发现能力,并且往往需要领域专家帮忙维护知识库。
无监督的方法比较典型的是基于聚类的方法。
有监督的方法就是比较经典的浅层的分类模型或者序列标注。分类模型,如SVM, 决策树, Adaboost等,通常将每个字符的标签当成一个类别进行文本分类;而序列标注模型如CRF等,通常将NER问题理解为一个最大概率序列的问题,根据观测序列(通常指字符)预测隐藏序列(字符的标签)。
第二大类,主要是各种各样的花式Deep learning模型。
注:根据笔者对于各类NER Paper和博客对于相关实验的调研,在NLP领域各种各样的预训练网络如ELMo,GPT,Bert等出现之前,多数实验的结果是:
- 在小数据集上,CRF模型的效果较好,甚至会优于基于Bi-LSTM + CRF的模型;
- 而大数据集上,Bi-LSTM + CRF的NER模型可能效果稍好于CRF模型;
- 最后如果计算资源允许,请用BERT!请用BERT!!请用BERT!!!
深度学习NER模型的主要分三步
第一步
第一步是特征的表示、处理和转化。对原始的输入字符序列进行Embedding,或者在Embedding以外加入一些传统的浅层有监督模型中使用的特征。
第二步
第二步是特征变换、编码。对Embedding进行特征变换、编码,比如使用RNNs, CNNs, Transformers等模型进行建模和学习
第三步
第三步是对标签进行解码(将编码序列解码为标签序列)
特征表示
Word Embedding
将每个词做Embedding,预训练的Embedding一般会使用Glove或者Word2Vec预训练的结果;训练集足够大也可以使用Random的Embedding。这基本上是所有NLP任务中最常见的特征表示方式。
Char Embedding
对每个字符做Embedding,在英文环境下就是每个字母,中文环境下就是每一个字符。
在中文语境下,字符编码也可以基于中文字符的UTF-8或者基于偏旁,笔画的Embedding等
Word&Char Embedding
将以上两种特征表示结合的方式,是在这两种paper中比较推荐的、效果较好的方法。只需要将通过CNN或者RNN等网络处理后的char-level的表示 与word-level的表示进行特征组合,比如Concat即可。
混合表示
在上述特征表示的基础上加入传统的基于特征工程的特征,比如词性特征、标点符号特征等。这一点的整体效果是不确定的。读者可以基于自己的情况进行尝试。
特征变换
通过【特征表示,处理和转化】部分的操作,我们用Lookup Table找到相应字符、词等的Embedding后,将原始文本转化为低阶、稠密的语义向量(矩阵)。【特征变换、编码】部分将承接上一部分的工作,对转化后的语义向量(矩阵)进行进一步操作,对原始的特征进行变换(编码),表征句子的语义信息。
卷积神经网络
CNN作为语义编码的工具,通过卷积核的操作,可以提取相邻关键字符的信息,类似N-gram的思想。
优点:速度快,可以提取相邻字符的信息。
缺点:单独用效果一般,可作为特征提取一部分与其他网络结构提取的特征做结合,长程依赖效果差于RNNs,Transfomer。
循环神经网络
在Attention,Transfomer等思想出现以前,RNNs是NLP领域最常用的特征编码组件,即使是现在,在Bert等网络解决算力问题前,仍然是NLP中非常非常重要的组件。RNNs逻辑也比较简单,如上图3所示,对句子中离散的词进行Lookup操作,通过一个双向RNN网络,用两个方向隐层的输出表征每个词编码了句子语义的表示,可以用网络时间上最后一个隐层的输出表征句子的语义。在此不详细展开。
优点:长程依赖效果好于CNN,在Bert,GPT,XLNET等出现之前,各种花里胡哨的网络结构的效果,基本都可以用两层精调的Bi-LSTM。
缺点:速度会慢于CNN,学术界一般会用LSTM结构,工业届一般会采用GRU结构。
Transformer
上文提到,RNNs在Transfomer出现前在NLP中主流。但是,我感觉,2017年Google发表的《Attention is all you need》以后,再到后来各式各样的预训练网络,Transfomer的地位得到了大幅度上升。
优点:单独使用Self-attention时,效果没有很夸张,和RNNs差不多,可能略差一点;但是在大规模语料上预训练的的Transfomer网络如Bert、ALBERT这种效果可以吊打其他的网络。计算资源充足时,墙裂推荐。
缺点:预训练的网络比较重,前向预测速度比较慢,可能需要单独对op进行优化。
- 预训练模型效果优于非预训练网络;
- 通用语料上训练的预训练语言模型在领域任务上也可以取得较大提升;
- 在小数据集上,实验效果提升明显。
标签解码
【特征表示,处理和转化】操作中,我们用Lookup Table找到相应字符、词等的Embedding后,将原始文本转化为低阶、稠密的语义向量(矩阵)。
【特征变换、编码】部分承接第一步的工作,对转化后的语义向量(矩阵)进行进一步操作,对原始的特征进行变换(编码),表征句子的语义信息。
【标签解码】,最后一步,将承接第二步工作,将句子的语义表示解码为句子中每个字符的标签序列。
分类任务
NER任务中,一般会把训练数据的每个字符的Y标签组织成BIO,BIEO之类的标记。最简单的方式就是把NER问题理解为一个分类问题,单独预测该句子中每个字符的标签。但是这种处理方式通常效果较差,因为这种方式没有考虑到标签之间的关联关系和序列信息。
CRF
最常见的方式是在网络输出的最后一层加CRF层,把待预测的标签当成一个序列,这是目前效果最好的方式。可以充分考虑标签序列的信息。