当前位置:   article > 正文

【部署医药类问答系统QASystemOnMedicalKG】

qasystemonmedicalkg

前言

从无到有搭建一个以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。github链接
在这里插入图片描述

部署过程

一、Ubuntu18.04安装MongoDB4.0

参考官网链接
安装依赖库:

sudo apt-get install gnupg

  • 1
  • 2

引入秘钥:

wget -qO - https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add -
  • 1

创建列表文件:

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
  • 1

更新apt库:

sudo apt-get update
  • 1

安装:

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
  • 1

开启MongoDB数据库服务:

sudo service mongod start
  • 1

输入mongo可连接数据库

show dbs;# 查看所有的数据库
use database; #选用数据库
db.collection.stats() #查看集合的统计信息
  • 1
  • 2
  • 3
注意问题:

注意版本对应,mongodb其他版本在本项目中使用可能会出现问题。

二、运行数据准备脚本

1. 运行prepare_data文件夹中的data_spider.py数据爬取脚本,完成对网页数据的爬取,并存储在数据库中
python data_spider.py
  • 1

在此脚本中,首先建立数据库medical,其分为两个集合,分别为data,jc

其中data中包含每个爬取的病理的如下信息
url:信息来源的网站链接
basic_info:病理的基础信息,包括类别、名字、描述、属性等
cause_info: 生成病理的原因
prevent_info: 预防的方法
symptom:症状信息
inspect_info:检查项目
treat_info:治疗方法
food_info:食物对病理的影响,包含有利于病情的食物,有害于病情的食物和推荐食用的食物
drug_info:适用的药物信息

其中jc为初步抓取检查项目抓取的结果,包含
url:信息来源页的链接
html:从链接抓取到的html信息,供后续做信息提取
在收集的链接中提取上述信息并存储到数据库中,此部分结束。

2. 运行prepare_data文件夹中的build_data.py数据建立脚本
python build_data.py
  • 1

首先调用modify_jc函数对数据库中jc集合进行修改完善,具体实施是从html中提取检查项的名称和检查项结果的描述,得到集合jc下的set{‘name’:name, ‘desc’:sesc}
然后遍历数据库中data集合的每个爬取的病理信息,获取名称、简介、所属类别、预防措施、成因、症状、属性、药品推荐、药品明细、并发症等,其中检查项只提取jc集合中出现的项目,食物信息分列为宜食、忌食、推荐三种。
其中并发症提取:
对提取的并发症信息与dict/disease.txt中的疾病字典进行双向最大匹配,将匹配到的疾病存储为集合

三、安装neo4j

下载地址

在这里插入图片描述
下载完成后解压,在bin目录,输入如下命令:

./neo4j start
  • 1

在浏览器访问127.0.0.1:7474进入nei4j
在这里插入图片描述

四、运行构建知识图谱脚本

进入项目根目录,输入命令:

python build_medicalgraph.py
  • 1

此部分分为两个步骤,分别为创建知识图谱实体节点类型、创建实体关系边。

1. 创建知识图谱实体节点

在创建知识图谱实体节点中,首先读入节点,节点分为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一个属性。实例如下图
在这里插入图片描述

2. 创建实体关系边

同样先获取节点和关系的信息,此部分使用获取到的节点的关系。
对于得到的节点关系集合,首先对其进行去重处理,即使用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,进行对话交互。
在此部分,脚本依次调用对问句进行问句类型分析、问句内容解析、问句答案搜索。

1. 问句类型分析

首先以药品、食物、检查项目、科室、药品信息、疾病、症状即知识图谱中节点的名称为特征词,构建领域的关键词树;然后分别构建症状提问关键词、原因提问关键词、并发症提问关键词、食物提问关键词、药品提问关键词、预防提问关键词、持续时间提问关键词、治疗方法提问关键词、治愈概率提问关键词、易感人群提问关键词、检查项目提问关键词、科室提问关键词、治疗作用提问关键词。

1)构建领域关键词树

安装ahocorasick包,其能够在一次运行中找到给定集合所有字符串,可帮助我们快速进行关键词匹配。

pip install pyahocorasick
  • 1

首先利用特征词进行构建actree,pyahocorasick构建actree的用法如下:
在这里插入图片描述
接着以特征词构建类别词典,key为关键词,value为特征词的类别(如药品、食物、检查项目等)。

2)构建问句疑问词词典

分别构建症状提问关键词、原因提问关键词、并发症提问关键词、食物提问关键词、药品提问关键词、预防提问关键词、持续时间提问关键词、治疗方法提问关键词、治愈概率提问关键词、易感人群提问关键词、检查项目提问关键词、科室提问关键词、治疗作用提问关键词。
症状提问疑问关键词示例:
在这里插入图片描述

3)问句过滤和类型确定

利用1)中以特征词构建的actree进行关键词匹配,得到关键词的类别词典,以关键词的类别确定问题的类型,如疾病症状、疾病原因等。
在这里插入图片描述

2. 问句内容解析

根据得到的类别词典和问题类型判断的结果,组合sql语句:
在这里插入图片描述
得到了sql信息列表,用作后面答案搜索。

3. 问句答案搜索

首先链接neo4j,在上面已经构建完成了节点和关系边:
在这里插入图片描述

然后根据sql列表中每个sql实体的sql语句从知识图谱中得到搜索的答案,然后根据问题类型组装搜索得到的答案,得到回答。其中根据对于疾病症状问题类型进行的答案组装实例:
在这里插入图片描述

六、运行结果

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/526767
推荐阅读
相关标签
  

闽ICP备14008679号