【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part4):结合问题分类的问题解析与检索语句生成
前序文章:
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part3):基于规则的问题分类
背景
前文中已经对问题分类做了处理,下面就需要针对具体类别的问题进行进一步的解析,以生成对应的neo4j的查询语句。
问题解析
原程序中设计的问题也相对简单,对应问题的解析也不复杂。在问题分类中输出的结果这一环节中其实已经默认做了实体对齐操作(问句中的实体与数据库中的实体相对应),主要的工作就是根据不同实体对应关系生成对应的neo4j关系查询或者实体属性查询的语句即可。有如下效果:
针对百日咳可以吃什么问题,我们通过规则生活对应的cypher查询语句。具体实现如下:
class RuleQuestionParser(object):@staticmethoddef _get_entity_dict(args: dict):entity_dict = {}for arg, kinds in args.items():for kind in kinds:entity_dict.setdefault(kind, [])entity_dict[kind].append(arg)return entity_dictdef parser(self, classify_res: dict):args = classify_res['args']entity_dict = self._get_entity_dict(args)question_kinds = classify_res['question_kinds']sql_list = []for question_kind in question_kinds:sql_dict = {"question_kind": question_kind}if question_kind == "disease_symptom":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "symptom_disease":sql = self.sql_transfer(question_kind, entity_dict.get('symptom'))elif question_kind == "disease_cause":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_acompany":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_not_food":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_not_food":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_do_food":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "food_not_disease":sql = self.sql_transfer(question_kind, entity_dict.get('food'))elif question_kind == "food_do_disease":sql = self.sql_transfer(question_kind, entity_dict.get('food'))elif question_kind == "disease_drug":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "drug_disease":sql = self.sql_transfer(question_kind, entity_dict.get('drug'))elif question_kind == "disease_check":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "check_disease":sql = self.sql_transfer(question_kind, entity_dict.get('check'))elif question_kind == "disease_prevent":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_lasttime":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_cureway":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_cureprob":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_easyget":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))elif question_kind == "disease_desc":sql = self.sql_transfer(question_kind, entity_dict.get('disease'))else:sql = []if sql:sql_dict['sql'] = sqlsql_list.append(sql_dict)return sql_listdef sql_transfer(self, question_kind, entities):if not entities:return []# query disease causeif question_kind == 'disease_cause':sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.cause".format(i) for i in entities]elif question_kind == "disease_prevent":sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.prevent".format(i) for i in entities]elif question_kind == "disease_lasttime":sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.cure_lasttime".format(i) for i in entities]elif question_kind == "disease_cureprob":sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.cured_prob".format(i) for i in entities]elif question_kind == "disease_cureway":sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.cure_way".format(i) for i in entities]elif question_kind == "disease_easyget":sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.easy_get".format(i) for i in entities]elif question_kind == "disease_desc":sql = ["MATCH (m: Disease) where m.name = '{}' return m.name, m.desc".format(i) for i in entities]elif question_kind == "disease_symptom":sql = ["MATCH (m: Disease)-[r: has_symptom]-> (n:Symptom) where m.name='{}' return m.name, r.name, n.name".format(i) for i in entities]elif question_kind == "symptom_disease":sql = ["MATCH (m: Disease)-[r: has_symptom]-> (n:Symptom) where n.name='{}' return m.name, r.name, n.name".format(i) for i in entities]elif question_kind == "disease_acompany":sql1 = ["MATCH (m: Disease)-[r: acompany_with]-> (n: Disease) where m.name='{}' return m.name, r.name, n.mame".format(i) for i in entities]sql2 = ["MATCH (m: Disease)-[r: acompany_with]-> (n: Disease) where n.name='{}' return m.name, r.name, n.mame".format(i) for i in entities]sql = sql1 + sql2elif question_kind == 'disease_not_food':sql = ["MATCH (m:Disease)-[r:no_eat]->(n:Food) where m.name = '{0}' return m.name, r.name, n.name".format(i)for i in entities]elif question_kind == 'disease_do_food':sql1 = ["MATCH (m:Disease)-[r:do_eat]->(n:Food) where m.name = '{0}' return m.name, r.name, n.name".format(i)for i in entities]sql2 = ["MATCH (m:Disease)-[r:recommand_eat]->(n:Food) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]sql = sql1 + sql2elif question_kind == 'food_not_disease':sql = ["MATCH (m:Disease)-[r:no_eat]->(n:Food) where n.name = '{0}' return m.name, r.name, n.name".format(i)for i in entities]elif question_kind == 'food_do_disease':sql1 = ["MATCH (m:Disease)-[r:do_eat]->(n:Food) where n.name = '{0}' return m.name, r.name, n.name".format(i)for i in entities]sql2 = ["MATCH (m:Disease)-[r:recommand_eat]->(n:Food) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]sql = sql1 + sql2elif question_kind == 'disease_drug':sql1 = ["MATCH (m:Disease)-[r:common_drug]->(n:Drug) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]sql2 = ["MATCH (m:Disease)-[r:recommand_drug]->(n:Drug) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]sql = sql1 + sql2elif question_kind == 'drug_disease':sql1 = ["MATCH (m:Disease)-[r:common_drug]->(n:Drug) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]sql2 = ["MATCH (m:Disease)-[r:recommand_drug]->(n:Drug) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]sql = sql1 + sql2elif question_kind == 'disease_check':sql = ["MATCH (m:Disease)-[r:need_check]->(n:Check) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]elif question_kind == 'check_disease':sql = ["MATCH (m:Disease)-[r:need_check]->(n:Check) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]else:sql = []return sql
【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part4):结合问题分类的问题解析与检索语句生成相关推荐
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part5-完结):信息检索与结果组装
前序文章: [知识图谱]实践篇--基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备 [知识图谱]实践篇--基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入 [知识图谱] ...
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入
前序文章: [知识图谱]实践篇--基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备 背景 前文已经介绍了该系统的环境准备.下面介绍图谱数据获取,数据主要从:http://jib.xyw ...
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备
背景 上一个实践项目是:[知识图谱]实践篇--基于知识图谱的<红楼梦>人物关系可视化及问答系统实践.这个属于入门级的项目,可以了解一下neo4j的一些基本操作,以及简单的问答处理.下面进行 ...
- 知识图谱入门2-1:实践——基于医疗知识图谱的问答系统
注:欢迎关注datawhale:https://datawhale.club/ 系列: 知识图谱入门一:知识图谱介绍 知识图谱入门2-1:实践--基于医疗知识图谱的问答系统 知识图谱入门2-2:用户输 ...
- “基于医疗知识图谱的问答系统”代码解析(一)
"基于医疗知识图谱的问答系统"代码解析(一) build_medicalgraph.py -建立医疗知识图谱的代码解析 "基于医疗知识图谱的问答系统"代码解析( ...
- 基于医疗知识图谱的问答系统源码详解
承接上一篇系统搭建和遇到的问题,本篇解析系统功能的实现,并做了部分修改. 项目是找的中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKno ...
- 菜哥学知识图谱(通过“基于医疗知识图谱的问答系统”)(二)(搭建系统)
上接菜哥学知识图谱(通过"基于医疗知识图谱的问答系统")(一) 3.搭建项目2 被小学生拖累连跪5把,近期不搞了- 继续搭建项目.先把neo4j启动起来. 编辑build_medi ...
- mysql实现知识图谱_基于电影知识图谱的智能问答系统学习记录
学习了"谓之小一"大佬的基于电影知识图谱的智能问答系统,做个记录.地址如下:https://github.com/weizhixiaoyi/DouBan-KGQA 一.知识图谱构建 ...
- Python 医学知识图谱问答系统(一),建立医学知识图谱,基于neo4j知识图谱的医学问答体系
医学知识问答,知识图谱建设部分,建设过程如下: 一.首先,准备数据,主要为结构化的医学数据,包含实体和关系 原始数据样式(来源于刘焕勇老师整理的医学数据): 二.在neo4j数据库中建立空数据库,并且 ...
最新文章
- 基础篇verilog-‘timescale的解释
- 开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门
- 关于质粒,学生物的你应该知道的那些事儿
- Keyword-Driven Testing
- ubuntu12.04
- 开启ntp_飒,NTP时钟服务器在银行大楼系统方案
- kafka0.8消费者实例 1
- 新时达as380服务器显示75,成为电梯高手之新时达AS380控制系统故障代码
- matlab之矩阵运算
- 微信小程序组件间传值
- Java 发送短信工具类
- 快递100 物流公司编码
- 策略分享-基于海龟交易模型的优化 暂存
- 手写数字识别的小优化
- [51Nod](1278)相离的圆 ---- 二分查找
- Information Communication Technology,简称ICT
- 小程序源码:修复登录大河盲盒小程序源码,实现运营“玩法自由”,超多功能的盲盒型抽奖挖矿程序源码下载
- CentOS7创建普通用户
- 记一次硬盘坏道问题的处理
- Android aar格式库