查看原文
其他

【NLP-NER】如何使用BERT来做命名实体识别

小Dream哥 有三AI 2020-09-08

命名实体识别(Named Entity Recognition,NER)是NLP中一项非常基础的任务。NER是信息提取、问答系统、句法分析、机器翻译等众多NLP任务的重要基础工具。


上一期我们详细介绍NER中两种深度学习模型,LSTM+CRF和Dilated-CNN,本期我们来介绍如何基于BERT来做命名实体识别任务。


作者&编辑 | 小Dream哥

1 引入BERT

笔者在之前的文章中介绍过BERT,想要回顾的同学可以点击下面的链接,这里就不再介绍BERT的结构了。

【NLP】 深入浅出解析BERT原理及其表征的内容

鉴于BERT的强大,在下游任务中,引入BERT是很自然的想法。像谷歌这些资源丰富的大佬,帮我们预训练好了模型,并且开源出来,当然要好好利用。这里就介绍下,如何基于谷歌开源出来的BERT base模型,进行fine tune,做NER任务。

2 获取BERT预训练模型

BERT源码可以从google-research的github中获取:

https://github.com/google-research/bert

在其GitHub中,也公布了获取BERT Chinese的预训练模型,正是我们需要的,链接如下:

https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

对下载的压缩文件进行解压,可以看到文件里有五个文件,其中bert_model.ckpt开头的文件是负责模型变量载入的,而vocab.txt是训练时中文文本采用的字典,最后bert_config.json是BERT在训练时,可选调整的一些参数。


BERT的代码主要分为两个部分:

1.预训练部分,其入口是在run_pretraining.py。


2.Fine-tune部分。Fine-tune的入口针对不同的任务分别在run_classifier.py和run_squad.py。其中run_classifier.py适用的任务为分类任务,如CoLA、MRPC、MultiNLI等。而run_squad.py适用的是阅读理解任务,如squad2.0和squad1.1。

那么NER的任务该怎么办呢?那就需要自己动手做一些处理了。NER任务与分类任务很接近,基于run_classsifier.py做一些修改,就能够快速实现我们NER任务的Fine-tune了,下面我们看看,大致需要做哪些修改的工作。

3 修改 processor

任何模型的训练、预测都是需要有一个明确的输入,而BERT代码中processor就是负责对模型的输入进行处理。


在run_classsifier.py文件中我们可以看到,Google对于一些公开数据集已经写了一些processor,如XnliProcessor,MnliProcessor,MrpcProcessor和ColaProcessor。这给我们提供了一个很好的示例,指导我们如何针对自己的数据集来写processor。


参照上述的Processor,结合NER任务的特点,我们需要定义一个NerProcessor来处理NER标记语料,主要的工作就是将语料组织成Estimator能够接受的格式。主要就是实现_read_data,_create_example和get_labels三个函数,具体需要组织成什么样的形式,可以看看源代码。


我们可以实现如下形式的_create_example函数,它读取语料和标记,并且通过InputExample函数,构造成Estimator能够接受的格式。

def _create_example(self, lines, set_type):
   examples = []
   for (i, line) in enumerate(lines):
       guid = "%s-%s" % (set_type, i)
       text = tokenization.convert_to_unicode(line[1])
       label = tokenization.convert_to_unicode(line[0])

  examples.append(InputExample(guid=guid,     text=text, label=label))
   return examples

4 构建模型

首先,我们利用BERT的BertModel类构造BERT结构,然后获取其最后一层的输出:

# 使用数据加载BertModel,获取对应的字embedding

model = modeling.BertModel(
   config=bert_config,
   is_training=is_training,
   input_ids=input_ids,
   input_mask=input_mask,
   token_type_ids=segment_ids,
   use_one_hot_embeddings=use_one_hot_embeddin
   )

# 获取对应的BertModel的输出
embedding = model.get_sequence_output()

然后增加(BiLSTM)CRF层,进行解码:

max_seq_length = embedding.shape[1].value
# 算序列真实长度


used = tf.sign(tf.abs(input_ids))
lengths = tf.reduce_sum(used, reduction_indices=1) 


# 添加CRF output layer
blstm_crf =                   

    BLSTM_CRF(embedded_chars=embedding, 

                        hidden_unit=lstm_size, 

                        cell_type=cell, 

                        num_layers=num_layers,

                        dropout_rate=dropout_rate, 

                        initializers=initializers, 

                        num_labels=num_labels,

                        seq_length=max_seq_length, 

                        labels=labels,

                         lengths=lengths, 

                        is_training=is_training)
    rst = blstm_crf.add_blstm_crf_layer(crf_only=True)

5 模型训练

做了上述的准备工作之后,模型的训练只需参照run_pretraining.py的main函数即可。主要的工作有:

1. processors初始化


2. estimator配置


3. 加载训练数据


4. 利用model_fn_builder构造模型,加载模型参数   等。这是Tensorflow中新的架构方法,通过定义model_fn函数,定义模型。然后用Estimator API进行模型的训练,预测,评估等。


5.调用Estimator进行训练过程的控制及正式开始训练等。

总结


利用BERT模型,进行NER任务Fine Tune的大致步骤如上。总的来说,相比于前面的BiLSTM+CRF模型,就是用BERT模型代替了原来的词嵌入部分,利用BERT来进行语义编码,BiLSTM+CRF进行解码。因为需要用BERT,因此在输入部分做了调整,本文介绍的使用estimator来构建和优化模型,也可以完全弃用这一套,自己构建和优化模型。


我们会在知识星球讨论代码的具体实现和优化,感兴趣扫描下面的二维码了解。


读者们可以留言,或者加入我们的NLP群进行讨论。感兴趣的同学可以微信搜索jen104,备注"加入有三AI NLP群"


下期预告:聊天机器人介绍

知识星球推荐

扫描上面的二维码,就可以加入我们的星球,助你成长为一名合格的自然语言处理算法工程师。


知识星球主要有以下内容:


(1) 聊天机器人。考虑到聊天机器人是一个非常复杂的NLP应用场景,几乎涵盖了所有的NLP任务及应用。所以小Dream哥计划以聊天机器人作为切入点,通过介绍聊天机器人的原理和实践,逐步系统的更新到大部分NLP的知识,会包括语义匹配,文本分类,意图识别,语义匹配命名实体识别、对话管理以及分词等。


(2) 知识图谱。知识图谱对于NLP各项任务效果好坏的重要性,就好比基础知识对于一个学生成绩好坏的重要性。他是NLP最重要的基础设施,目前各大公司都在着力打造知识图谱,作为一个NLP工程师,必须要熟悉和了解他。


(3) NLP预训练模型。基于海量数据,进行超大规模网络的无监督预训练。具体的任务再通过少量的样本进行Fine-Tune。这样模式是目前NLP领域最火热的模式,很有可能引领NLP进入一个全新发展高度。你怎么不深入的了解?


转载文章请后台联系

侵权必究

往期精选


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存