# **基于知识图谱的医生推荐系统**
本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系。疾病自诊主要通过利用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': '傅立军,男,主任医师,教授,医学博士,博士生导师,心内科主任,国家卫计委先天性心脏病介入培训基地导师。从事小儿心血管疾病的诊疗二十年,尤其擅长于先天性心脏�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统(链接补)
资源推荐
资源详情
资源评论
收起资源包目录
领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统(链接补) (115个子文件)
scrapy.cfg 249B
box.css 2KB
index.css 257B
disease_gaoxueya.csv 99.92MB
gaoxueya-30992.csv 2.64MB
doctors_gaoxueya.csv 2.42MB
gaoxueya-1.csv 163KB
data16.csv 328B
.gitignore 176B
.gitignore 176B
.gitignore 47B
.gitignore 47B
.gitignore 47B
news.html 12KB
single.html 12KB
index.html 12KB
gallery.html 9KB
contact.html 7KB
services.html 5KB
fifa16.html 3KB
提交代码.iml 552B
hdf.iml 445B
基于知识图谱的医生推荐系统_爬虫组件.iml 395B
recommend.iml 352B
39crawler.iml 352B
yishen.jpg 199KB
syringe.jpg 23KB
d3.js 495KB
fifa16.js 16KB
chart.js 3KB
rels_symptom.json 461KB
rels_commonddrug.json 171KB
rels_check.json 147KB
rels_category.json 114KB
rels_acompany.json 92KB
diseases.json 43KB
symptoms.json 24KB
drugs.json 20KB
checks.json 9KB
departments.json 743B
LICENSE 1KB
bert.log 3.4MB
bert_bilstm_crf.log 1.89MB
bert_bilstm.log 1.72MB
bert_crf.log 1.7MB
preprocess.log 306KB
readme.md 18KB
.name 14B
ent2id_dict.pkl 498B
id2query.pkl 498B
img_2.png 195KB
img_3.png 128KB
img_4.png 113KB
img_5.png 109KB
img4.png 96KB
img.png 41KB
image2.png 15KB
img_1.png 15KB
main_spider.py 27KB
MinHash.py 13KB
main.py 11KB
preprocess.py 11KB
build_kg_utils.py 11KB
config.py 10KB
main.py 7KB
MinHashLSHForest.py 6KB
decodeUtils.py 5KB
cutSentences.py 5KB
modules.py 4KB
bert_ner_model.py 4KB
bert_ner_model.py 4KB
try_minhash.py 4KB
trainUtils.py 4KB
main.py 4KB
settings.py 4KB
config.py 3KB
config.py 3KB
predict.py 3KB
predict.py 3KB
commonUtils.py 3KB
metricsUtils.py 2KB
middlewares.py 2KB
pipelines.py 2KB
text_predict.py 1KB
bert_base_model.py 1KB
bert_base_model.py 1KB
items.py 1KB
dataset.py 1000B
main.py 528B
doctor_find.py 477B
__init__.py 161B
text.py 30B
__init__.py 0B
__init__.py 0B
__init__.py 0B
spiders_run.spec 1008B
Project_Default.xml 3KB
Project_Default.xml 3KB
modules.xml 356B
misc.xml 300B
共 115 条
- 1
- 2
汀、人工智能
- 粉丝: 9w+
- 资源: 409
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页