前序文章:

  1. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备
  2. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入
  3. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part3):基于规则的问题分类
  4. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part4):结合问题分类的问题解析与检索语句生成

背景

在前面几个模块中我们已经完成了问题分类、问题解析以及问题所需要的信息检索语句的生成。下面就把这些模块串起来,然后将结果进行组装。

结果组装

结果组装就是根据不同类型的问题输出对应的结果,具体实现如下:

KGQAMedicine\answer_search\raw_answer_search.py

from utils.config import SysConfig
from py2neo import Graphclass RawAnswerSearcher(object):def __init__(self):self.graph = Graph(SysConfig.NEO4J_HOST + ":" + str(SysConfig.NEO4J_PORT), auth=(SysConfig.NEO4J_USER,SysConfig.NEO4J_PASSWORD))self.num_limit = 20def search(self, sql_list: list):final_answers = []for sql in sql_list:question_kind = sql['question_kind']answers = []for query in sql['sql']:query_result = self.graph.run(query).data()answers += query_resultfinal_answer = self._answer_standard(question_kind, answers)if final_answer:final_answers.append(final_answer)return final_answersdef _answer_standard(self, question_kind, answers):final_answer = []if not answers:return ''if question_kind == '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_kind == '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_kind == '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_kind == '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]))elif question_kind == 'disease_lasttime':desc = [i['m.cure_lasttime'] for i in answers]subject = answers[0]['m.name']final_answer = '{0}治疗可能持续的周期为:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_kind == 'disease_cureway':desc = [';'.join(i['m.cure_way']) for i in answers]subject = answers[0]['m.name']final_answer = '{0}可以尝试如下治疗:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_kind == 'disease_cureprob':desc = [i['m.cured_prob'] for i in answers]subject = answers[0]['m.name']final_answer = '{0}治愈的概率为(仅供参考):{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_kind == 'disease_easyget':desc = [i['m.easy_get'] for i in answers]subject = answers[0]['m.name']final_answer = '{0}的易感人群包括:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_kind == 'disease_desc':desc = [i['m.desc'] for i in answers]subject = answers[0]['m.name']final_answer = '{0},熟悉一下:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_kind == 'disease_acompany':desc1 = [i['n.name'] for i in answers]desc2 = [i['m.name'] for i in answers]subject = answers[0]['m.name']desc = [i for i in desc1 + desc2 if i != subject]final_answer = '{0}的症状包括:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))elif question_kind == 'disease_not_food':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_kind == 'disease_do_food':do_desc = [i['n.name'] for i in answers if i['r.name'] == '宜吃']recommand_desc = [i['n.name'] for i in answers if i['r.name'] == '推荐食谱']subject = answers[0]['m.name']final_answer = '{0}宜食的食物包括有:{1}\n推荐食谱包括有:{2}'.format(subject, ';'.join(list(set(do_desc))[:self.num_limit]),';'.join(list(set(recommand_desc))[:self.num_limit]))elif question_kind == 'food_not_disease':desc = [i['m.name'] for i in answers]subject = answers[0]['n.name']final_answer = '患有{0}的人最好不要吃{1}'.format(';'.join(list(set(desc))[:self.num_limit]), subject)elif question_kind == 'food_do_disease':desc = [i['m.name'] for i in answers]subject = answers[0]['n.name']final_answer = '患有{0}的人建议多试试{1}'.format(';'.join(list(set(desc))[:self.num_limit]), subject)elif question_kind == 'disease_drug':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_kind == 'drug_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_kind == 'disease_check':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_kind == 'check_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]))return final_answer

各模块组装与问答类构建

该模块就是将pipline中的各个模块组装起来。具体如下:

KGQAMedicine\chatbot.py

from question_classify.rule_question_classify import RuleQuestionClassifier
from question_parser.rule_question_parser import RuleQuestionParser
from answer_search.raw_answer_search import RawAnswerSearcherclass ChatBot(object):def __init__(self):self.classifier = RuleQuestionClassifier()self.parser = RuleQuestionParser()self.answer_generate = RawAnswerSearcher()self.common_answer = "您好,我是科皮子菊的医药私人助手,希望可以为您解答。如果答案不满意,可以通过:https://github.com/Htring 联系我哦。祝您身体健康,远离我哦!"def answer(self, question):question_classify = self.classifier.classify(question)if not question_classify:return self.common_answerres_sql = self.parser.parser(question_classify)final_answers = self.answer_generate.search(res_sql)if not final_answers:return self.common_answerelse:return "\n".join(final_answers)if __name__ == '__main__':chat_bot = ChatBot()while True:question = input("用户:")answer = chat_bot.answer(question)print("科皮子菊:", answer)

效果展示:

总结

总得来说,这个项目把使用知识图谱进行QA的一些流程介绍的比较清楚,但是在完成问答的过程中技术相对老旧,不过效果依然还不错。源码已经放到我的github上:https://github.com/Htring/KGQAMedicine,有兴趣的可以下载运行看看哦,上面有运行介绍哦。

为了能够进一步提升效果的话可以引入很多新技术。例如在问题分类环节可以引入基于深度学习的问题分类方法,在进行问题解析的时候,可以引入基于深度学习的NER实体识别方式以及进一步处进行实体对齐等,这里不作进一步展开。

除此之外,知识图谱在构建是需要结合业务需求,也就是在接到业务的时候以及对现有数据进行分析然后构建基于业务的schema,再通过自然语言处理相关技术进行知识图谱的构建。在原项目中,使用爬虫的方式进行数据爬取,其也可以使用NLP相关的基础,优化提取的数据等等。

雄关漫道真如铁,而今迈步重头越。刚入门,一个新的开始。往后和增加更多基于深度学习算法的内容到知识图谱的建设,应用等。

【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part5-完结):信息检索与结果组装相关推荐

  1. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入

    前序文章: [知识图谱]实践篇--基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备 背景 前文已经介绍了该系统的环境准备.下面介绍图谱数据获取,数据主要从:http://jib.xyw ...

  2. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part4):结合问题分类的问题解析与检索语句生成

    前序文章: [知识图谱]实践篇--基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备 [知识图谱]实践篇--基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入 [知识图谱] ...

  3. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备

    背景 上一个实践项目是:[知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践.这个属于入门级的项目,可以了解一下neo4j的一些基本操作,以及简单的问答处理.下面进行 ...

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

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

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

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

  6. 基于医疗知识图谱的问答系统源码详解

    承接上一篇系统搭建和遇到的问题,本篇解析系统功能的实现,并做了部分修改. 项目是找的中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKno ...

  7. 菜哥学知识图谱(通过“基于医疗知识图谱的问答系统”)(二)(搭建系统)

    上接菜哥学知识图谱(通过"基于医疗知识图谱的问答系统")(一) 3.搭建项目2 被小学生拖累连跪5把,近期不搞了- 继续搭建项目.先把neo4j启动起来. 编辑build_medi ...

  8. mysql实现知识图谱_基于电影知识图谱的智能问答系统学习记录

    学习了"谓之小一"大佬的基于电影知识图谱的智能问答系统,做个记录.地址如下:https://github.com/weizhixiaoyi/DouBan-KGQA 一.知识图谱构建 ...

  9. Python 医学知识图谱问答系统(一),建立医学知识图谱,基于neo4j知识图谱的医学问答体系

    医学知识问答,知识图谱建设部分,建设过程如下: 一.首先,准备数据,主要为结构化的医学数据,包含实体和关系 原始数据样式(来源于刘焕勇老师整理的医学数据): 二.在neo4j数据库中建立空数据库,并且 ...

最新文章

  1. 2021谷歌学术指标出炉:CVPR总榜第4,仅次于Science,ECCV超过ICCV......
  2. detectmultiscale函数参数含义_OpenCV detectMultiScale函数
  3. 2021-春季学习-智能车技术创新与实践-Lesson3
  4. ORACLE经常使用的命令
  5. Java实现返回的数据为树形结构
  6. c语言基本字符集ppt,C语言的字符集和保留字知识讲稿.ppt
  7. IIS中的 Asp.Net Core 和 dotnet watch
  8. 寒窗苦读十多年,我的毕业论文只研究了一个「屁」
  9. 空间皮肤代码_不废话,看我20行代码搞定色块提取与定位…….
  10. Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告
  11. 【李宏毅2020 ML/DL】P16 PyTorch Tutorial | 最后提及了 apex.amp
  12. Cannot start process,the working directory 'F:\hello\hello'does not exit 问题解决
  13. 虚拟机安装Mac系统
  14. 编译原理研究性学习专题 2——递归下降语法分析设计原理与实现
  15. html实现文字在表格上方左侧,html,表格,左对齐.doc
  16. excel两列数据对比找不同_怎么在excel中对比两列数据并查找重复项?
  17. ASO优化如何做?3个核心要点必须掌握
  18. 20190628 《此生,未完成》-- 于娟
  19. 方框加对勾怎么输入_对号“√”怎么输入到方框“□”-空格对号
  20. 三、GTK-按钮(微调按钮、复选按钮、单选按钮)、快捷键、热键

热门文章

  1. ROS 简单的跨浏览器通信
  2. ps水花飞溅效果制作
  3. 牛客2019跨年AK场题解(一)
  4. CyberArk被评为2022年Gartner特权访问管理魔力象限领导者
  5. OpenCV中Viz模块的安装(VS2015)
  6. windows 介绍
  7. 微信小程序:更改页面背景颜色
  8. 网络营销中的动态定价策略
  9. java.lang.OutOfMemoryError: PermGen space
  10. 物联网 嵌入式 单片机毕业设计题目100例