NER命名实体识别+bert的医疗实体及事件抽取

NER本质上是一个分类问题。利用bert对文本进行编码,对编码接入全连接或lstm+CRF,接入softmax即可得到每个类别的概率,最大概率对应的类别即为对应字的类别。
数据:病例本标签数据(数据在比赛https://www.biendata.com/competition/ccks_2020_2_1/)中,标签一共6类,分别为[‘药物’, ‘实验室检验’, ‘疾病和诊断’, ‘手术’, ‘影像检查’, ‘解剖部位’]。
本案例的代码是修改github上的项目而来:
https://github.com/ProHiryu/bert-chinese-ner

一、利用bert预训练模型对文本进行编码。

  1. bert模型下载
    bert模型构架:https://github.com/google-research/bert
    bert中文预训练模型:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
    下图是bert中文预训练模型的文件内容:
    NER命名实体识别+bert的医疗实体及事件抽取_第1张图片
  2. bert模型的输入
    bert模型的输入是中文文本的字和对应的类别(因为中文的词量很多,所以分析字效果比较好)。类别利用BIO进行分析(也可以使用BIOS、BIOES等等,可以根据需要使用标注方法,也可以使用自定义的类别标注)。将B、I、O和实体类别进行组合,得到分类的类别种类,如下:
    在这里插入图片描述
    对病例本的训练文本进行整理标注,得到bert的输入数据示例如下:
    NER命名实体识别+bert的医疗实体及事件抽取_第2张图片
    3.bert模型的架构加载
import  bert import modeling
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_embeddings
    )
#取出bert模型中的序列数据
output_layer = model.get_sequence_output()

4、bert中文预训练模型的加载

tf.train.init_from_checkpoint(init_checkpoint, assignment_map)

二、分类层的接入

在bert模型中取出其中每一层的隐含层序列,组合后输入全连接层(或lstm+CRF层),经过softmax输出获得每一类的概率。

#对output_layer数据接入全连接层(或者lstm+CRF)
logits = tf.matmul(output_layer, output_weight, transpose_b=True)
logits = tf.nn.bias_add(logits, output_bias)

你可能感兴趣的:(自然语言处理)