# **基于知识图谱的医生推荐系统**
本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系。疾病自诊主要通过利用BERT+CRF+BiLSTM的医疗实体识别, 建立医学知识图谱,
从而实现基于患者问诊文本的疾病初诊。这个功能帮助患者初步了解自身的疾病情况并为下一步与医生的交流提供支持。
第二个功能是医生推荐。本平台采用基于Jacard距离的Minhash和minhashLSHForest算法来进行推荐,
匹配患者的咨询文本和医生的历史问诊信息,从而为患者推荐最适合的医生。最后我们使用django框架进行项目发布。
## 1.项目框架
![contents](./image.png)
## 2.数据采集
本项目除了使用公开的医疗数据集外,还采集了中国领先医疗平台的数据集。
`spiders`模块提供了数据采集的信息。
39crawler用于获取39健康网的数据,hdf用于获取好大夫网的数据(scrapy)。
我们还提供了编译后的代码程序,感兴趣的同学可以通过百度网盘获取。
链接:https://pan.baidu.com/s/149ttC2KJJLA9HJl8YYKkLg
提取码:3k2v
运行程序在dist文件夹中,双击spider_run.exe即可运行爬虫程序。
爬取指定的疾病信息,在disease.txt加入科室名称(拼音)或者疾病名称(拼音),每一个科室或者科室占据单独一行。
无论你在disease.txt文件中添加多少行,爬虫只会爬取第一行对应的科室或疾病,结果将在程序运行完成后,输出为doctor.csv,disease.csv。
如需爬取第二个疾病,请将第一行科室或者疾病删去,重新运行程序。
## 3.疾病自诊
在疾病自诊模块,平台会读取用户疾病描述的语义信息,首先进行文本预处理,然后通过实体识别模型抽取出其中的关键成分,即:疾病症状、并发症、身体部位等医学实体。然后,这些医学实体会输入到平台后端的知识图谱(基于大规模数据集构建)中。最终,通过知识图谱的快速查询和计算,平台将返回基于患者疾病描述的疾病推断以及相应的概率值。同时,疾病相关的介绍、需要去就诊的科室和疾病多发人群的相关信息也会推送给用户。
### 3.1. 医学实体识别
医疗实体识别是指从给定句子中识别出医疗实体。在本项目中,需要从患者咨询的病情描述中识别出疾病、症状、科室等多种类型的医疗实体,找到与疾病特征相关的关键词。
`entity_extract`模块提供了有关医学实体识别的有关信息。
由于模型过大因此并未放置在项目文件路径下,需要的同学可以通过**百度网盘**获取相关的代码和数据文件:
链接:https://pan.baidu.com/s/1KPTUCe4rN2WtYRiUkoRSMA
提取码:11dt
~~~~
输入:汪主任您好,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**`模型完成后续医疗实体识别的任务。
![contents](./image2.png)
### 3.4. 知识图谱构建
为了进行准确的疾病诊断,我们依托于大规模数据集构建知识图谱。
`build_kg`模块提供了有关知识图谱构建的信息。
我们将应用于疾病自诊这一模块的所需实体标记为诊断检查项目、科室、疾病、药品、患病的部位、疾病症状、患病程度,在用户输入一段文本后,我们首先通过实体识别将以上这些关键实体识别出来。
通过事先考察,我们发现在进行疾病诊断的过程中,不仅仅是以身体的症状为依据,也有许多其他的所属关系可供我们参考。因此在进行关系抽取中,我们将各个实体间的关系分为8类,分别为属于、疾病常用药品、疾病对应科室、疾病别名、疾病所需检查、疾病部位、疾病症状、疾病并发疾病。我们通过以上8类关系判断在知识图谱中实体间两两之间的关系,从而计算出患该种疾病的概率。定义知识图谱实体间关系的描述性统计特征如下表所示。
![contents](./img.png)
## 4. 医生推荐
在医生推荐模块,平台期望寻找到历史数据中与用户最相似的患者,并找到与之对应到相应的医生,来完成个性化的推荐。具体而言,平台首先通过用户的描述文本获得其中的医学实体,即:一段文本到多个token的映射。然后,将每一个实体都采用词向量的形式进行表示。紧接着,Minihash和MinihashLSHForest算法连接了两端,即:用户的描述文本和数据库中医生的历史问诊记录。平台使用jacard距离来计算二者的相似性,相似度高的被认为有较高的匹配度。最后,平台通过匹配度较高的问诊记录来推荐医生。
`recommend`模块提供了有关知识图谱构建的信息。
![contents](./img_1.png))
~~~~
输入:一周前稍感胸闷,入院检查,心脏彩超,腹部彩超正常,心脏冠状动脉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': '傅立军,男,主任医师,教授,医学博士,博士生导师,心内科主任,国家卫计委先天性心脏病介入培训基地导师。从事小儿心血管疾病的诊疗二十年,尤其擅长于先天性心脏�
程序员张小妍
- 粉丝: 1w+
- 资源: 3474
最新资源
- (175586626)数字图像处理复习资料.docx
- 24WDC-DC矿用本质安全型电源的设计本安电源开关电源 基于反激变器的矿用本质安全性电源,输出端设有两级保护,符合最小燃点要求,有过压过流保护功能 包括:设计说明书,电路原理图A3图纸,仿真文件
- python入门的建议和资源.zip
- (175737404)java实现简单坦克大战
- (175964398)希尔伯特黄变换matlab程序
- 基于java+springboot+mysql+微信小程序的刷题系统 源码+数据库+论文(高分毕业设计)t.zip
- (176132802)51单片机学习代码-普中51单片机.zip
- 基于java+springboot+mysql+微信小程序的青少年科普教学系统平台 源码+数据库+论文(高分毕业设计).zip
- 基于java+springboot+mysql+微信小程序的社区车位租赁系统 源码+数据库+论文(高分毕业设计).zip
- (176420008)电赛-数控直流稳压电源proteus仿真+程序资料.rar
- PCIe No Snoop及TPH/DDIO技术解析与优化
- (176445450)基于Spring Boot+Vue 3+Element-Plus+Vue-Router+Pinia+Vant的电商管理系统源码
- 三菱FX3U与2台台达温控器modbus通讯案例 功能:三菱FX3U与2台台达温控器进行modbus通讯 实现设定温度,设定温度探头型号,读取实际温度 配件:三菱FX3U的PLC,FX3U的485
- 基于java+springboot+mysql+微信小程序的微信平台签到系统 源码+数据库+论文(高分毕业设计).zip
- 基于java+springboot+mysql+微信小程序的网络安全科普系统 源码+数据库+论文(高分毕业设计).rar
- 基于java+springboot+mysql+微信小程序的水果销售系统 源码+数据库+论文(高分毕业设计).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈