医学知识问答,知识图谱建设部分,建设过程如下:

一.首先,准备数据,主要为结构化的医学数据,包含实体和关系

原始数据样式(来源于刘焕勇老师整理的医学数据):

二.在neo4j数据库中建立空数据库,并且启用数据库,我这里用的是桌面版的neo4j,效果如下:

用户名:neo4j,密码:123456,大家根据自己需求设定,启用数据库:

三.开始写Python将数据导入数据库

import os
import json
from py2neo import Graph,Node

1.设置文件读取路径:

cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
data_path = os.path.join(cur_dir, 'data/medical.json')

2.连接数据库设置:

g = Graph(host="127.0.0.1",  # neo4j 搭载服务器的ip地址,ifconfig可获取到http_port=7474,  # neo4j 服务器监听的端口号user="neo4j",  # 数据库user name,如果没有更改过,应该是neo4jpassword="123456")

3.读取文件函数,根据实体类型(药品、食物、检查、科室、药品大类、疾病、症状)和关系类型(科室和科室关系、疾病和食物禁忌关系、疾病和宜吃食物关系、疾病和建议食物关系、疾病和通用药品关系、疾病和建议药品关系、疾病和检查的关系、药品和生产厂家的关系、疾病和症状的关系、疾病和并发症的关系、疾病和科室的关系)建立相应的空列表,把他们装起来:

    '''读取文件'''def read_nodes(self):# 共7类节点drugs = [] # 药品foods = [] # 食物checks = [] # 检查departments = [] #科室producers = [] #药品大类diseases = [] #疾病symptoms = []#症状disease_infos = []#疾病信息# 构建节点实体关系rels_department = [] # 科室-科室关系rels_noteat = [] # 疾病-忌吃食物关系rels_doeat = [] # 疾病-宜吃食物关系rels_recommandeat = [] # 疾病-推荐吃食物关系rels_commonddrug = [] # 疾病-通用药品关系rels_recommanddrug = [] # 疾病-热门药品关系rels_check = [] # 疾病-检查关系rels_drug_producer = [] # 厂商-药物关系rels_symptom = [] #疾病症状关系rels_acompany = [] # 疾病并发关系rels_category = [] # 疾病与科室之间的关系count = 0for data in open(self.data_path):disease_dict = {}count += 1print(count)data_json = json.loads(data)disease = data_json['name']disease_dict['name'] = diseasediseases.append(disease)disease_dict['desc'] = ''disease_dict['prevent'] = ''disease_dict['cause'] = ''disease_dict['easy_get'] = ''disease_dict['cure_department'] = ''disease_dict['cure_way'] = ''disease_dict['cure_lasttime'] = ''disease_dict['symptom'] = ''disease_dict['cured_prob'] = ''if 'symptom' in data_json:symptoms += data_json['symptom']for symptom in data_json['symptom']:rels_symptom.append([disease, symptom])if 'acompany' in data_json:for acompany in data_json['acompany']:rels_acompany.append([disease, acompany])if 'desc' in data_json:disease_dict['desc'] = data_json['desc']if 'prevent' in data_json:disease_dict['prevent'] = data_json['prevent']if 'cause' in data_json:disease_dict['cause'] = data_json['cause']if 'get_prob' in data_json:disease_dict['get_prob'] = data_json['get_prob']if 'easy_get' in data_json:disease_dict['easy_get'] = data_json['easy_get']if 'cure_department' in data_json:cure_department = data_json['cure_department']if len(cure_department) == 1:rels_category.append([disease, cure_department[0]])if len(cure_department) == 2:big = cure_department[0]small = cure_department[1]rels_department.append([small, big])rels_category.append([disease, small])disease_dict['cure_department'] = cure_departmentdepartments += cure_departmentif 'cure_way' in data_json:disease_dict['cure_way'] = data_json['cure_way']if  'cure_lasttime' in data_json:disease_dict['cure_lasttime'] = data_json['cure_lasttime']if 'cured_prob' in data_json:disease_dict['cured_prob'] = data_json['cured_prob']if 'common_drug' in data_json:common_drug = data_json['common_drug']for drug in common_drug:rels_commonddrug.append([disease, drug])drugs += common_drugif 'recommand_drug' in data_json:recommand_drug = data_json['recommand_drug']drugs += recommand_drugfor drug in recommand_drug:rels_recommanddrug.append([disease, drug])if 'not_eat' in data_json:not_eat = data_json['not_eat']for _not in not_eat:rels_noteat.append([disease, _not])foods += not_eatdo_eat = data_json['do_eat']for _do in do_eat:rels_doeat.append([disease, _do])foods += do_eatrecommand_eat = data_json['recommand_eat']for _recommand in recommand_eat:rels_recommandeat.append([disease, _recommand])foods += recommand_eatif 'check' in data_json:check = data_json['check']for _check in check:rels_check.append([disease, _check])checks += checkif 'drug_detail' in data_json:drug_detail = data_json['drug_detail']producer = [i.split('(')[0] for i in drug_detail]rels_drug_producer += [[i.split('(')[0], i.split('(')[-1].replace(')', '')] for i in drug_detail]producers += producerdisease_infos.append(disease_dict)return set(drugs), set(foods), set(checks), set(departments), set(producers), set(symptoms), set(diseases), disease_infos,\rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,\rels_symptom, rels_acompany, rels_category

4.建立节点函数:

    '''建立节点'''def create_node(self, label, nodes):count = 0for node_name in nodes:node = Node(label, name=node_name)self.g.create(node)count += 1print(count, len(nodes))return

5.创建知识图谱中心疾病的节点:

'''创建知识图谱中心疾病的节点'''
def create_diseases_nodes(self, disease_infos):count = 0for disease_dict in disease_infos:node = Node("Disease", name=disease_dict['name'], desc=disease_dict['desc'],prevent=disease_dict['prevent'] ,cause=disease_dict['cause'],  easy_get=disease_dict['easy_get'],cure_lasttime=disease_dict['cure_lasttime'],cure_department=disease_dict['cure_department'],cure_way=disease_dict['cure_way'] , cured_prob=disease_dict['cured_prob'])self.g.create(node)count += 1print(count)return

6.创建知识图谱实体节点类型schema:

'''创建知识图谱实体节点类型schema'''
def create_graphnodes(self):Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos,rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,rels_symptom, rels_acompany, rels_category = self.read_nodes()self.create_diseases_nodes(disease_infos)self.create_node('Drug', Drugs)print(len(Drugs))self.create_node('Food', Foods)print(len(Foods))self.create_node('Check', Checks)print(len(Checks))self.create_node('Department', Departments)print(len(Departments))self.create_node('Producer', Producers)print(len(Producers))self.create_node('Symptom', Symptoms)return

7.创建实体关系边:

    '''创建实体关系边'''def create_graphrels(self):Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos, rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,rels_symptom, rels_acompany, rels_category = self.read_nodes()self.create_relationship('Disease', 'Food', rels_recommandeat, 'recommand_eat', '推荐食谱')self.create_relationship('Disease', 'Food', rels_noteat, 'no_eat', '忌吃')self.create_relationship('Disease', 'Food', rels_doeat, 'do_eat', '宜吃')self.create_relationship('Department', 'Department', rels_department, 'belongs_to', '属于')self.create_relationship('Disease', 'Drug', rels_commonddrug, 'common_drug', '常用药品')self.create_relationship('Producer', 'Drug', rels_drug_producer, 'drugs_of', '生产药品')self.create_relationship('Disease', 'Drug', rels_recommanddrug, 'recommand_drug', '好评药品')self.create_relationship('Disease', 'Check', rels_check, 'need_check', '诊断检查')self.create_relationship('Disease', 'Symptom', rels_symptom, 'has_symptom', '症状')self.create_relationship('Disease', 'Disease', rels_acompany, 'acompany_with', '并发症')self.create_relationship('Disease', 'Department', rels_category, 'belongs_to', '所属科室')

8.创建实体关联边

    '''创建实体关联边'''def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):count = 0# 去重处理set_edges = []for edge in edges:set_edges.append('###'.join(edge))all = len(set(set_edges))for edge in set(set_edges):edge = edge.split('###')p = edge[0]q = edge[1]query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name)try:self.g.run(query)count += 1print(rel_type, count, all)except Exception as e:print(e)return

9.导出实体文件,应用于问答系统的建设:

    '''导出数据'''def export_data(self):Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos, rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug, rels_symptom, rels_acompany, rels_category = self.read_nodes()f_drug = open('drug.txt', 'w+')f_food = open('food.txt', 'w+')f_check = open('check.txt', 'w+')f_department = open('department.txt', 'w+')f_producer = open('producer.txt', 'w+')f_symptom = open('symptoms.txt', 'w+')f_disease = open('disease.txt', 'w+')f_drug.write('\n'.join(list(Drugs)))f_food.write('\n'.join(list(Foods)))f_check.write('\n'.join(list(Checks)))f_department.write('\n'.join(list(Departments)))f_producer.write('\n'.join(list(Producers)))f_symptom.write('\n'.join(list(Symptoms)))f_disease.write('\n'.join(list(Diseases)))f_drug.close()f_food.close()f_check.close()f_department.close()f_producer.close()f_symptom.close()f_disease.close()return

全部代码:

import os
import json
from py2neo import Graph,Nodeclass MedicalGraph:def __init__(self):cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])self.data_path = os.path.join(cur_dir, 'data/medical.json')self.g = Graph(host="127.0.0.1",  # neo4j 搭载服务器的ip地址,ifconfig可获取到http_port=7474,  # neo4j 服务器监听的端口号user="neo4j",  # 数据库user name,如果没有更改过,应该是neo4jpassword="123456")'''读取文件'''def read_nodes(self):# 共7类节点drugs = [] # 药品foods = [] # 食物checks = [] # 检查departments = [] #科室producers = [] #药品大类diseases = [] #疾病symptoms = []#症状disease_infos = []#疾病信息# 构建节点实体关系rels_department = [] # 科室-科室关系rels_noteat = [] # 疾病-忌吃食物关系rels_doeat = [] # 疾病-宜吃食物关系rels_recommandeat = [] # 疾病-推荐吃食物关系rels_commonddrug = [] # 疾病-通用药品关系rels_recommanddrug = [] # 疾病-热门药品关系rels_check = [] # 疾病-检查关系rels_drug_producer = [] # 厂商-药物关系rels_symptom = [] #疾病症状关系rels_acompany = [] # 疾病并发关系rels_category = [] # 疾病与科室之间的关系count = 0for data in open(self.data_path):disease_dict = {}count += 1print(count)data_json = json.loads(data)disease = data_json['name']disease_dict['name'] = diseasediseases.append(disease)disease_dict['desc'] = ''disease_dict['prevent'] = ''disease_dict['cause'] = ''disease_dict['easy_get'] = ''disease_dict['cure_department'] = ''disease_dict['cure_way'] = ''disease_dict['cure_lasttime'] = ''disease_dict['symptom'] = ''disease_dict['cured_prob'] = ''if 'symptom' in data_json:symptoms += data_json['symptom']for symptom in data_json['symptom']:rels_symptom.append([disease, symptom])if 'acompany' in data_json:for acompany in data_json['acompany']:rels_acompany.append([disease, acompany])if 'desc' in data_json:disease_dict['desc'] = data_json['desc']if 'prevent' in data_json:disease_dict['prevent'] = data_json['prevent']if 'cause' in data_json:disease_dict['cause'] = data_json['cause']if 'get_prob' in data_json:disease_dict['get_prob'] = data_json['get_prob']if 'easy_get' in data_json:disease_dict['easy_get'] = data_json['easy_get']if 'cure_department' in data_json:cure_department = data_json['cure_department']if len(cure_department) == 1:rels_category.append([disease, cure_department[0]])if len(cure_department) == 2:big = cure_department[0]small = cure_department[1]rels_department.append([small, big])rels_category.append([disease, small])disease_dict['cure_department'] = cure_departmentdepartments += cure_departmentif 'cure_way' in data_json:disease_dict['cure_way'] = data_json['cure_way']if  'cure_lasttime' in data_json:disease_dict['cure_lasttime'] = data_json['cure_lasttime']if 'cured_prob' in data_json:disease_dict['cured_prob'] = data_json['cured_prob']if 'common_drug' in data_json:common_drug = data_json['common_drug']for drug in common_drug:rels_commonddrug.append([disease, drug])drugs += common_drugif 'recommand_drug' in data_json:recommand_drug = data_json['recommand_drug']drugs += recommand_drugfor drug in recommand_drug:rels_recommanddrug.append([disease, drug])if 'not_eat' in data_json:not_eat = data_json['not_eat']for _not in not_eat:rels_noteat.append([disease, _not])foods += not_eatdo_eat = data_json['do_eat']for _do in do_eat:rels_doeat.append([disease, _do])foods += do_eatrecommand_eat = data_json['recommand_eat']for _recommand in recommand_eat:rels_recommandeat.append([disease, _recommand])foods += recommand_eatif 'check' in data_json:check = data_json['check']for _check in check:rels_check.append([disease, _check])checks += checkif 'drug_detail' in data_json:drug_detail = data_json['drug_detail']producer = [i.split('(')[0] for i in drug_detail]rels_drug_producer += [[i.split('(')[0], i.split('(')[-1].replace(')', '')] for i in drug_detail]producers += producerdisease_infos.append(disease_dict)return set(drugs), set(foods), set(checks), set(departments), set(producers), set(symptoms), set(diseases), disease_infos,\rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,\rels_symptom, rels_acompany, rels_category'''建立节点'''def create_node(self, label, nodes):count = 0for node_name in nodes:node = Node(label, name=node_name)self.g.create(node)count += 1print(count, len(nodes))return'''创建知识图谱中心疾病的节点'''def create_diseases_nodes(self, disease_infos):count = 0for disease_dict in disease_infos:node = Node("Disease", name=disease_dict['name'], desc=disease_dict['desc'],prevent=disease_dict['prevent'] ,cause=disease_dict['cause'],easy_get=disease_dict['easy_get'],cure_lasttime=disease_dict['cure_lasttime'],cure_department=disease_dict['cure_department'],cure_way=disease_dict['cure_way'] , cured_prob=disease_dict['cured_prob'])self.g.create(node)count += 1print(count)return'''创建知识图谱实体节点类型schema'''def create_graphnodes(self):Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos,rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,rels_symptom, rels_acompany, rels_category = self.read_nodes()self.create_diseases_nodes(disease_infos)self.create_node('Drug', Drugs)print(len(Drugs))self.create_node('Food', Foods)print(len(Foods))self.create_node('Check', Checks)print(len(Checks))self.create_node('Department', Departments)print(len(Departments))self.create_node('Producer', Producers)print(len(Producers))self.create_node('Symptom', Symptoms)return'''创建实体关系边'''def create_graphrels(self):Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos, rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,rels_symptom, rels_acompany, rels_category = self.read_nodes()self.create_relationship('Disease', 'Food', rels_recommandeat, 'recommand_eat', '推荐食谱')self.create_relationship('Disease', 'Food', rels_noteat, 'no_eat', '忌吃')self.create_relationship('Disease', 'Food', rels_doeat, 'do_eat', '宜吃')self.create_relationship('Department', 'Department', rels_department, 'belongs_to', '属于')self.create_relationship('Disease', 'Drug', rels_commonddrug, 'common_drug', '常用药品')self.create_relationship('Producer', 'Drug', rels_drug_producer, 'drugs_of', '生产药品')self.create_relationship('Disease', 'Drug', rels_recommanddrug, 'recommand_drug', '好评药品')self.create_relationship('Disease', 'Check', rels_check, 'need_check', '诊断检查')self.create_relationship('Disease', 'Symptom', rels_symptom, 'has_symptom', '症状')self.create_relationship('Disease', 'Disease', rels_acompany, 'acompany_with', '并发症')self.create_relationship('Disease', 'Department', rels_category, 'belongs_to', '所属科室')'''创建实体关联边'''def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):count = 0# 去重处理set_edges = []for edge in edges:set_edges.append('###'.join(edge))all = len(set(set_edges))for edge in set(set_edges):edge = edge.split('###')p = edge[0]q = edge[1]query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name)try:self.g.run(query)count += 1print(rel_type, count, all)except Exception as e:print(e)return'''导出数据'''def export_data(self):Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos, rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug, rels_symptom, rels_acompany, rels_category = self.read_nodes()f_drug = open('drug.txt', 'w+')f_food = open('food.txt', 'w+')f_check = open('check.txt', 'w+')f_department = open('department.txt', 'w+')f_producer = open('producer.txt', 'w+')f_symptom = open('symptoms.txt', 'w+')f_disease = open('disease.txt', 'w+')f_drug.write('\n'.join(list(Drugs)))f_food.write('\n'.join(list(Foods)))f_check.write('\n'.join(list(Checks)))f_department.write('\n'.join(list(Departments)))f_producer.write('\n'.join(list(Producers)))f_symptom.write('\n'.join(list(Symptoms)))f_disease.write('\n'.join(list(Diseases)))f_drug.close()f_food.close()f_check.close()f_department.close()f_producer.close()f_symptom.close()f_disease.close()returnif __name__ == '__main__':handler = MedicalGraph()# handler.export_data()handler.create_graphnodes()     handler.create_graphrels()

代码参考刘焕勇老师的项目,连接如下,Author: lhy<lhy_in_blcu@126.com,https://huangyong.github.io>

Python 医学知识图谱问答系统(一),建立医学知识图谱,基于neo4j知识图谱的医学问答体系相关推荐

  1. 基于neo4j知识图谱的智能问答系统

    项目介绍 本项目采用neo4j作为数据库,存储了知识题库.用户可以根据提示深入去了解问题.属于一款简易版的智能问答系统. 服务端使用技术:python+django框架 前台使用:html+css+j ...

  2. 基于neo4j知识图谱的旅游景点问答辅助系统

    本项目采用neo4j作为数据库,存储了知识题库.用户可以根据提示深入去了解问题.属于一款简易版的智能问答系统. 服务端使用技术:python+django框架 前台使用:Vue+axios 已实现功能 ...

  3. “基于医疗知识图谱的问答系统”代码解析(一)

    "基于医疗知识图谱的问答系统"代码解析(一) build_medicalgraph.py -建立医疗知识图谱的代码解析 "基于医疗知识图谱的问答系统"代码解析( ...

  4. 深度学习论文精读01——基于多任务学习的肿瘤医学影像语义分割与分类研究

    基于多任务学习的肿瘤医学影像语义分割与分类研究 文章目录 基于多任务学习的肿瘤医学影像语义分割与分类研究 1 背景介绍 2 主要内容 3 材料和方法 3.1卷积神经网络 多层感知模型(全连接) 3.1 ...

  5. 基于neo4j图谱搭建问答系统

    前言 承接前文,本文介绍如何根据已有的neo4j图谱来搭建一个简单的问答系统. ps:因为是基于neo4j图谱的,所以这个问题必须是在图谱中有答案才能进行回答. 完整项目github地址:https: ...

  6. python+neo4j构建基于知识图谱的电影知识智能问答系统

    目录 一.写在前面: 二.系统准备: 三.系统构建 四.总结反思: 五.完整代码: Author:qyan.li Date:2022.6.3 Topic:借助于python构建知识图谱的电影知识智能问 ...

  7. Python neo4j建立知识图谱,药品知识图谱,neo4j知识图谱,知识图谱的建立过程,智能用药知识图谱,智能问诊必备知识图谱

    一.知识图谱概念 知识图谱的概念是由谷歌公司在2012年5月17日提出的,谷歌公司将以此为基础构建下一代智能化搜索引擎,知识图谱技术创造出一种全新的信息检索模式,为解决信息检索问题提供了新的思路.本质 ...

  8. python知识图谱问答系统代码_知识图谱和问答系统

    知识图谱和问答系统 发布时间:2018-06-19 05:32, 浏览次数:606 1. 前言 知识图谱(knowledge graph),是下一代搜索引擎.问答系统等智能应用的基础设施 ,目前出现的 ...

  9. 知识图谱入门2-1:实践——基于医疗知识图谱的问答系统

    注:欢迎关注datawhale:https://datawhale.club/ 系列: 知识图谱入门一:知识图谱介绍 知识图谱入门2-1:实践--基于医疗知识图谱的问答系统 知识图谱入门2-2:用户输 ...

最新文章

  1. Spring MVC+Spring+MyBatis实现支付宝扫码支付功能(图文详解)
  2. pyhton 画出音频文件的波形图和频谱图
  3. C语言经典例27-利用递归逆序输出字符串
  4. nacos+openfeign服务提供和服务消费远程调用代码简单实例2
  5. 在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决
  6. plsql 弹出 register,plsql注册码
  7. java createstatement,createStatement参数说明
  8. [2013.8.29]马甲去重复 c++源码
  9. d3-force 力导图 源码解读与原理分析【一】
  10. 新路嘉机器人_嘉懿学子在2019年上海市中小学机器人竞赛中喜获佳绩
  11. 如何将excel文件联系人转换成vcf文件
  12. Linux终端怎么打开root,在linux终端中执行root命令有哪些方法
  13. 电子设计教程42:限流软启动电路
  14. EMQ压力测试及系统优化(单机11万并发连接)
  15. HTML+CSS十分钟实现响应式布局页面,响应式布局实战教程
  16. 联想TinkPad S3-490 后盖拆机教程
  17. 终于去看了麦兜响当当
  18. 如何把win桌面的压缩包复制到虚拟机共享文件夹中
  19. License server system does not support this version of this feature
  20. Hive Distribute by 应用之动态分区小文件过多问题优化

热门文章

  1. 截图工具因为计算机无法使用,Win7系统自带的截图工具不能用了的解决方法
  2. WINCE快捷方式结构
  3. 激荡的2020过后,物流江湖下个十年谁主沉浮?
  4. 电网计算机面试专业题,国家电网计算机管理员面试经验|面试题 - 职朋职业圈...
  5. 三方协议中的服务器,手把手教你三方协议怎么填
  6. java计算机毕业设计人口普查信息管理系统源代码+数据库+系统+lw文档
  7. smc数显压力表设定方法_psi与kpa换算(smc数显压力表设定方法)
  8. 复旦大学硕士盲审 计算机学院,《复旦大学论文抽检、盲审工作的通知.doc
  9. 亚马逊用AI监控和解雇员工,这会是大势所趋吗?
  10. 获取网易云榜单列表100首音乐