畛域常识图谱的医生举荐零碎:利用 BERT+CRF+BiLSTM 的医疗实体辨认,建设医学知识图谱,建设常识问答零碎
本我的项目次要实现了疾病自诊和医生举荐两个性能并构建了医生服务指标评估体系。疾病自诊次要通过利用 BERT+CRF+BiLSTM 的医疗实体辨认,建设医学知识图谱,
从而实现基于患者问诊文本的疾病初诊。这个性能帮忙患者初步理解本身的疾病状况并为下一步与医生的交换提供反对。
第二个性能是医生举荐。本平台采纳基于 Jacard 间隔的 Minhash 和 minhashLSHForest 算法来进行举荐,
匹配患者的征询文本和医生的历史问诊信息,从而为患者举荐最适宜的医生。最初咱们应用 django 框架进行我的项目公布。
1. 我的项目框架
2. 数据采集
本我的项目除了应用公开的医疗数据集外,还采集了中国当先医疗平台的数据集。
spiders
模块提供了数据采集的信息。
39crawler 用于获取 39 健康网的数据,hdf 用于获取好大夫网的数据(scrapy)。
运行程序在 dist 文件夹中,双击 spider_run.exe 即可运行爬虫程序。
爬取指定的疾病信息,在 disease.txt 退出科室名称(拼音)或者疾病名称(拼音),每一个科室或者科室占据独自一行。
无论你在 disease.txt 文件中增加多少行,爬虫只会爬取第一行对应的科室或疾病,后果将在程序运行实现后,输入为 doctor.csv,disease.csv。
如需爬取第二个疾病,请将第一行科室或者疾病删去,从新运行程序。
3. 疾病自诊
在疾病自诊模块,平台会读取用户疾病形容的语义信息,首先进行文本预处理,而后通过实体辨认模型抽取出其中的要害成分,即:疾病症状、并发症、身材部位等医学实体。而后,这些医学实体会输出到平台后端的常识图谱(基于大规模数据集构建)中。最终,通过常识图谱的疾速查问和计算,平台将返回基于患者疾病形容的疾病推断以及相应的概率值。同时,疾病相关的介绍、须要去就诊的科室和疾病多发人群的相干信息也会推送给用户。
3.1. 医学实体辨认
医疗实体辨认是指从给定句子中辨认出医疗实体。在本我的项目中,须要从患者征询的病情形容中辨认出疾病、症状、科室等多种类型的医疗实体,找到与疾病特色相干的关键词。
entity_extract
模块提供了无关医学实体辨认的无关信息。
因为模型过大因而并未搁置在我的项目文件门路下,见 我的项目材料
输出:汪主任您好,1 月中旬惯例体检发现 TCT 高度病变,HPV 未查,2020 年 hpv 和 tct 失常。曾经在南京鼓楼医院做了活检,报告如下,诊断写的肿瘤,请问当初这个是不是癌呢?是不是很重大?因为娃太小很胆怯,后续该怎么手术呢?非常迫切希望失去您的回答,不胜感激!输入:{'test': [('hpv', 35), ('tct', 39), ('活检', 56)], 'symptom': [('肿瘤', 68)], 'feature': [('重大', 87)]}
应用示例:# predict.py
args.bert_dir = '../data/bert-base-chinese' # 加载预训练的语义模型
model_name = 'bert_bilstm_crf' # 应用的 model 类型:bert_bilstm,bert_bilstm_crf,bert_crf,bert
id2query = pickle.load(open('../data/id2query.pkl', 'rb')) # 加载词典
ent2id_dict = pickle.load(open('../data/ent2id_dict.pkl', 'rb')) # 加载词典
args.num_tags = len(ent2id_dict)
bertForNer = BertForNer(args, id2query)
model_path = './checkpoints/{}/model.pt'.format(model_name) # 模型存储门路
model = bert_ner_model.BertNerModel(args) # 依据参数实例化模型
model, device = trainUtils.load_model_and_parallel(model, args.gpu_ids, model_path) # 模型加载
model.eval()
raw_text = "汪主任您好,1 月中旬惯例体检发现 TCT 高度病变,HPV 未查,2020 年 hpv 和 tct 失常。曾经在南京鼓楼医院做了活检,报告如下,诊断写的肿瘤,请问当初这个是不是癌呢?是不是很重大?因为娃太小很胆怯,后续该怎么手术呢?非常迫切希望失去您的回答,不胜感激!".strip().replace('(', '(').replace(')', ')').replace('+', '&') # 患者输出的自述文本
print(raw_text)
bertForNer.predict(raw_text, model, device) # 辨认的医学实体
3.2. 反对辨认的实体类型
body:患病部位,如:胃,皮肤
drug:药品,如:产妇康清洗液
feature:患病水平,如:重大
disease:疾病,如:前列腺炎
symptom:疾病症状,如:胃壁增厚
department:科室,如:五官科
test:疾病相关的查看,如:血常规
3.3. 模型抉择
咱们在训练集上测验了 BERT、BERT+CRF、BERT+BiLSTM 和 BERT+BiLSTM+CRF 各模型的准确率、召回率和 micro_f1 值后,咱们发现 BERT+BiLSTM+CRF 模型具备更好的医疗实体辨认能力,因而,在本我的项目中,咱们选用 **BERT+BiLSTM +CRF**
模型实现后续医疗实体辨认的工作。
3.4. 常识图谱构建
为了进行精确的疾病诊断,咱们依靠于大规模数据集构建常识图谱。
build_kg
模块提供了无关常识图谱构建的信息。
咱们将利用于疾病自诊这一模块的所需实体标记为诊断查看我的项目、科室、疾病、药品、患病的部位、疾病症状、患病水平,在用户输出一段文本后,咱们首先通过实体辨认将以上这些要害实体辨认进去。
通过当时考查,咱们发现在进行疾病诊断的过程中,不仅仅是以身材的症状为根据,也有许多其余的所属关系可供咱们参考。因而在进行关系抽取中,咱们将各个实体间的关系分为 8 类,别离为属于、疾病罕用药品、疾病对应科室、疾病别名、疾病所需查看、疾病部位、疾病症状、疾病并发疾病。咱们通过以上 8 类关系判断在常识图谱中实体间两两之间的关系,从而计算出患该种疾病的概率。定义常识图谱实体间关系的描述性统计特色如下表所示。
4. 医生举荐智能零碎
在医生举荐模块,平台冀望寻找到历史数据中与用户最类似的患者,并找到与之对应到相应的医生,来实现个性化的举荐。具体而言,平台首先通过用户的形容文本取得其中的医学实体,即:一段文本到多个 token 的映射。而后,将每一个实体都采纳词向量的模式进行示意。紧接着,Minihash 和 MinihashLSHForest 算法连贯了两端,即:用户的形容文本和数据库中医生的历史问诊记录。平台应用 jacard 间隔来计算二者的相似性,类似度高的被认为有较高的匹配度。最初,平台通过匹配度较高的问诊记录来举荐医生。
recommend
模块提供了无关常识图谱构建的信息。
输出:一周前稍感胸闷,入院查看,心脏彩超,腹部彩超失常,心脏冠状动脉 CT,显示狭隘
输入:[{'Unnamed: 0': 0, 'patient_score': 11, 'patient_online': 2116, 'educate': '传授', 'articleCount': '22 篇', 'spaceRepliedCount': '2116 位', 'totaldiagnosis': '367 位', 'openSpaceTime': '2008-10-22 18:15', 'hot_num': 3.6, 'hospitalName': '上海交通大学医学院从属上海儿童医学中心', 'keshi': '心内科', 'good_at': '先天性心脏病的诊断和染指医治,小儿肺动脉低压的诊治,儿童心肌病的诊断和医治', 'introduction': '傅立军,男,主任医师,传授,医学博士,博士生导师,心内科主任,国家卫计委先天性心脏病染指培训基地导师。从事小儿心血管疾病的诊疗二十年,尤其擅长于先天性心脏病的诊断和染指医治以及肺动脉低压、心肌病的诊治,累计实现先天性心脏病染指医治 3000 余例。中华医学会儿科学分会心血管病学组委员,遗传代谢性心肌病协作组组长 中华医学会心血管病学分会肺血管病学组委员 中国医师协会儿科医师分会心血管疾病业余委员会委员兼秘书长 上海市儿科学会心血管病学组副组长 在国内外发表论文三十余篇。参编专著多部。', 'doctor_title': '主任医师', 'doctor_id': 221603, 'doctorName': '傅立军', 'disease': 'gaoxueya'}, {'Unnamed: 0': 0, 'patient_score': 71, 'patient_online': 8515, 'educate': '传授', 'articleCount': '8 篇', 'spaceRepliedCount': '8515 位', 'totaldiagnosis': '1357 位', 'openSpaceTime': '2009-05-07 16:16', 'hot_num': 4.0, 'hospitalName': '首都医科大学从属北京安贞医院鹤壁市人民医院', 'keshi': '心脏外科核心心血管外科', 'good_at': '冠心病,染指医治;心肌病,心力衰竭,难治性高血压的诊断医治。', 'introduction': '赵全明,博士,首都医科大学传授,博士研究生导师,北京安贞医院心脏外科核心主任医师。1989 年西安医科大学外科硕士毕业,1997 年底法国路易斯巴斯德大学医学院博士毕业,2000 年降职主任医师。善于各种心血管疾病的诊断和医治,重点从事冠心病的临床和钻研,集体实现冠状动脉造影 10000 例,冠心病染指医治(PCI)超过 5000 例。发展了冠心病诊断(冠脉造影,血管内超声 -IVUS, 光学相干断层显像 -OCT,冠脉血流储备分数 -FFR)和简单冠心病染指医治的各种新技术(冠状动脉支架术,钙化病变的旋磨术,支架内再狭隘的药物球囊医治,生物可降解支架临床钻研),并取得丰盛教训。', 'doctor_title': '主任医师', 'doctor_id': 4269, 'doctorName': '赵全明', 'disease': 'gaoxueya'}, {'Unnamed: 0': 0, 'patient_score': 13, 'patient_online': 14327, 'educate': '传授', 'articleCount': '95 篇', 'spaceRepliedCount': '14327 位', 'totaldiagnosis': '3385 位', 'openSpaceTime': '2011-07-06 14:35', 'hot_num': 3.6, 'hospitalName': '首都医科大学从属北京安贞医院', 'keshi': '心脏外科核心', 'good_at': '房颤和简单心律失常的导管融化医治,尤其善于各种类型心房颤动(房颤)、心房扑动(房扑)、房性心动过速(房速)的导管融化,包含心脏外科术后如二尖瓣置换术后、房间隔封堵术后以及射频消融术后复发的房颤、房扑;室性心动过速(室速)和室上性心动过速(室上速);瓣膜病的球囊扩张术,特地是风湿性心脏病二尖瓣狭隘的医治。', 'introduction': '马长生,主任医师,传授,博士生导师。于 1998 年实现国内首例房颤导管消融术,并零碎建设了我国心律失常融化的技术和办法。北京市心血管疾病防治办公室主任 中华医学会心血管病学分会副主任委员 中国医师协会心血管外科医师分会会长 中华医学会心电生理和起搏分会副主任委员 中国生物医学工程学会常务理事兼心律分会主任委员 中国生物医学工程学会染指医学工程分会主任委员 为卫生部有突出贡献中青年专家、科技北京百名领军人才、北京市卫生系统领军人才及 JournalofCardiovascularElectrophysiology、Europace、JournalofInterventionalCardiacElectrophysiology 和 ChineseMedicalJournal 等 30 余种学术期刊编委。3 次获国家科学技术提高二等奖 独创单导管法、“2C3L”术式、倒 U 形导管塑形融化右侧旁路等一系列原创性办法。牵头研制成功自主知识产权的磁定位三维电解剖标测系统和首套房颤导管融化模拟器。主编的《染指心脏病学》《心律失常射频融化图谱》为本业余最具影响的教科书之一。以第一作者或通信作者发表 SCI 收录论文 80 余篇,承当“十二五”国家科技撑持打算、“十二五”国家科技重大专项子课题、“十一五”863 打算、“十五”国家科技攻关项目等省部级以上课题数十项。已受权或布告专利 7 项,其中 PCT 专利 2 项。', 'doctor_title': '主任医师', 'doctor_id': 4255, 'doctorName': '马长生', 'disease': 'gaoxueya'}, {'Unnamed: 0': 0, 'patient_score': 0, 'patient_online': 3151, 'educate': '传授', 'articleCount': '4 篇', 'spaceRepliedCount': '3151 位', 'totaldiagnosis': '115 位', 'openSpaceTime': '2008-12-20 03:09', 'hot_num': 3.5, 'hospitalName': '中国医学科学院阜外医院中国医学科学院阜外医院深圳医院', 'keshi': '心血管外科心血管外科', 'good_at': '冠心病的诊断与染指医治,急性心肌梗死染指医治', 'introduction': '主任医师,传授,博士研究生导师 中国医学科学院阜外医院深圳医院外科管委会主任 外科教研室主任、冠心病核心主任、染指核心主任 美国心脏病学会会员(FACC)、美国心脏协会会员(FAHA);欧洲心脏病学会会员(FESC)。驰名的心血管病学专家,国家级领军人才 地方保健委会诊专家 深圳市医学重点学科(心血管外科)负责人 深圳市重大疾病(冠心病)防治核心负责人 深圳市医防交融心血管病我的项目专家组组长 深圳市医疗卫生三名工程急性冠脉综合征团队负责人 受教育经验:1982 年武汉大学医学部获学士学位(改革开放后首批本科生);1988 年华中科大同济医学院(全日制)硕士学位;1994 年日本国立滨松医大(全日制)博士学位。业余专长:寰球心血管染指手术例数最多和教训最丰盛的的专家之一;各种心血管急重症的诊断与医治;简单冠心病染指医治和长期治理;钻研方向:急性心梗临床与转化医学钻研。工作语言:普通话、英语和日语 中国医师协会胸痛业余委员会副主任委员《中国染指心脏病学杂志》副主编《中华心血管病杂志》等编委《中华医学杂志》等审稿专家 先后建设了中日友好医院、北京安贞医院和北京阜外医院急性心梗救治通道;先后承当国家和省部级钻研我的项目 30 项,共取得 6000 万元基金反对。发表或参加发表文章 550 篇(https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=HONGBING+YANBeijing+&btnG=)。出版著(译)作 60 部(https://book.jd.com/writer/ 颜红兵_1.html?stop=1&book=y&vt=2)。', 'doctor_title': '主任医师', 'doctor_id': 4274, 'doctorName': '颜红兵', 'disease': 'gaoxueya'}, {'Unnamed: 0': 0, 'patient_score': 4, 'patient_online': 4829, 'educate': '传授', 'articleCount': '33 篇', 'spaceRepliedCount': '4829 位', 'totaldiagnosis': '1228 位', 'openSpaceTime': '2009-08-31 10:21', 'hot_num': 3.6, 'hospitalName': '首都医科大学从属北京安贞医院', 'keshi': '心脏外科核心', 'good_at': '冠心病染指医治(支架术)心绞痛 / 心肌梗死诊治 起搏器/除颤器植入 经导管主动脉瓣置入术 肺动脉低压诊治', 'introduction': '聂绍平,男,传授、主任医师、医学博士、博士研究生导师、欧洲心脏病学会专家会员(FESC),美国心血管造影和染指学会国内会员(FSCAI)。现任首都医科大学从属北京安贞医院急诊危重症核心主任。次要从事冠心病染指医治、心肺血管急危重症临床与钻研工作。集体累计实现经皮冠状动脉染指医治(支架术)达 15000 余例,善于简单冠心病染指医治(如钙化病变旋磨术、灵通病变染指医治等)。主持 863 我的项目一项,国家自然科学基金面上我的项目 3 项,以及多项省部级重点项目。', 'doctor_title': '主任医师', 'doctor_id': 4264, 'doctorName': '聂绍平', 'disease': 'gaoxueya'}]
运行示例:# try_minhash.py
df_csv = pd.read_csv('./gaoxueya-1.csv')
# 建设参数
# Number of Permutations
permutations = 128
forest = get_forest(df_csv, permutations)
# Number of Recommendations to return
# 召回 top—n 数目
num_recommendations = 100
# 准确须要的医生 id 数
num_doctors = 5
# 输出测试文本
raw_text = '一周前稍感胸闷,入院查看,心脏彩超,腹部彩超失常,心脏冠状动脉 CT,显示狭隘'
raw_text = raw_text.strip().replace('(', '(').replace(')', ')').replace('+', '&')
# 模型加载
args.bert_dir = '../data/bert-base-chinese'
model_name = 'bert_bilstm_crf' # 应用的 model 类型:bert_bilstm,bert_bilstm_crf,bert_crf,bert
id2query = pickle.load(open('../data/id2query.pkl', 'rb'))
ent2id_dict = pickle.load(open('../data/ent2id_dict.pkl', 'rb'))
args.num_tags = len(ent2id_dict)
bertForNer = BertForNer(args, id2query)
model_path = '../entity_extract/checkpoints/{}/model.pt'.format(model_name)
model = bert_ner_model.BertNerModel(args)
model, device = trainUtils.load_model_and_parallel(model, args.gpu_ids, model_path)
model.eval()
# 辨认测试文本中的医疗实体
text_shiti = path_pre(raw_text, bertForNer, model, device)
# 举荐医生
df = pd.read_csv('./haodaifu/doctors_gaoxueya.csv')
recommend(df_csv, text_shiti,df)
5. 医生服务指标评估体系
医生评估指标在思考经济指标的同时,更应该突出社会效益导向,要体现以病人 为核心,谋求利润的合理化,疏导医生努力提高医疗服务质量。本钻研在大规模主观数据集的根底上,构建了基于医生发文量、患者投票数、医生举荐热度、问诊后患者报道数量、在线服务患者数量和总患者数量六大维度的服务指标评级体系。
6. 我的项目可视化展现
本我的项目的运行依靠 django 框架。
web_server
模块提供了无关平台运行的信息。
6.1. 平台首页
6.2. 疾病自诊
6.3. 医生举荐
6.4. 医生服务指标评估体系
码源链接跳转见文末
码源链接跳转
更多优质内容请关注公号 & 知乎:汀丶人工智能;会提供一些相干的资源和优质文章,收费获取浏览。
本文参加了 SegmentFault 思否写作挑战「摸索编码世界之旅 – 记我的第一份编程工作」,欢送正在浏览的你也退出。