通过知识图谱我们可以构建一个简单的医疗问答系统。在问答过程中可以方便的检索问题。

GitHub:https://github.com/cshmzin/zstp-project/tree/main/%E5%8C%BB%E7%96%97%E6%9C%BA%E5%99%A8%E4%BA%BA

实验环境

  • neo4j数据库
  • py_aho_corasick模块

简介

  • 数据提取模块(从互联网获取数据)
  • 知识图谱数据库构建模块(将数据清洗构建知识图谱)
  • 节点匹配模块(匹配节点获取关系)
  • 问题匹配模块(匹配问题构建查询)
  • 回答构建模块(输出)

实验代码

数据集的构建

数据集不做展示,可在github提取。

我们构建如下7个实体和11个关系:

        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 = [] # 疾病与科室之间的关系

然后将数据从json文件中提取出来:

  • 疾病属性的获取:
    def diseases_property(self,disease,data_json):disease_dict = {}disease_dict['name'] = diseasedisease_dict['desc'] = ''  # 描述disease_dict['prevent'] = ''  # 解决方法disease_dict['cause'] = ''  # 造成原因disease_dict['get_prob'] = ''  # 疾病发生率disease_dict['easy_get'] = ''  # 病病易发人群disease_dict['cure_way'] = ''  # 治疗方法disease_dict['cure_lasttime'] = ''  # 治疗时间disease_dict['cured_prob'] = ''  # 治疗成功率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_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']return disease_dict
  • 获取实体及其关系(例子):
            #构建科室及相关关系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: #2个表示有上下级rels_department.append([cure_department[1], cure_department[0]])rels_category.append([disease, cure_department[1]])departments += cure_department
  • 创建node
    def create_node(self,label,nodes):for node_name in nodes:node = Node(label, name=node_name)self.link.create(node)print(f'创建节点:{label},共{len(nodes)}个')
  • 循环将全部数据创建实体节点
        Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos = self.read_data()[0]self.create_diseases_nodes(disease_infos)self.create_node('Drug', Drugs)self.create_node('Food', Foods)self.create_node('Check', Checks)self.create_node('Department', Departments)self.create_node('Producer', Producers)self.create_node('Symptom', Symptoms)
  • 创建关系
    def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):# 去重处理edges = list(set([tuple(edge) for edge in edges]))edges = [list(edge) for edge in edges]for edge in edges:p,q = edgequery = "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)self.link.run(query)
  • 循环将全部数据创建关系
        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_data()[1]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', '所属科室')

数据集构建完成后可以查看如下图:


构建对话系统

在主类中我们构建了三个模块:

  • QuestionClassifier() 【对问题进行分类,确定问题种类】
  • QuestionPaser() 【对问题进行解析,获取相对应的查询语句】
  • AnswerSearcher() 【通过查询语句搜索数据库,构造回答】
class ChatBotGraph:def __init__(self):self.classifier = QuestionClassifier()self.parser = QuestionPaser()self.searcher = AnswerSearcher()def chat_main(self, sent):answer = '。。。。。。。。。。'res_classify = self.classifier.classify(sent)if not res_classify:return answerres_sql = self.parser.parser_main(res_classify)final_answers = self.searcher.search_main(res_sql)if not final_answers:return answerelse:return '\n'.join(final_answers)

问题分类

我们将问题分为如下几类,通过字段匹配和关键词匹配完成。

   def classify(self, question):data = {}medical_dict = self.check_medical(question)if medical_dict == {}:return {}data['args'] = medical_dict#收集问句当中所涉及到的实体类型types = []for type_ in medical_dict.values():types += type_question_types = []# 症状if self.check_words(self.symptom_qwds, question) and ('disease' in types):question_type = 'disease_symptom'question_types.append(question_type)if self.check_words(self.symptom_qwds, question) and ('symptom' in types):question_type = 'symptom_disease'question_types.append(question_type)# 原因if self.check_words(self.cause_qwds, question) and ('disease' in types):question_type = 'disease_cause'question_types.append(question_type)# 并发症if self.check_words(self.acompany_qwds, question) and ('disease' in types):question_type = 'disease_acompany'question_types.append(question_type)# 推荐食品if self.check_words(self.food_qwds, question) and 'disease' in types:deny_status = self.check_words(self.deny_words, question)if deny_status:question_type = 'disease_not_food'else:question_type = 'disease_do_food'question_types.append(question_type)。。。。。。。。。。。。。。。。。。。。。

问题解析

我们将分类后来问题进行解析,为每一类问题构建相应的查询代码:

        for question_type in question_types:sql_ = {}sql_['question_type'] = question_typesql = []if question_type == 'disease_symptom':sql = self.sql_transfer(question_type, entity_dict.get('disease'))elif question_type == 'symptom_disease':sql = self.sql_transfer(question_type, entity_dict.get('symptom'))elif question_type == 'disease_cause':sql = self.sql_transfer(question_type, entity_dict.get('disease'))elif question_type == 'disease_acompany':sql = self.sql_transfer(question_type, entity_dict.get('disease'))。。。。。。。。。。。。

回答构造

根据对应的qustion_type,调用相应的回复模板

def answer_prettify(self, question_type, answers):final_answer = []if not answers:return ''if question_type == 'disease_symptom':desc = [i['n.name'] for i in answers]subject = answers[0]['m.name']final_answer = '{0}的症状包括:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_type == 'symptom_disease':desc = [i['m.name'] for i in answers]subject = answers[0]['n.name']final_answer = '症状{0}可能染上的疾病有:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_type == 'disease_cause':desc = [i['m.cause'] for i in answers]subject = answers[0]['m.name']final_answer = '{0}可能的成因有:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_type == 'disease_prevent':desc = [i['m.prevent'] for i in answers]subject = answers[0]['m.name']final_answer = '{0}的预防措施包括:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

测试


【知识图谱学习】知识图谱搭建医疗问答系统相关推荐

  1. 高等教育心理学:知识的学习

    高等教育心理学:知识的学习 知识学习概述 知识的表征 根据现代认知心理学的观点,知识就是个体通过与环境相互作用后获得的信息及其组织,其实质是人脑对客观事物的特征与联系的反映,是客观事物的主观表征,是人 ...

  2. 大数据知识图谱项目——基于知识图谱的医疗知识问答系统(详细讲解及源码)

    基于知识图谱的医疗知识问答系统 一.项目概述 知识图谱是将知识连接起来形成的一个网络.由节点和边组成,节点是实体,边是两个实体的关系,节点和边都可以有属性.知识图谱除了可以查询实体的属性外,还可以很方 ...

  3. 【知识图谱】如何构建知识体系:知识图谱搭建的第一步

    互联网时代,人类在与自然和社会的交互中生产了异常庞大的数据,这些数据中包含了大量描述自然界和人类社会客观规律有用信息.如何将这些信息有效组织起来,进行结构化的存储,就是知识图谱的内容. 知识图谱的难点 ...

  4. 知识图谱学习(二):电商知识图谱

    知识图谱学习(二):电商知识图谱 --本文摘自机械工业出版社华章图书<阿里巴巴B2B电商算法实战>,参考文献请参见原书. 目录 知识图谱学习(二):电商知识图谱 前言 互联网创业潮 电商生 ...

  5. 知识图谱学习(笔记整理)

    本篇来自于文章<从技术实现到产品落地,"知识图谱"的未来还有多远?> 知识图谱学习(一) 一.组成部分 知识图谱大致可分为:知识建模.知识获取.知识融合. 知识存储.知 ...

  6. 知识图谱学习(一)(笔记整理)

    本篇来自于文章<从技术实现到产品落地,"知识图谱"的未来还有多远?> 知识图谱学习(一) 一.组成部分 知识图谱大致可分为:知识建模.知识获取.知识融合. 知识存储.知 ...

  7. 来自 Facebook 内部的 Python 学习知识图谱,太全了!

    这几年,学 Python 的程序员越来越多了,甚至不少人把 Python 当作第一语言来学习.也难怪,Python 的优点太多了,它语言简洁.开发效率高.可移植性强,并且可以和其他编程语言(比如C++ ...

  8. 0元包邮 | 知识图谱学习导图

    知识图谱可以说是整个AI的未来,是实现人工智能从"感知"跃升到"认知"的基础.近年来,作为实现认知智能的核心驱动力,已广泛应用在金融.电商.医疗.政务等诸多领域 ...

  9. 知识图谱学习资料汇总

    知识图谱学习资料汇总 持续更新中- 知识图谱介绍 (1)知识图谱入门笔记(参考王昊奋) 知乎:https://zhuanlan.zhihu.com/c_211846834 (2)Mining Know ...

最新文章

  1. 使用内部类隐藏实现细节
  2. python 2.7 简单模拟登陆网站
  3. 数据结构----------实现最小堆排序
  4. Neo4j:带密码的TF / IDF(和变体)
  5. Redis的主从复制和 哨兵模式
  6. OpenShift 4 Tekton - Katacoda的Tekton Pipeline入门示例
  7. LoadRunner的Oracle计数器
  8. 测试用例的定义、内容、作用
  9. 不差钱!华为,给学生开百万年薪
  10. 百度地图全方位解析(一)
  11. 资阳与“华为”携手共建资阳天府云计算中心
  12. iOS开发篇(二)自定义评分星级条RatingBar
  13. oracle磁带的使用期限,存储的损耗 关于磁带寿命的一些探讨
  14. 单手杀穿经典链表题Pt.2——LeetCode天梯渡劫(倒数第k节点,合并链表,链表分割,回文结构)
  15. linux系统篇 -- 一、系统概要
  16. 曝iPhone15或换用USB-C接口;Google将下架第三方Android通话录音APP|极客头条
  17. 电脑通过豌豆荚连接手机或者平板不成功,豌豆荚版本6.8.*
  18. php中seo优化怎么做,专题页面怎么做SEO优化
  19. 如何高效放鸽子——线程的创建_莫韵乐的Linux王国
  20. 落谷----P4994 终于结束的起点

热门文章

  1. oracle导出dmp文件大小限制,[Oracle数据库] 急!关于在AIX4.3.3版本下导8.0.5数据库DMP文件大小的限制!...
  2. 小米平板怎么打开html文件夹,小米平板4后盖怎么打开 小米平板4后盖打开方法详解...
  3. 水果店坏果处理,水果店卖不完如何处理
  4. 小黑小波比.解决subl按speace键删除后面文字问题
  5. 马云在深圳网商论坛的演讲
  6. 大数据----Hadoop----Spark入门介绍
  7. java发送qq消息到指定qq
  8. stm32 语音播报
  9. 湖南工商大学计算机与信息学院,赵文军(湖南工商大学计信学院信管教研室副主任。)_百度百科...
  10. Nginx Rewrite 正则表达式