用BILSTM+CRF做医疗实体识别,框架为pytorch。
注意,代码已经修改了!!
由于pytorch-crf这个包在计算loss时会自动加上和的转移矩阵,所以我们不用再自己手动在样本和标签前后加这俩标记。
然后评估方法改为了CoNLL-2000的权威评估方法。
python==3.6.2
torch==1.1.0
jieba==0.42.1
提供了100篇电子病历和一个医疗实体词典,使用两种方法对样本进行自动标注:
1: 实体词典+jieba词性标注
2: 实体词典+双向最大匹配
数据和代码在./prepare_date目录下,运行 gen_date.py 即可。
上面那一部分和这个项目是独立的,因为100篇电子病历的数据还是比较小,我另外提供了40M左右的医疗NER数据集,已经标注好了,并划分为了训练集/验证集/测试集。
训练集/验证集/测试集的样本量(一个句子为一个样本)为:101218 / 7827 / 16804.
直接运行 sh start.sh 进行训练,训练过程中会完成验证和测试。
python main.py \
--train True \
--hidden_dim=256 \
--batch_size=128
预测时,修改为 --train False ,再运行 sh start.sh
模型在测试集上的F1值可达0.976,效果比较好。
主要有以下4点:
1 样本和标签前后不需加入和标记,因为pytorch-crf这个包自动会加上这两个标记的转移概率
2 加入了分词特征,做成20维的嵌入,和100维字向量拼接
3 batch分桶,减少zero pad
4 在计算loss时对pad进行mask
5 用CoNLL-2000的评估脚本来评估,权威
BILSTM+CRF的模型主要参考了以下代码,感谢作者:
https://github.com/Alic-yuan/nlp-beginner-finish
CoNLL-2000的python版评估脚本来自:
https://github.com/spyysalo/conlleval.py
《电子病历实体识别》为项目的说明文档
1 IDCNN+CRF的模型
2 BERT+CRF的模型