前两章咱们别离介绍了NER的基线模型Bert-Bilstm-crf, 以及多任务和对立学习在处理词鸿沟和跨范畴搬迁的处理计划。这一章咱们就词汇增强这个中文NER的核心问题之一来看看都有哪些处理计划。以下猜测结果和代码详见Github-DSXiangLi/ChineseNER。Repo里上传了在MSRA上练习好的bilstm_crf_softlexicon模型以及serving相关的代码, 能够开箱即用哟~

第一章提到过中文NER的遍及运用字符粒度的输入,然后防止分词过错/分词粒度和NER粒度不一致约束模型体现的天花板,以及词输入OOV的问题。可是字符输入会有两个问题

  • 缺失了字符在词汇中的语义表达
  • 丢失了词鸿沟信息

有人说不要担心咱们有Bert!能够直接用预练习言语模型去提取通用的包括上下文的文本信息,但运用Bert仍是几个问题

  • infer速度在部分场景不满意要求,因而部分场景运用词汇增强是为了在确保推理延时的前提下,去迫临bert的性能
  • Bert在部分垂直范畴的体现一般,因而需求范畴内的词汇信息加持
  • Bert的信息提取愈加大局,NER的辨认需求部分信息,因而依旧会存在鸿沟辨认过错的问题

词汇增强的方法主要分为两种

  • Embedding增强:包括softword, Ex-softword, 以及去年的新贵SoftLexicon,它们对模型结构无任何要求只经过引进带有词汇/分词信息的Embedding达到词汇增强的意图,更灵活且SoftLexicon的作用拔群
  • 特别模型结构类:Lattice-LSTM出发的各种改良,例如用CNN替换LSTM结构的LR-CNN,改造transformer positional encoding的FLAT等等。

Embedding增强

Softword

最简单引进词鸿沟信息的计划,便是直接引进分词B/M/E/S的标签。这儿我直接用了jieba,当然如果有用目标数据集练习的Segmentator更好,对语句进行分词,根据分词结果对字符别离标示是一个单词的开端(B),中心(M),完毕(E)仍是单个字符(S),如下

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

然后在模型输入侧,把分词的label encoding进行向量表达,用相加或者拼接的方法,参加到已有的token embedding上。

这种方法最简单粗犷,但问题便是其一B/M/E/S根本只引进了词鸿沟信息,关于词本身语义信息的表达有限,其二单一分词器的会由于本身的准确率以及粒度问题引进噪音。在MSRA/People Daily的数据集上,softword对tag等级的猜测根本没啥增益,可是对entity等级的猜测有1个多点左右的提升,关于样本更小的people daily数据集提升更大。

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

Ex-softword

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

已然softword有单一分词器的问题,那如果不考虑分词,直接把该字符在上下文中一切能匹配上词汇信息都参加进来会不会更好呢? 如下所示每个字符会遍历词表,拿到一切包括这个字且满意前后文本的一切分词tag。整个遍历是O(NK)的复杂度其中N是语句长度,K是最长词搜索长度我取了10,Exsoftword的结果如下

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

Ex-softword经过引进更多的分词信息,来含糊单一分词器或许的分词过错问题,不过它并没有对引进的信息相关性/重要性进行区别,虽然引进更多信息,但一起引进了更多噪音,作用相较softword并没啥提升。

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

Softlexicon

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

softlexicon是在Ex-softword的基础上把只运用B/M/E/S的分词tag,变成直接运用一切匹配上的单词。每个字符都得到该字符作为B/M/E/S所能匹配上的一切单词,这样在引进词鸿沟信息的一起也引进词汇本身信息。

default = {'B' : set(), 'M' : set(), 'E' : set(), 'S' :set()}
soft_lexicon = [deepcopy(default) for i in range(len(sentence))]
for i in range(len(sentence)):
    for j in range(i, min(i+MaxWordLen, len(sentence))):
        word = sentence[i:(j + 1)]
        if word in Vocab2IDX:
            if j-i==0:
                soft_lexicon[i]['S'].add(word)
            elif j-i==1:
                soft_lexicon[i]['B'].add(word)
                soft_lexicon[i+1]['E'].add(word)
            else:
                soft_lexicon[i]['B'].add(word)
                soft_lexicon[j]['E'].add(word)
                for k in range(i+1, j):
                    soft_lexicon[k]['M'].add(word)
    for key, val in soft_lexicon[i].items():
        if not val:
            soft_lexicon[i][key].add(NONE_TOKEN)

以上build_softlexicon会得到以下输出

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

作者尝试了对匹配上的单词取对应预练习Embedding然后对B/M/E/S别离算average embedding再concat在一起,可是作用并不好。这种做法和以上Ex-softword相同,没有对词汇的重要性进行区别会引进较多噪音。于是作者是直接在练习集+验证集上统计了匹配上的word count z(w)z(w) 作为该词的embeding权重,在代码里我默认运用了预练习glove的词频,究竟实际标示数据往往较少,直接在练习集上统计词频OOV问题会比较严重。

v(S)=4Z∑w∈Sz(w)e(w)Z=∑w∈B∪M∪E∪Sz(w)v(S) = \frac{4}{Z}\sum_{w\in S}z(w)e(w)\\ Z = \sum_{w\in B \cup M \cup E \cup S} z(w)\\

在作用上softLexicon仍是比较凶猛的,相较bilstm_crf有近6个点的提升【这儿MSRA的样本split和paper有差异,bilstm_crf就低了3个点左右,不过相对提升和paper中近似】。在paper的样本区分中,MSRA数据集上softlexicon的作用只比bert差1个多点,在Weibo/OneNote上要差的多些,究竟词频统计在测验集上的适配程度是练习集越大好的,不过和以下Lattice增强的各种模型相比体现是不相上下的!

比照咱们立刻要聊的Lattice宗族,SoftLexicon能够说是简单粗犷又好使!且由于只比bilstm多了一层O(NK)的词表匹配,infer speed比bert要快一倍多,比lattice快5倍,能够说是非常优秀了!

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

Lattice Family

词汇增强的另一种完成方法便是借助特别的模型结构引进词信息,这一块没有代码复现更多只是了解下模型,究竟结构的约束在运用上没有上面的Embedding计划灵活。

Lattice-LSTM

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

Lattice引进词信息的方法是经过参加一条额定词信息传递途径,把该途径的信息补充到字符途径的躲藏层,一同核算输出h。词信息的传递需求处理两个问题,其一词信息的向前传递怎么核算,其二一个字符或许对应词库中的多个词,例如’长江大桥’中的桥字,会对应‘大桥’,以及长江大桥这两个词,也便是会有两条向前传递的信息,这两个信息怎么加权。

首要,咱们看下词信息怎么向前传递。在上图南京市的比如中,‘市’字能够引进‘南京市’这个词汇信息,于是会产生一条额定的向前传递途径。作者用下标b,e表明词的开端方位和完毕方位,用上标w,c别离表明词汇和字符对应的LSTM途径。于是‘市’对应的t-1躲藏层是‘南’字字符途径的输出层,输入xb,ewx_{b,e}^w是‘南京市’这个词对应的词向量,输出的t躲藏层是方位在‘市’字的cb,ewc_{b,e}^w。如下核算词途径的LSTM。输出gate被省略,由于输出层只有一个便是字符途径对应的输出层,词途径只需求躲藏层。

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

要完成以上核算,需求记录每个字符所能匹配到的一切单词(用来取词embedding),以及每个单词的长度(用来核算上一个hidden state的方位)由于每个输入序列的词方位不同,所以每个序列的LSTM向前传递的方法都不同约束了Lattice-LSTM的batch_size只能为1。Ref2是做了优化的支持batch_size>1的类lattice-LSTM完成,感兴趣的同学能够自己看下~

其次,一个字符或许对应多个匹配词,也便是一个cjcc_j^c或许存在多个以上cb,jwc_{b,j}^w。 以下作者引进额定的input gate来衡量不同词汇途径躲藏层和当时字符向量的相关性,相关性越高该词汇途径权重越高。

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

词汇途径input gate和字符途径的input gate权重进行归一化得到ab,jca_{b,j}^cajca_j^c,归一化确保了多词/单一/无词汇匹配的词汇增强信息可比。得到词汇增强的字符躲藏层后,ojc⋅tanh(cjc)o_j^c \cdot tanh(c_j^c)得到输出信息.

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

LR-CNN

以上Lattice LSTM最显着的问题便是运转功率,LSTM无法并行已经够慢了,Lattice还要约束batch_size=1。还有一个问题便是词向量信息的权重核算只用到了和字符的相关性,并没有考虑上下文语义,或许会导致过错词汇的权重过大引进噪音。例如下图,对‘长’字的判断或许由于过错引进‘市长’这个过错词信息而导致无法辨认B-GPE这个label。针对这两个问题咱们看下LR-CNN是怎么处理的

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

针对LSTM的运转功率问题,最常见的解法便是用CNN替换LSTM。想让CNN提取到更长距离的文本信息,或许会采用stack或者不同window size拼接的CNN cell。这儿作者采用了window_size=2的stack CNN来捕捉n-gram信息,在MSRA数据集上用了50层,filter=300的模型结构。

词汇信息的参加是按照长度分层参加的,长度为2的单词在第二层参加和CNN提取的bigram特征加权,长度为3的在第三层参加和trigram加权。以下CmlC_m^l是根据字符特征stack CNN在l层m方位输出的l-gram特征,wmlw_m^l是对应m方位l长度的词embedding特征,加权方法和Lattice相同,都是用词向量和当时CNN层n-gram向量的相似度别离核算input_gate i1i_1和forget_gate f1f_1,正则化后加权得到l层m方位的特征向量。

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

以上向前传递的CNN,依旧无法处理词汇冲突的问题,由于词向量权重仍是用当时的n-gram信息和词的相似度核算的。咱们需求引进更大局包括上下文的语义特征来调整词向量的权重。LR-CNN把stack CNN的top层作为大局语义信息的表达。以上stack CNN向前传递到L层之后,需求用L层的输出对1~L-1层的特征输出进行调整,也便是所谓的Rethinking。调整方法便是在以上的attention核算中参加包括大局信息的顶层CNN特征向量XmLX_m^L,核算考虑大局语义的部分词汇重要性。

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

以上会得到1~L层每个方位调整后的Xm1,…XmLX_m^1,…X_m^L,然后用Multi-scale Feature Attention对每个方位1~L层的特征进行加权得到m方位的输出特征进入CRF进行解码猜测。简单解说下smls_m^l,便是l层m方位的Conv Block核算得到的k个filter进行求和得到scaler,把这个scaler作为该方位Conv Block特征重要性的度量,细节详见Ref4

中文NER的那些事儿3. SoftLexicon等词表增强详解&代码实现

LR-CNN在不丢失Lattice-LSTM作用的前提下比Lattice要快3倍左右,不过仍是比SoftLexicon慢一倍多。那词汇增强咱们先说这么多,根据transformer的TENER和FLAT放到后面和奥妙的positional encoding一起再说咯~


Reference

  1. [Lattice-LSTM]Chinese NER using lattice LSTM, 2018
  2. [Batch Lattice] An Encoding Strategy Based Word-Character LSTM for Chinese NER
  3. [LR-CNN]LR-CNN:CNN-Based Chinese NER with Lexicon Rethinking, 2019
  4. [Mutli-scale Feature Attention]Densely Connected CNN with Multi-scale Feature Attention for Text Classification
  5. [softword]Unsupervised Segmentatino Helps Supervised Learning of Character Taggering for Word Segmentation and Named Entity Recognition
  6. [Positional Embedding]Named Entity Recognition for Chinese Social Media with Jointly Trained Embeddings
  7. [Soft-Lexicon] Simple-Lexicon:Simplify the Usage of Lexicon in Chinese NER
  8. zhuanlan.zhihu.com/p/77788495
  9. zhuanlan.zhihu.com/p/142615620
  10. zhuanlan.zhihu.com/p/166496466
  11. www.paperweekly.site/papers/note…