MedicalKG_QA
一、项目概述
1.1 项目内容
本项目立足医疗领域,数据源包括:
本项目包括以下两部分:
-
基于垂直网站数据的医疗知识图谱构建
- 以疾病为核心的医药知识图谱,7类规模为4.4万的实体, 11类规模约30万实体关系的知识图谱
- 以医生为核心的就诊知识图谱,5类规模为 40万的实体, 4类规模约115万实体关系的知识图谱
-
基于医疗知识图谱的自动问答系统
1.2 项目架构
二、方案介绍
2.1 数据获取
爬虫获取网站内容,直接存入MongoDB,需要抓取的网页信息如图所示:
-
针对寻医问药网站的疾病信息:
2.2 医疗知识图谱构建
2.2.1 数据清洗
2.2.1.1 半结构化数据
对于网页爬虫获取到的数据,需要进行关键信息提取,最好清洗为key:value
形式。
关键信息提取:
信息 | key |
---|---|
医保疾病 | yibao_status |
患病比例 | get_prob |
易感人群 | easy_get |
传染方式 | get_way |
就诊科室 | cure_department |
治疗方式 | cure_way |
治疗周期 | cure_lasttime |
治愈率 | cured_prob |
药品明细 | drug_detail |
药品推荐 | recommand_drug |
推荐 | recommand_eat |
忌食 | not_eat |
宜食 | do_eat |
症状 | symptom |
检查 | check |
成因 | cause |
预防措施 | prevent |
所属类别 | category |
简介 | desc |
名称 | name |
常用药品 | common_drug |
治疗费用 | cost_money |
并发症 | acompany |
2.2.1.2 非结构化数据
本项目暂时未采集非结构化数据,但考虑到知识图谱补全和扩充等后续问题,设计了针对非结构化数据的知识抽取模型。
- 知识抽取系统框架如图所示
2.2.2 图谱设计
确定实体对象,以及根据核心实体对象建立实体关系,最终构建知识图谱。
2.2.2.1 疾病为核心的知识图谱
-
疾病为核心的医药实体
实体类型 中文含义 实体数量 举例 Check 诊断检查项目 3,353 动眼神经检查; 自身溶血试验 Department 医疗科目(科室) 54 耳鼻喉科; 遗传病科 Disease 疾病 8,807 病毒性胃肠炎; 百日咳 Drug 药品 3,828 头孢氨苄甲氧苄啶片; 布林佐胺滴眼液 Food 食物 4,870 三七洋参炖鸡肉; 龙眼鸡片 Producer 在售药品 17,201 瑞森药业盐酸海索那林片; 力邦特 Symptom 疾病症状 5,998 神经纤维过度生长; 异源性ACTH Total 总计 44,111 约4.4万实体量级 -
核心实体属性
实体属性 中文含义 举例 .name 疾病名称 <慢性中耳炎, 名称: 慢性中耳炎> .desc 疾病描述 <蜂蛰伤,描述:蜂蛰伤是由蜜蜂、黄蜂等蜂尾的蜂毒刺刺蜇…> .cause 疾病病因 <鹅掌风,产生原因:手足癣是皮肤癣菌感染手指屈侧、指间…> .cure_department 疾病所属科目 <病毒性肠胃炎,属于:消化内科> .cure_lasttime 疾病持续时间 <肺泡蛋白质沉积症,持续:约3个月> .cure_way 疾病治疗方法 <肺泡蛋白质沉积症,治疗方法:支气管肺泡灌洗> .cured_prob 疾病治疗概率 <肺泡蛋白质沉积症,治疗概率:约40%> .easy_get 疾病易患人群 <鹅掌风,易患人群:无特殊人群> .prevent 疾病预防措施 <蜂蛰伤,预防措施:被蜜蜂螫时,为了减轻疼痛,避免发生…> -
疾病为中心的医药实体关系
实体关系类型 中文含义 关系数量 举例 belongs_to 属于 8,844 <妇科,属于,妇产科> common_drug 疾病常用药品 14,649 <阳强,常用,甲磺酸酚妥拉明分散片> do_eat 疾病宜吃食物 22,238 <胸椎骨折,宜吃,黑鱼> drugs_of 药品在售药品 17,315 <青霉素V钾片,在售,通药制药青霉素V钾片> need_check 疾病所需检查 39,422 <单侧肺气肿,所需检查,支气管造影> no_eat 疾病忌吃食物 22,247 <唇病,忌吃,杏仁> recommand_drug 疾病推荐药品 59,467 <混合痔,推荐用药,京万红痔疮膏> recommand_eat 疾病推荐食谱 40,221 <鞘膜积液,推荐食谱,番茄冲菜牛肉丸汤> has_symptom 疾病症状 5,998 <早期乳腺癌,疾病症状,乳腺组织肥厚> acompany_with 疾病并发疾病 12,029 <过敏性休克,并发疾病,水肿> Total 总计 294,149 约30万关系量级 -
实体、关系可视化
2.2.2.2 医生为核心的知识图谱
-
医生为核心的医疗实体
实体类型 中文含义 实体数量 举例 Doctor 医生 382886 范一宏 Hospital 医院 8196 重庆南川区人民医院 Outpatient 科室 未清洗 骨科(创伤外科) Position 职位 43 主任医师 Province 省份 31 浙江 Total 总计 408024 约40万实体量级 -
核心实体属性
实体属性 中文含义 举例 .name 医生姓名 <陈军,姓名:陈军> .desc 医生简介 <陈军,简介:陈军,男,主任医师。安徽医科大学…> .position 医生职称 <陈军,职称:主任医师> .outpatient 医生科室 <陈军,科室:泌尿外科> .specialty 医生专长 <陈军,擅长:泌尿系统、男性生殖系统及肾上腺各种疾病包括…> .hospital 医生所属医院 <陈军,就职于:苏州市立医院> -
医生为核心的医疗实体关系
实体关系类型 中文含义 关系数量 举例 Belongs_To 医生所在科室 382886 <吴正祥,属于,消化内科> Work_IN 医生所在医院 382886 <吴正祥,就职于,安徽省立医院南区> Position_IS 医生担任职务 382886 <吴正祥,担任,主任医师> Located_IN 医院所在省份 8196 <衡南县中医院,位于,安徽省> Total 总计 1156896 约115万关系量级 -
实体、关系可视化
2.3 问答系统构建
问答系统属于应用层。利用知识图谱强大的辅助搜索能力,我们构建了基于医药知识图谱的自动问答系统。
问答系统的框架流程如下图所示:
-
问题分类
-
构建AC树
- 首先基于
Aho-Corasick
自动机算法构建领域词汇的AC树; - 优点:AC自动机+trie树能实现高效的多模式匹配,在匹配任务中将字符比较转化为状态转移,无需回溯,时间复杂度为
$O(n)$ ,与词典规模无关。
- 首先基于
-
领域词提取
- 通过AC树快速匹配问题中的实体;
-
疑问词提取
- 通过疑问词词典匹配问题中的疑问词;
-
确定问题类型
-
根据问题中的实体和疑问词,确定问题类型;
可供查询的问题类型大致有:
- 疾病基本信息类
- 疾病症状类
- 疾病病因类
- 疾病并发症类
- 疾病与饮食类
- 疾病与药物类
- 疾病检查项目类
- 疾病预防类
- 疾病治疗类
- 疾病易感人群类
- …
-
-
-
问题解析
- 实体节点构建
- 确定问题中的实体,构建{
实体类型:实体
} 字典;
- 确定问题中的实体,构建{
- 问句转CQL
- 根据问题的分类,问题中的实体及实体关系,将问题转化为CQL查询语句;
- 实体节点构建
-
答案搜索
- 图数据库查询
- 用转化得到的CQL语句在数据库中查询;
- 答案包装
- 根据问题类型,将查询到的结果包装后返回。
- 图数据库查询
-
结果展示
2.4 前端界面
构建问答系统前端界面,提高用户体验。
构建Flask项目,引入Bootstrap前端框架,快速创建简洁、美观又功能全面的web界面。
前端页面获取问题,通过POST请求将问题发送到后端,通过QA模型获取结果,返回到页面展示。
- 主页