这是我ehr-journey项目的一个命名实体识别的子项目,主要实现基于中文预训练字向量finetune的Bert与BiLSTM模型的网络。演示使用了CCKS2019task1数据集,并实现了django接口。
本人只是个NLP的新手,目前只是个玩具,欢迎大佬们指正。
- numpy==1.16.4
- gensim==3.8.0
- pytorch-transformers==1.1.0
- torch==1.1.0
- TorchSnooper==0.7
- Django==2.0.5
- scikit-learn==0.21.3
- tqdm==4.23.4
CCKS2019任务一:面向中文电子病历的命名实体识别 数据
共实现了BiLSTM, BiLSTMCRF, Bert, BertCRF, BertBiLSTMCRF
-
Bert部分参考了pytorch_transformers,预训练模型为中文预训练BERT-wwm
-
BiLSTM的预训练词向量使用的是 word2vec的预训练词向量(Baidu Encyclopedia 百度百科 + Word + Character + Ngram 300d ) 可在 Chinese Word Vectors 中文词向量 下载
-
CRF模型部分参考了SLTK
参数配置在configs
下,下载数据集和预训练模型和词向量,放在指定位置,修改参数,运行 train.sh
训练完成后,配置config.yml
内的model_class
参数,运行
python main.py --task eval
labels/F1-score | BiLSTM | BiLSTMCRF | Bert | BertCRF | BertBiLSTMCRF | support |
---|---|---|---|---|---|---|
O | 1.00 | 1.00 | 0.95 | 1.00 | 1.00 | 386687 |
B-LABCHECK | 0.86 | 0.86 | 0.40 | 0.86 | 0.90 | 227 |
I-LABCHECK | 0.87 | 0.87 | 0.45 | 0.91 | 0.93 | 692 |
B-PICCHECK | 0.83 | 0.83 | 0.35 | 0.86 | 0.87 | 185 |
I-PICCHECK | 0.84 | 0.85 | 0.32 | 0.90 | 0.90 | 525 |
B-SURGERY | 0.79 | 0.86 | 0.32 | 0.86 | 0.86 | 225 |
I-SURGERY | 0.93 | 0.93 | 0.43 | 0.95 | 0.96 | 2386 |
B-DISEASE | 0.81 | 0.83 | 0.34 | 0.85 | 0.86 | 814 |
I-DISEASE | 0.83 | 0.84 | 0.36 | 0.85 | 0.87 | 5306 |
B-DRUGS | 0.88 | 0.90 | 0.31 | 0.94 | 0.95 | 354 |
I-DRUGS | 0.89 | 0.91 | 0.40 | 0.94 | 0.94 | 954 |
B-ANABODY | 0.88 | 0.88 | 0.73 | 0.91 | 0.90 | 1636 |
I-ANABODY | 0.82 | 0.85 | 0.44 | 0.86 | 0.86 | 2697 |
macro avg | 0.86 | 0.88 | 0.44 | 0.90 | 0.91 | 402688 |
运行方式
python manage.py runserver 0.0.0.0:8000
传入数据
[{"sentence":"入院后完善相关辅助检查,给予口服活血止痛、调节血压药物及物理治疗,患者血脂异常,补充诊断:混合性高脂血症,给予调节血脂药物治疗;患者诉心慌、无力,急查心电图提示:心房颤动,ST段改变。急请内科会诊,考虑为:1.冠心病 不稳定型心绞痛 心律失常 室性期前收缩 房性期前收缩 心房颤动;2.高血压病3级 极高危组。给予处理:1.急查心肌酶学、离子,定期复查心电图;2.给予持续心电、血压、血氧监测3.给予吸氧、西地兰0.2mg加5%葡萄糖注射液15ml稀释后缓慢静推,给予硝酸甘油10mg加入5%葡萄糖注射液500ml以5~10ugmin缓慢静点,继续口服阿司匹林100mg日一次,辛伐他汀20mg日一次,硝酸异山梨酯10mg日三次口服,稳心颗粒1袋日三次,美托洛尔12.5mg日二次,非洛地平5mg日一次治疗,患者病情好转出院。","model_class":["BertBiLSTMCRF"],"dataset": "CCKS2019"}]
输出结果
'{"手术": [], "影像检查": ["心电图", "心电图"], "解剖部位": ["心"], "疾病和诊断": ["混合性高脂血症", "心房颤动", "t段", "冠心病", "不稳定型心绞痛", "心律失常", "室性期前收缩", "房性期前收缩", "心房颤动", "高血压病3级极高危组"], "实验室检验": [], "药物": ["西地兰", "葡萄糖", "硝酸甘油", "葡萄糖", "阿司匹林", "辛伐他汀", "硝酸异山梨酯", "稳心颗粒", "美托洛尔", "非洛地平"]}'
本段数据sentence来源于CCKS2017
- 本项目针对中文电子病例命名实体任务,实现了一个基于Bert和Bilstm的命名实体识别模型并实现了对应接口
- 观察接口部分的输出结果,可以看出由于数据与模型训练数据来源于不同医院所以效果上有所下降,后续可以扩大训练数据量,使用自适应的训练看是否能提升模型表现。
- 观察Bert模型的结果,训练过程中可能还存在某些问题,后续将逐步修改。
- 考虑引入医疗知识图谱嵌入的思路,并使用同义词、同类词对目前的数据做数据增强观察效果。