电子病历命名实体识别NER

  • 生成数据集

医生给的标签格式

将命名实体和标签当成jieba分词中的分词和词性,更新到jieba词典中,然后对病历文档进行分词,按照BIO标注每个字,每句话结束用空格分开。

https://images2017.cnblogs.com/blog/985935/201709/985935-20170920141138571-870638322.png      https://images2017.cnblogs.com/blog/985935/201709/985935-20170920141138868-794814302.png  

按照1:2:12的比例将病历数据保存到dev/test/train三个文件中

 

  • 数据加工

1、将数据转换成BIOES标注,增加了ES,因为标注信息变多了特征会更丰富。

2、给每个char和tag分配一个id,得到一个包含所有字的字典dict,以及char_to_id, id_to_char, tag_to_id, id_to_tag, 将其存在map.pkl中

3、将数据按照sentences按长度排序,划分为若干batch,每批按最长句子的长度进行padding

  • 模型创建
  1. model_inputs

字符特征(batchsize,100)通过embedding_lookup字向量字典得到

分词位置特征(batchsize,20)通过分词后字的位置得到

embedding=字符特征(batchsize,100)+分词位置特征(batchsize,20)

embedding=dropout(embedding)

2、IDCNN_layer

模型是4个大的相同结构的Dilated CNN block拼在一起,每个block里面是dilation width为1, 1, 2的三层Dilated卷积层,卷积核个数100,padding=same

IDCNN对输入句子的每一个字生成一个logits,这里就和biLSTM模型输出logits之后完全一样

3、logits for tags

idcnn_outputs= [batch_size, num_steps, emb_size]

return= [batch_size, num_steps, num_tags]

4、loss_layer

crf_log_likelihood在一个条件随机场里面计算出每个词分类的最大似然概率

5、viterbi_decode

维特比解码出序列概率最大时每个词对应的标签

  • 模型训练

迭代100epoch

每100batch打印一下平均loss,在验证集上做一次验证

模型保存

 

猜你喜欢

转载自blog.csdn.net/qq_15111861/article/details/81319111