医疗知识图谱问答 —— 数据同步

news2024/11/22 16:13:15

前言

        前面的文章已经介绍了 neo4j 服务的本地安装,以及数据的增删改查操作方法。那么这里就要进入 python 项目,来完成医疗知识的构建,问答机器人的代码实现。但篇幅较长,本文就主要介绍知识图谱的构建吧。

环境

Anaconda3

Python3.8

Py2neo (新版)

数据来源 (结构)

编码

1. 引入依赖

import json
from py2neo import Graph, Node

2. 类的初始化 (连接 neo4j)

def __init__(self):
	self.data_path = "./data/medical.json"
	self.neo4j = Graph('bolt://localhost:7687', auth=('neo4j', 'beiqiaosu123456'))

3.  读取数据

def read_data(self):
	# 疾病
	diseases = []
	# 症状
	symptoms = []
	# 科室
	departments = []
	# 药品
	drugs = []
	# 食物
	foods = []
	# 出药厂商
	producers = []
	# 检查项目
	checks = []

	# 疾病信息
	disease_info = []

	# 疾病与症状
	rels_symptom = []
	# 疾病与并发症
	rels_acompany = []
	# 疾病与科室
	rels_category = []
	# 科室与科室
	rels_department = []
	# 疾病与通用药品
	rels_commondrug = []
	# 疾病与推荐药品
	rels_recommenddrug = []
	# 疾病与不可吃
	rels_noteat = []
	# 疾病与可以吃
	rels_doeat = []
	# 疾病与推荐吃
	rels_recommendeat = []
	# 疾病与检查项
	rels_check = []
	# 厂商与药品
	rels_drug_producer = []

	for data in open(self.data_path, encoding="utf8", mode="r"):
		data_json = json.loads(data)
		disease = data_json['name']
		disease_dict = dict()
		disease_dict['get_prob'] = ''
		disease_dict['yibao_status'] = ''
		disease_dict['easy_get'] = ''
		disease_dict['get_way'] = ''
		disease_dict['cure_lasttime'] = ''
		disease_dict['cured_prob'] = ''
		disease_dict['cost_money'] = ''
		disease_dict['cure_department'] = []
		diseases.append(disease)
		disease_dict['name'] = disease
		disease_dict['desc'] = data_json['desc']
		disease_dict['prevent'] = data_json['prevent']
		disease_dict['cause'] = data_json['cause']

		if "get_prob" in data_json:
			disease_dict['get_prob'] = data_json['get_prob']
		if "yibao_status" in data_json:
			disease_dict['yibao_status'] = data_json['yibao_status']
		if "easy_get" in data_json:
			disease_dict['easy_get'] = data_json['easy_get']
		if "get_way" in data_json:
			disease_dict['get_way'] = data_json['get_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 "cost_money" in data_json:
			disease_dict['cost_money'] = data_json['cost_money']
		disease_info.append(disease_dict)

		symptom = data_json['symptom']
		for symptom_i in symptom:
			rels_symptom.append([disease, symptom_i])
		symptoms += symptom

		# 科室
		if "cure_department" in data_json:
			cure_department = data_json['cure_department']
			departments += cure_department
			if len(cure_department) == 1:
				rels_category.append([disease, cure_department[0]])
			if len(cure_department) == 2:
				large = cure_department[0]
				small = cure_department[1]
				rels_department.append([large, small])
				rels_category.append([disease, large])
			disease_dict['cure_department'] = cure_department

		# 并发症
		if 'acompany' in data_json:
			acompanys = data_json['acompany']
			for acompany in data_json['acompany']:
				rels_acompany.append([disease, acompany])
			symptoms += acompanys

		if 'common_drug' in data_json:
			commondrug = data_json['common_drug']
			drugs += commondrug
			for drug_c in commondrug:
				rels_commondrug.append([disease, drug_c])

			recommenddrug = data_json['recommand_drug']
			for drug_recom in recommenddrug:
				rels_recommenddrug.append([disease, drug_recom])
			drugs += recommenddrug

		if 'not_eat' in data_json:
			noteat = data_json['not_eat']
			for noteat_i in noteat:
				rels_noteat.append([disease, noteat_i])
			foods += noteat

		if 'do_eat' in data_json:
			doeat = data_json['do_eat']
			for doeat_i in doeat:
				rels_doeat.append([disease, doeat_i])
			foods += doeat

		if 'recommand_eat' in data_json:
			recommendfood = data_json['recommand_eat']
			for food_i in recommendfood:
				rels_recommendeat.append([disease, food_i])
			foods += recommendfood

		checkitem = data_json['check']
		for check_i in checkitem:
			check_i.replace("'", "")
			if check_i != "血清5'-核苷酸酶(5'-NT)":
				rels_check.append([disease, check_i])
		checks += checkitem

		# 厂商与药品
		druginfo = data_json['drug_detail']
		producers += [name.split("(")[0] for name in druginfo]
		rels_drug_producer += [[name.split("(")[0], name.split("(")[-1].replace(")", "")] for name in druginfo]

	return set(diseases), set(symptoms), set(producers), set(departments), set(drugs), set(foods), set(
		checks), disease_info, rels_symptom, rels_acompany, rels_commondrug, rels_recommenddrug, rels_noteat, \
		   rels_doeat, rels_recommendeat, rels_check, rels_drug_producer, rels_department, rels_category, rels_drug_producer

4. 创建节点

def create_medical_nodes(self):
	print("start create nodes")
	diseases, symptoms, producers, departments, drugs, foods, checks, disease_info, rels_symptom,\
	rels_acompany,rels_commondrug,rels_recommenddrug,rels_noteat,rels_doeat,rels_recommendeat,\
	rels_check,rels_drug_producer,rels_department, rels_category, rels_drug_producer = \
		build_medical_graph.read_data()

	# 创建疾病节点
	# self.create_node('Diseases', diseases)
	# 创建症状节点
	# self.create_node('Symptoms', symptoms)
	# 创建科室
	# self.create_node('Departments', departments)
	# 创建药品
	# self.create_node('Drugs', drugs)
	# 创建食品
	# self.create_node('Foods', foods)
	# 创建出药厂商
	# self.create_node('Producers', producers)
	# 创建检查项
	# self.create_node('Checks', checks)
	self.create_disease_node('Diseases', disease_info)
	return

# 疾病节点单独创建
def create_node(self, label, values):
	count = 0;
	for val in values:
		count += 1
		print("节点: " + label + ", 名称为: " + val)
		node = Node(label, name = val)
		self.neo4j.create(node)
	return count

def create_disease_node(self, label, values):
	count = 0
	for disease in values:
		print("节点" + label + ", 名称:" + disease['name'])
		node = Node(label, name=disease['name'], desc=disease['desc'], prevent=disease['prevent'],cause=disease['cause'],
					get_prob=disease['get_prob'],yibao_status=disease['yibao_status'],easy_get=disease['easy_get'],
					get_way=disease['get_way'],cure_lasttime=disease['cure_lasttime'],cured_prob=disease['cured_prob'],
					cost_money=disease['cost_money'],cure_department=disease['cure_department'])
		self.neo4j.create(node)
	return count

5. 创建关联边

def create_medical_rels(self):
	print("start create rels")
	diseases, symptoms, producers, departments, drugs, foods, checks, disease_info, rels_symptom, \
	rels_acompany, rels_commondrug, rels_recommenddrug, rels_noteat, rels_doeat, rels_recommendeat, \
	rels_check, rels_drug_producer, rels_department, rels_category, rels_drug_producer = \
		build_medical_graph.read_data()

	# 疾病与状态
	# self.create_rel("Diseases", "Symptoms", rels_symptom, "has_symptoms", "疾病症状")
	# 疾病与并发症
	# self.create_rel("Diseases", "Symptoms", rels_acompany, "acompany_with", "疾病并发症")
	# 疾病与科室
	# self.create_rel("Diseases", "Departments", rels_category, "belongs_to", "所属科室")
	# 科室与科室
	# self.create_rel("Departments", "Departments", rels_department, "belongs_to", "所属")
	# 疾病与通用药品
	# self.create_rel("Diseases", "Drugs", rels_commondrug, "common_drug", "常用备药")
	# 疾病与推荐药品
	# self.create_rel("Diseases", "Drugs", rels_recommenddrug, "recommand_drug", "推荐用药")
	# 疾病与忌口
	# self.create_rel("Diseases", "Foods", rels_noteat, "not_eat", "忌吃")
	# 疾病与可以吃
	# self.create_rel("Diseases", "Foods", rels_doeat, "do_eat", "可以吃")
	# 疾病与推荐吃
	# self.create_rel("Diseases", "Foods", rels_recommendeat, "recomment_eat", "推荐吃")
	# 疾病与检查项
	self.create_rel("Diseases", "Checks", rels_check, "need_check", "需要检查")
	# 厂商与药品
	# self.create_rel("Producers", "drugs", rels_drug_producer, "drug_of", "生产药品")


def create_rel(self, start_node, end_node, list, rel_name, rel_attr):
	count = 0
	for item in list:
		count += 1
		s = item[0]
		e = item[1]

		print ("创建边:" +rel_name +",("+start_node+"->"+end_node+"),点1:"+s+"点2:"+e)

		query = "Match (start:%s), (end:%s) where start.name='%s' and end.name='%s' create (start)-[rel:%s{name:'%s'}]->(end)" % (
			start_node, end_node, s, e, rel_name, rel_attr
		)
		self.neo4j.run(query)

	return count

6. 导出节点数据

# 导出实体的节点分词
def export_data(self):
	diseases, symptoms, producers, departments, drugs, foods, checks, disease_info, rels_symptom, \
	rels_acompany, rels_commondrug, rels_recommenddrug, rels_noteat, rels_doeat, rels_recommendeat, \
	rels_check, rels_drug_producer, rels_department, rels_category, rels_drug_producer = \
		build_medical_graph.read_data()

	# 疾病名
	# f_diseases = open("dict/diseases.txt", encoding="utf-8", mode="w+")
	# f_diseases.write("\n".join(list(diseases)))
	# 症状名
	f_symptoms = open("dict/symptoms.txt", encoding="utf-8", mode="w+")
	f_symptoms.write("\n".join(list(symptoms)))

	f_producers = open("dict/producers.txt", encoding="utf-8", mode="w+")
	f_producers.write("\n".join(list(producers)))

	f_departments = open("dict/departments.txt", encoding="utf-8", mode="w+")
	f_departments.write("\n".join(list(departments)))

	f_drugs = open("dict/drugs.txt", encoding="utf-8", mode="w+")
	f_drugs.write("\n".join(list(drugs)))

	f_foods = open("dict/foods.txt", encoding="utf-8", mode="w+")
	f_foods.write("\n".join(list(foods)))

	f_checks = open("dict/checks.txt", encoding="utf-8", mode="w+")
	f_checks.write("\n".join(list(checks)))

	f_checks = open("dict/checks.txt", encoding="utf-8", mode="w+")
	f_checks.write("\n".join(list(checks)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/825426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外贸国际企业邮箱选择指南:哪家提供更优质的服务?

在当今的数字时代,跨国企业需要与世界各地的客户和合作伙伴保持联系。这就是为什么选择适合其全球运营的功能的正确的业务邮箱是至关重要的。 国际企业邮箱最受欢迎的选择是专门为外贸设计的邮箱服务。它们提供了一系列工具,如国际域名和自动语言翻译&am…

用代码获取每天热点内容信息,并发送到自己的邮箱

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本篇文章内容主要为如何用代码,把你想要的内容,以邮件的形式发送出去 内容可以自己完善,还可以设置一个定时发送,或者开机启动自动运行代码 开发环境: python 3.8 运行代码 p…

python算法指南程序员经典,python算法教程pdf百度云

大家好,小编来为大家解答以下问题,你也能看懂的python算法书 pdf,python算法教程这本书怎么样,现在让我们一起来看看吧! 给大家带来的一篇关于算法相关的电子书资源,介绍了关于算法、详解、算法基础方面的内…

无涯教程-Lua - 面向对象

面向对象编程(OOP)是现代编程时代中使用最广泛的编程技术之一。 OOP的特征 类(Class) - 类是用于创建对象的可扩展模板。 对象(Objects) - 它是类的实例,并为其分配了单独的内存空间。 继承(Inheritance) - 这是一个概…

操作系统第二章——进程与线程(圆满)

欲渡黄河冰塞川,将登太行雪满山 文章目录 2.3.7 生产者消费者问题能否改变相邻的PV操作的顺序知识回顾 2.3.8 多生产者多消费者问题问题描述关系分析各个进程之间的PV操作设置信号量若是不设置互斥信号量缓冲区大于一知识回顾 2.3.9 吸烟者问题知识回顾2.3.10读者写…

leetcod——62不同路径 (动态规划讲解)

62. 不同路径 中等 1.8K 相关企业 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有…

五、JVM-垃圾回收算法

常见的回收算法:标记清除算法、复制算法、标记-整理算法、分代收集算法 1、标记清除算法 第一步:标记(找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对…

【算法提高:动态规划】1.5 状态压缩DP TODO

文章目录 状态压缩DP例题列表棋盘式1064. 小国王⭐🐂(好题!)做题套路总结 327. 玉米田(好题!🐂 和1064. 小国王差不多的题目)292. 炮兵阵地(和上面两道题差不多&#xff…

股票量化系统QTYX选股框架实战案例集|地产看前排承接做后排补涨,砸涨停板吃8点小肉-230801...

前言 “实战案例个股画像”系列和大家分享我基于QTYX选股框架,在实战中选股的案例,和大家一起见证QTYX选股框架逐步完善的过程,帮助大家理解QTYX的精髓。 关于QTYX的使用攻略可以查看链接:QTYX使用攻略 关于QTYX初衷和精髓可以查看…

CSS图片放到<div>里面,自适应宽高全部显示,点击图片跳到新页面预览,点击旋转按钮图片可旋转

有一个需求是图片放到一个固定宽高的<div>里面&#xff0c;不管是横图还是竖图&#xff0c;都要全部显示出来并且保持图片的长宽比例不变形&#xff0c;点击图片可以跳到一个新页面预览&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head>…

图解系列 DNS查找过程和DNS缓存

DNS 充当地址簿。它将人类可读的域名 (google.com) 转换为机器可读的 IP 地址 (142.251.46.238)。 开局一张图 来自&#xff1a;https://xiaolishen.medium.com/the-dns-lookup-journey-240e9a5d345c 寻址流程 查询浏览器缓存&#xff1a;当你输入一个域名后&#xff0c;浏览…

VS创建QT项目的几个注意点

前提是已经安装好了VS、QT和Qt VS Tool。 一、创建项目无法找到头文件&#xff0c;点击编译运行又可以执行。虽然可以编译运行&#xff0c;但是无法找不到头文件显示是红色并且在开发时无法出现相关代码提示&#xff0c;并且无法导入QT相关头文件。 解决方法&#xff1a; 1、…

Android多线程编程、异步消息处理机制以及new Handler()被标记为过时的解决办法,解决Handler内存泄漏问题和AsyncTask的基本用法

一、Android多线程编程 1、异步消息处理机制 1.1 弱引用 WeakReference&#xff08;弱引用&#xff09;是一种在Java中用于管理对象的引用的特殊引用类型。它的作用是在垃圾回收过程中&#xff0c;允许对象在没有强引用指向它时被回收&#xff08;当一个对象只有弱引用指向它…

如何防止亚马逊买家号关联?

防止亚马逊买家号关联是指避免在同一家亚马逊账户下使用多个买家号。有时&#xff0c;卖家或买家会创建多个买家号来规避亚马逊的规则和限制。然而&#xff0c;这样的行为违反了亚马逊的政策&#xff0c;并可能导致账户被封禁或其他严重的后果。 而想要防关联&#xff0c;可以从…

【Linux】IO 篇:文件调用原理,文件描述符,FILE的内涵,解析重定向,理解缓冲区

文章目录 一、系统调用接口二、文件调用1. 文件描述符 fd2. 文件调用原理3. FILE 三、重定向dup2 四、缓冲区简易 FILE 的代码实现 文件被加载之前&#xff0c;被存在磁盘上&#xff0c;操作文件&#xff0c;文件的部分内容则会被调度到 内存中。 要分析文件&#xff0c;我们也…

问道管理:沪指震荡跌0.84%,银行、医药等板块走弱,地产板块逆市拉升

2日早盘&#xff0c;沪指盘中震动下探&#xff0c;深成指、创业板指亦走低&#xff1b;两市半日成交约5400亿元&#xff0c;北向资金净卖出约35亿元。 到午间收盘&#xff0c;沪指跌0.84%报3263.2点&#xff0c;深成指跌0.42%&#xff0c;创业板指跌0.27%&#xff0c;上证50指数…

UPnP是什么?有什么更好的连接方案?快解析内网穿透

一、UPnP是什么 有些小伙伴对于UPnP并不了解&#xff0c;其实UPnP只是一种网络协议&#xff0c;主要作用就是简化家庭和企业网络中设备之间的连接和通信过程&#xff0c;它的主要目标是实现网络的无缝连接&#xff0c;并简化相关网络操作。 二、UPnP有什么主要作用&#xff1…

激光切割机好不好?激光切割与线切割应该怎么选择对比

在选择激光切割机与线切割机进行比较时&#xff0c;我们首先需要理解两者的特性与特点。 激光切割机&#xff1a;现阶段主流的激光切割设备主要包括光纤激光切割机和CO2激光切割机。其中CO2激光切割机主要用于切割厚板&#xff0c;但也可完成非金属材料的切割。光纤激光切割机则…

面试题:JS中的String常见方法有哪些?

面试题&#xff1a;说不出五个就尴尬了&#xff01;我目前只写了几个方法&#xff0c;待更新中。。。 1、length2、slice()3、substr()4、substring()5、split()6、indexOf() 1、length 作用&#xff1a;检测字符串的长度。 let str abcde console.log(str.length) // 52、sl…