- 生成数据集
医生给的标签格式
将命名实体和标签当成jieba分词中的分词和词性,更新到jieba词典中,然后对病历文档进行分词,按照BIO标注每个字,每句话结束用空格分开。
按照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
- 模型创建
- 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,在验证集上做一次验证
模型保存