赞
踩
从无到有搭建一个以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。github链接
参考官网链接
安装依赖库:
sudo apt-get install gnupg
引入秘钥:
wget -qO - https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add -
创建列表文件:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
更新apt库:
sudo apt-get update
安装:
sudo apt-get install -y mongodb-org=4.0.26 mongodb-org-server=4.0.26 mongodb-org-shell=4.0.26 mongodb-org-mongos=4.0.26 mongodb-org-tools=4.0.26
开启MongoDB数据库服务:
sudo service mongod start
输入mongo可连接数据库
show dbs;# 查看所有的数据库
use database; #选用数据库
db.collection.stats() #查看集合的统计信息
注意版本对应,mongodb其他版本在本项目中使用可能会出现问题。
python data_spider.py
在此脚本中,首先建立数据库medical,其分为两个集合,分别为data,jc
其中data中包含每个爬取的病理的如下信息
url:信息来源的网站链接
basic_info:病理的基础信息,包括类别、名字、描述、属性等
cause_info: 生成病理的原因
prevent_info: 预防的方法
symptom:症状信息
inspect_info:检查项目
treat_info:治疗方法
food_info:食物对病理的影响,包含有利于病情的食物,有害于病情的食物和推荐食用的食物
drug_info:适用的药物信息
其中jc为初步抓取检查项目抓取的结果,包含
url:信息来源页的链接
html:从链接抓取到的html信息,供后续做信息提取
在收集的链接中提取上述信息并存储到数据库中,此部分结束。
python build_data.py
首先调用modify_jc函数对数据库中jc集合进行修改完善,具体实施是从html中提取检查项的名称和检查项结果的描述,得到集合jc下的set{‘name’:name, ‘desc’:sesc}
然后遍历数据库中data集合的每个爬取的病理信息,获取名称、简介、所属类别、预防措施、成因、症状、属性、药品推荐、药品明细、并发症等,其中检查项只提取jc集合中出现的项目,食物信息分列为宜食、忌食、推荐三种。
其中并发症提取:
对提取的并发症信息与dict/disease.txt中的疾病字典进行双向最大匹配,将匹配到的疾病存储为集合
下载完成后解压,在bin目录,输入如下命令:
./neo4j start
在浏览器访问127.0.0.1:7474进入nei4j
进入项目根目录,输入命令:
python build_medicalgraph.py
此部分分为两个步骤,分别为创建知识图谱实体节点类型、创建实体关系边。
在创建知识图谱实体节点中,首先读入节点,节点分为8类:药品、食物、检查、科室、药品信息、疾病、症状、疾病信息,然后定义节点和实体的关系,包含科室——科室、疾病——忌吃、疾病——宜吃、疾病——推荐吃、疾病——通用药物、疾病——热门药物、疾病——检查关系、厂商——药物、疾病——症状、疾病——科室、疾病与并发关系。
接着遍历病理集合,获取这些节点和关系的信息。此部分用到节点的信息,节点的信息包括名称、描述、治愈周期、治愈概率等等。
其中疾病信息节点示例:
{
“identity”: 0,
“labels”: [
“Disease”
],
“properties”: {
“prevent”: “1、避免感染分支杆菌病,卡氏肺囊肿肺炎,巨细胞病毒等。
2、注意锻炼身体,提高免疫力。”,
“cure_way”: [
“支气管肺泡灌洗”
],
“name”: “肺泡蛋白质沉积症”,
“cure_lasttime”: “约3个月”,
“cured_prob”: “约40%”,
“cause”: “病因未明,推测与几方面因素有关:如大量粉尘吸入(铝,二氧化
硅等),机体免疫功能下降(尤其婴幼儿),遗传因素,酗酒,微生物感染等
,而对于感染,有时很难确认是原发致病因素还是继发于肺泡蛋白沉着症,例
如巨细胞病毒,卡氏肺孢子虫,组织胞浆菌感染等均发现有肺泡内高蛋白沉着
。
虽然启动因素尚不明确,但基本上同意发病过程为脂质代谢障碍所致,即由于
机体内,外因素作用引起肺泡表面活性物质的代谢异常,到目前为止,研究较
多的有肺泡巨噬细胞活力,动物实验证明巨噬细胞吞噬粉尘后其活力明显下降
,而病员灌洗液中的巨噬细胞内颗粒可使正常细胞活力下降,经支气管肺泡灌
洗治疗后,其肺泡巨噬细胞活力可上升,而研究未发现Ⅱ型细胞生成蛋白增加
,全身脂代谢也无异常,因此目前一般认为本病与清除能力下降有关。”,
“cure_department”: [
“内科”,
“呼吸内科”
],
“desc”: “肺泡蛋白质沉积症(简称PAP),又称Rosen-Castle-man-Liebow综合
征,是一种罕见疾病。该病以肺泡和细支气管腔内充满PAS染色阳性,来自肺
的富磷脂蛋白质物质为其特征,好发于青中年,男性发病约3倍于女性。”,
“easy_get”: “”
}
}
其他节点label即为节点类型(如药品、食物、检查等),仅有name一个属性。实例如下图
同样先获取节点和关系的信息,此部分使用获取到的节点的关系。
对于得到的节点关系集合,首先对其进行去重处理,即使用set()处理节点关系列表,核心语句:
其中科室——科室关系可视化示例:
{
“start”: {
“identity”: 20912,
“labels”: [
“Department”
],
“properties”: {
“name”: “中医综合”
}
},
“end”: {
“identity”: 20893,
“labels”: [
“Department”
],
“properties”: {
“name”: “中医科”
}
},
“segments”: [
{
“start”: {
“identity”: 20912,
“labels”: [
“Department”
],
“properties”: {
“name”: “中医综合”
}
},
“relationship”: {
“identity”: 40291,
“start”: 20912,
“end”: 20893,
“type”: “belongs_to”,
“properties”: {
“name”: “属于”
}
},
“end”: {
“identity”: 20893,
“labels”: [
“Department”
],
“properties”: {
“name”: “中医科”
}
}
}
],
“length”: 1.0
}
其他关系与此类似。
运行根目录下chatbot_graph.py,进行对话交互。
在此部分,脚本依次调用对问句进行问句类型分析、问句内容解析、问句答案搜索。
首先以药品、食物、检查项目、科室、药品信息、疾病、症状即知识图谱中节点的名称为特征词,构建领域的关键词树;然后分别构建症状提问关键词、原因提问关键词、并发症提问关键词、食物提问关键词、药品提问关键词、预防提问关键词、持续时间提问关键词、治疗方法提问关键词、治愈概率提问关键词、易感人群提问关键词、检查项目提问关键词、科室提问关键词、治疗作用提问关键词。
安装ahocorasick包,其能够在一次运行中找到给定集合所有字符串,可帮助我们快速进行关键词匹配。
pip install pyahocorasick
首先利用特征词进行构建actree,pyahocorasick构建actree的用法如下:
接着以特征词构建类别词典,key为关键词,value为特征词的类别(如药品、食物、检查项目等)。
分别构建症状提问关键词、原因提问关键词、并发症提问关键词、食物提问关键词、药品提问关键词、预防提问关键词、持续时间提问关键词、治疗方法提问关键词、治愈概率提问关键词、易感人群提问关键词、检查项目提问关键词、科室提问关键词、治疗作用提问关键词。
症状提问疑问关键词示例:
利用1)中以特征词构建的actree进行关键词匹配,得到关键词的类别词典,以关键词的类别确定问题的类型,如疾病症状、疾病原因等。
根据得到的类别词典和问题类型判断的结果,组合sql语句:
得到了sql信息列表,用作后面答案搜索。
首先链接neo4j,在上面已经构建完成了节点和关系边:
然后根据sql列表中每个sql实体的sql语句从知识图谱中得到搜索的答案,然后根据问题类型组装搜索得到的答案,得到回答。其中根据对于疾病症状问题类型进行的答案组装实例:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。