计算机毕业设计-基于知识图谱的胆囊炎医疗问答系统项目开发实战(附源码+论文)
本文介绍了一种基于知识图谱的胆囊炎医疗问答系统,采用Python+Django+MySQL+Neo4j技术栈开发。系统包含知识图谱操作和系统管理两大模块,支持医疗信息检索、智能问答、词性分析、动态图谱展示等功能。后端实现了疾病检索、用户管理、日志记录等核心功能,前端界面展示了知识图谱、问答管理、数据分析等交互页面。系统通过自然语言处理技术抽取医疗实体关系,构建知识图谱,为患者提供便捷的胆囊炎医疗信
大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。
精彩专栏推荐👇🏻👇🏻👇🏻
开发环境
开发语言:Python
框架:django
Python版本:python3.7.7
数据库:mysql 5.7
数据库工具:Navicat11
开发软件:PyCharm
浏览器:谷歌浏览器
演示视频
python204基于知识图谱的胆囊炎医疗问答系统
论文目录
【如需全文请按文末获取联系】

一、项目简介
本文提出了一种基于知识图谱的胆囊炎医疗问答系统,目的主要是帮助患者更便捷地获取与胆囊炎相关的医疗信息。该系统采用了Python语言、MySQL数据库和Django框架进行开发,并集成了Neo4j图数据库用于实体抽取和关系建模。
首先需要收集关于胆囊炎的医疗知识数据,并对其进行了预处理,包括清洗和整理。然后利用自然语言处理技术进行实体抽取,从文本数据中提取出疾病、症状、治疗方法等实体,并建立它们之间的关系。在数据库设计方面,使用MySQL存储抽取出的实体和关系,并设计了相应的数据表结构。
通过Django框架开发了医疗问答系统的用户界面和后端逻辑,并集成了Neo4j图数据库,将抽取出的实体和关系存储其中,以支持系统的复杂查询和推理。最后对系统进行了测试和优化,确保其稳定性和性能。
二、系统设计
2.1软件功能模块设计
本次开发的胆囊炎医疗问答系统主要的功能需求如下所示:
知识图谱操作模块:
(1)检查医疗信息:可以在这里对一些医疗信息进行检查。
(2)知识图谱问答:可以在这里输入一些问题,然后系统会进行相应的回复。
(3)问答管理:可以对系统中已经有的问答进行一些管理操作。
(4)词性分析:对一个词语进行词性分析,可以支持用户进行自定义的输入。
(5)知识图谱:进行知识图谱的展示,动态的图谱展示效果更好更容易让用户使用。
(6)问题反馈:如果发生了问题或者是有一些建议都可以进行反馈操作。
系统管理模块:
(1)用户管理:可以对用户进行管理操作。
(2)日志管理:日治管理就是对使用这个系统的用户使用情况进行查看和管理。
(3)反馈管理:对用户所提出的一些问题进行查看和回复。
(4)个人信息:对系统中的个人信息进行查看和管理操作,可以支持用户进行修改。
(5)使用分析:通过数据可视化的形式对用户使用的情况进行展示。
(6)药品管理:可以对系统中的一些药品信息进修修改如果药品信息不对方便进行及时的更正操作。根据以上的功能详情,设计出的功能模块图如图所示:

2.2数据库设计

三、系统项目部分截图
3.1知识图谱操作模块
(1)图谱问答:
(2)知识检索:
(3)问答管理:
(6)知识图谱:
3.2系统管理模块
3.3房屋信息展示
(1)用户管理:
(2)日志管理:
(4)使用分析:
(5)药品管理:
四、部分核心代码
import datetime
import json
import os
from django.core.paginator import Paginator
from django.db.models import Count
from django.forms import model_to_dict
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, JsonResponse
from django.shortcuts import render
from user.models import User
from utils import common
from .models import *
from utils import common
workdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def login(request):
"""
跳转登录
:param request:
:return:
"""
return render(request, 'login.html')
def register(request):
"""
跳转注册
:param request:
:return:
"""
return render(request, 'register.html')
def welcome(request):
"""
跳转注册
:param request:
:return:
"""
return render(request, 'welcome.html')
def cxfx(request):
"""
跳转注册
:param request:
:return:
"""
return render(request, 'cxfx.html')
def search(request):
"""
跳转注册
:param request:
:return:
"""
results = Disease.objects.all()[0:30]
return render(request, 'search.html', locals())
def search_name(request):
try:
name = request.GET.get('name')
info = Disease.objects.filter(name__contains=name).first()
info = model_to_dict(info)
common.create_log(request, '搜索', '搜索内容', name, 1)
st = "<dt class = \"basicInfo-item name\" >疾病名称: \
<dd class = \"basicInfo-item value\" >" + str(info['name']) + "</dd ><dt class = \"basicInfo-item name\" >疾病描述: \
<dd class = \"basicInfo-item value\" >" + str(info['desc']) + "</dd ><dt class = \"basicInfo-item name\" >疾病类别: \
<dd class = \"basicInfo-item value\" >" + str(info['category']) + "</dd ><dt class = \"basicInfo-item name\" >疾病预防: \
<dd class = \"basicInfo-item value\" >" + str(info['prevent']) + "</dd ><dt class = \"basicInfo-item name\" >疾病病因: \
<dd class = \"basicInfo-item value\" >" + str(info['cause']) + "</dd ><dt class = \"basicInfo-item name\" >疾病症状: \
<dd class = \"basicInfo-item value\" >" + str(info['symptom']) + "</dd ><dt class = \"basicInfo-item name\" >是否纳入医保: \
<dd class = \"basicInfo-item value\" >" + str(info['yibao_status']) + "</dd ><dt class = \"basicInfo-item name\" >治疗科室: \
<dd class = \"basicInfo-item value\" >" + str(info['cure_department']) + "</dd ><dt class = \"basicInfo-item name\" >治疗方法: \
<dd class = \"basicInfo-item value\" >" + str(info['cure_way']) + "</dd ><dt class = \"basicInfo-item name\" >治疗时长: \
<dd class = \"basicInfo-item value\" >" + str(info['cure_lasttime']) + "</dd ><dt class = \"basicInfo-item name\" >推荐药物: \
<dd class = \"basicInfo-item value\" >" + str(info['recommand_drug']) + "</dd >"
Sousuo.objects.create(
owner=request.session['username'],
name=name,
status='成功'
)
return JsonResponse({'info': st, 'statusCode': '200'})
except Exception as e:
return JsonResponse({'msg': '没有搜索到', 'statusCode': '500'})
def index(request):
"""
跳转首页
:param request:
:return:
"""
# with open(os.path.join(workdir, "static/medical.json"), encoding="utf-8") as f:
# data = f.readlines()
# for i in data:
# file = json.loads(i)
# name = file["name"]
# print(name, type(file))
# desc = file["desc"]
# category = file["category"]
# prevent = file["prevent"]
# cause = file["cause"] if "cause" in file.keys() else ''
# symptom = file["symptom"] if "symptom" in file.keys() else ''
# yibao_status = file["yibao_status"] if "yibao_status" in file.keys() else ''
# get_prob = file["get_prob"] if "get_prob" in file.keys() else ''
# get_way = file["get_way"] if "get_way" in file.keys() else ''
# acompany = file["acompany"] if "acompany" in file.keys() else ''
# cure_department = file["cure_department"] if "cure_department" in file.keys() else ''
# cure_way = file["cure_way"] if "cure_way" in file.keys() else ''
# cure_lasttime = file["cure_lasttime"] if "cure_lasttime" in file.keys() else ''
# cured_prob = file["cured_prob"] if "cured_prob" in file.keys() else ''
# common_drug = file["common_drug"] if "common_drug" in file.keys() else ''
# cost_money = file["cost_money"] if "cost_money" in file.keys() else ''
# check = file["check"] if "check" in file.keys() else ''
# recommand_drug = file["recommand_drug"] if "recommand_drug" in file.keys() else ''
# do_eat = file["do_eat"] if "do_eat" in file.keys() else ''
# not_eat = file["not_eat"] if "not_eat" in file.keys() else ''
# Disease.objects.create(
# name=file["name"],
# desc=desc[0:500],
# category=category,
# prevent=prevent[0:500],
# cause=cause[0:1000],
# symptom=symptom,
# yibao_status=yibao_status,
# get_prob=get_prob[0:500],
# get_way=get_way,
# acompany=acompany[0:500],
# cure_department=cure_department[0:500],
# cure_way=cure_way[0:500],
# cure_lasttime=cure_lasttime,
# cured_prob=cured_prob,
# common_drug=common_drug,
# cost_money=cost_money,
# check=check,
# recommand_drug=recommand_drug,
# do_eat=do_eat,
# not_eat=not_eat,
# )
username = request.session.get('username', '')
role = int(request.session.get('role', 3))
user_id = request.session.get('user_id', 1)
total_user = len(User.objects.all())
date = datetime.datetime.today()
month = date.month
year = date.year
day = date.day
current_day = "{}-{}-{}".format(year, month, day)
# 获取近七天的操作
seven_days = common.get_recent_seven_day()
seven_data_dict = dict.fromkeys(seven_days, 0)
for i in seven_days:
d = datetime.timedelta
r = Info.objects.filter(create_time__year=i.split('-')[0], create_time__month=i.split('-')[1],
create_time__day=i.split('-')[2]).all()
if r:
seven_data_dict[i] = r.count()
seven_count_list = [seven_data_dict[x] for x in seven_days]
return render(request, 'index.html', locals())
def login_out(request):
"""
注销登录
:param request:
:return:
"""
del request.session['username']
return HttpResponseRedirect('/')
def personal(request):
username = request.session['username']
role_id = request.session['role']
user = User.objects.filter(name=username).first()
return render(request, 'personal.html', locals())
def get_wd(request):
"""
获取列表信息 | 模糊查询
:param request:
:return:
"""
keyword = request.GET.get('name')
page = request.GET.get("page", '')
limit = request.GET.get("limit", '')
response_data = {}
response_data['code'] = 0
response_data['msg'] = ''
data = []
if keyword is None:
results_obj = Info.objects.all()
else:
results_obj = Info.objects.filter(name__contains=keyword).all()
paginator = Paginator(results_obj, limit)
results = paginator.page(page)
if results:
for result in results:
record = {
"id": result.id,
"question": result.name,
"answer": result.result,
"owner": result.owner,
'create_time': result.create_time,
}
data.append(record)
response_data['count'] = len(results_obj)
response_data['data'] = data
return JsonResponse(response_data)
def get_fk(request):
"""
获取列表信息 | 模糊查询
:param request:
:return:
"""
keyword = request.GET.get('name')
page = request.GET.get("page", '')
limit = request.GET.get("limit", '')
response_data = {}
response_data['code'] = 0
response_data['msg'] = ''
data = []
if keyword is None:
results_obj = Suggest.objects.all()
paginator = Paginator(results_obj, limit)
results = paginator.page(page)
if results:
for result in results:
record = {
"id": result.id,
"username": result.username,
"phone": result.phone,
"text": result.text,
'create_time': result.create_time,
}
data.append(record)
response_data['count'] = len(results_obj)
response_data['data'] = data
return JsonResponse(response_data)
def wdgl(request):
"""
跳转页面
"""
username = request.session.get('username', '')
role = int(request.session.get('role', 3))
user_id = request.session.get('user_id', 1)
return render(request, 'wdgl.html', locals())
def del_fk(request):
user_id = request.POST.get('id')
result = Suggest.objects.filter(id=user_id).first()
try:
if not result:
response_data = {'error': '删除失败!', 'message': '找不到id为%s' % user_id}
return JsonResponse(response_data, status=403)
common.create_log(request, '删除', '删除反馈', user_id, 1)
result.delete()
response_data = {'message': '删除成功!'}
return JsonResponse(response_data, status=201)
except Exception as e:
response_data = {'message': '删除失败!'}
return JsonResponse(response_data, status=403)
def del_drug(request):
user_id = request.POST.get('id')
result = Drug.objects.filter(id=user_id).first()
try:
if not result:
response_data = {'error': '删除失败!', 'message': '找不到id为%s' % user_id}
return JsonResponse(response_data, status=403)
common.create_log(request, '删除', '删除反馈', user_id, 1)
result.delete()
response_data = {'message': '删除成功!'}
return JsonResponse(response_data, status=201)
except Exception as e:
response_data = {'message': '删除失败!'}
return JsonResponse(response_data, status=403)
def del_wd(request):
"""
删除信息
"""
user_id = request.POST.get('id')
result = Info.objects.filter(id=user_id).first()
try:
if not result:
response_data = {'error': '删除失败!', 'message': '找不到id为%s' % user_id}
return JsonResponse(response_data, status=403)
common.create_log(request, '删除', '删除问答', user_id, 1)
result.delete()
response_data = {'message': '删除成功!'}
return JsonResponse(response_data, status=201)
except Exception as e:
response_data = {'message': '删除失败!'}
return JsonResponse(response_data, status=403)
def edit_data(request):
"""
修改信息
"""
response_data = {}
user_id = request.POST.get('id')
username = request.POST.get('username')
phone = request.POST.get('phone')
User.objects.filter(id=user_id).update(
name=username,
phone=phone)
response_data['msg'] = 'success'
return JsonResponse(response_data, status=201)
def save_file(file):
"""
保存文件
"""
if file is not None:
file_dir = os.path.join(workdir, 'static', 'uploadImg')
if not os.path.exists(file_dir):
os.mkdir(file_dir)
file_name = os.path.join(file_dir, file.name)
with open(file_name, 'wb')as f:
# chunks()每次读取数据默认 我64k
for chunk in file.chunks():
f.write(chunk)
f.close()
return file_name
else:
return None
def predict(request):
from .knowledge.chatbot_graph import main
text = request.POST.get('text')
try:
result = main(text)
print(result)
info = Info.objects.create(name=text,
status="成功",
result=result,
owner=request.session.get('username', 'admin'),
)
common.create_log(request, '新增', '新增问答', info.id, 1)
return JsonResponse({"result": result})
except Exception as e:
print(e)
return JsonResponse({"error": 403})
def graph(request):
return render(request, 'graph.html', locals())
def log_show(request):
"""跳转跳转日志管理页面"""
return render(request, 'log.html', locals())
def fkgl(request):
return render(request, 'fkgl.html', locals())
def suggest(request):
if request.method == 'GET':
return render(request, 'suggest.html', locals())
else:
text = request.POST.get('text')
phone = request.POST.get('phone')
username = request.session['username']
Suggest.objects.create(
username=username,
text=text,
phone=phone
)
return JsonResponse({"msg": 'ok'})
def log_data(request):
"""日志查询、删除"""
if request.method == "GET":
data = []
# 获取分页数据
page = request.GET["page"]
per_page = request.GET["limit"]
if len(request.GET) == 2:
results = Log.objects.all().order_by('-append_time')
else:
# 条件查询
account = request.GET.get('account', '')
log_type = request.GET.get('type', '')
date = request.GET.get('date')
if not date:
results = Log.objects.filter(account__contains=account, type__contains=log_type).all().order_by(
'-append_time')
else:
date = datetime.datetime.strptime(request.GET.get('date'), "%Y-%m-%d")
results = Log.objects.filter(account__contains=account).filter(type__contains=log_type) \
.filter(append_time__year=date.year, append_time__month=date.month,
append_time__day=date.day).all().order_by('')
results_obj = Paginator(results, per_page).page(page)
for result in results_obj:
dict_data = model_to_dict(result)
dict_data['append_time'] = result.append_time.strftime('%Y-%m-%d %H:%M:%S')
data.append(dict_data)
response_data = {
'msg': True,
'code': 0,
'count': len(results),
'data': data
}
# 序列化python对象
return JsonResponse(response_data)
# 删除日志
elif request.method == 'DELETE':
del_list = json.loads(request.body.decode())
response_data = {}
try:
# 删除日志相关信息
Log.objects.filter(id__in=del_list).delete()
response_data["msg"] = "日志已删除!"
except Exception as e:
print(e)
response_data["msg"] = "日志删除失败!"
return JsonResponse(response_data)
def get_drug(request):
keyword = request.GET.get('name')
page = request.GET.get("page", '')
limit = request.GET.get("limit", '')
response_data = {}
response_data['code'] = 0
response_data['msg'] = ''
data = []
if keyword is None:
results_obj = Drug.objects.all()
else:
results_obj = Drug.objects.filter(name__contains=keyword).all()
paginator = Paginator(results_obj, limit)
results = paginator.page(page)
if results:
for result in results:
record = {
"id": result.id,
'name': result.name,
'addr': result.addr,
'shangjia': result.shangjia,
'price': result.price,
'description': result.description,
'drug_type': result.drug_type,
'create_time': result.create_time
}
data.append(record)
response_data['count'] = len(results_obj)
response_data['data'] = data
return JsonResponse(response_data)
def edit_drug(request):
d_id = request.POST.get('id')
description = request.POST.get('description')
name = request.POST.get('name')
price = request.POST.get('price')
addr = request.POST.get('addr')
shangjia = request.POST.get('shangjia')
drug_type = request.POST.get('drug_type')
Drug.objects.filter(id=d_id).update(
name=name,
shangjia=shangjia,
addr=addr,
description=description,
price=str(price),
drug_type=drug_type
)
return JsonResponse({"msg": 'ok'})
def drug(request):
if request.method == 'GET':
return render(request, 'drug.html')
else:
description = request.POST.get('description')
name = request.POST.get('name')
price = request.POST.get('price')
addr = request.POST.get('addr')
shangjia = request.POST.get('shangjia')
drug_type = request.POST.get('drug_type')
Drug.objects.create(
name=name,
shangjia=shangjia,
addr=addr,
description=description,
price=str(price),
drug_type=drug_type
)
return JsonResponse({"msg":'ok'})
def cxbz(request):
"""
词性标注
:param request:
:return:
"""
text = request.POST.get('text')
from .predict import fenci
words, result = fenci(text)
return JsonResponse({'words': words, 'result': result})
def analysis(request):
results = Sousuo.objects.values('owner').annotate(myCount=Count('owner')) # 返回查询集合
country = []
count = []
for i in results:
country.append(i['owner'])
count.append(i['myCount'])
result1 = Info.objects.values('owner').annotate(myCount=Count('owner')) # 返回查询集合
values = []
for i in result1:
values.append({'name': i['owner'], 'value': i['myCount']})
username = request.session.get('username', 'admin')
role = int(request.session.get('role', 3))
user_id = request.session.get('user_id', 1)
return render(request, 'analysis.html', locals())
获取源码或论文
如需对应的论文或源码,以及其他定制需求,也可以下方微信联系我。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)