当前位置:网站首页>[knowledge atlas] practice -- Practice of question answering system based on medical knowledge atlas (Part4): problem analysis and retrieval sentence generation combined with problem classification
[knowledge atlas] practice -- Practice of question answering system based on medical knowledge atlas (Part4): problem analysis and retrieval sentence generation combined with problem classification
2022-07-25 16:52:00 【Coriander Chrysanthemum】
Preface article :
- 【 Knowledge map 】 Practice chapter —— Practice of question answering system based on medical knowledge map (Part1): Project introduction and environmental preparation
- 【 Knowledge map 】 Practice chapter —— Practice of question answering system based on medical knowledge map (Part2): Atlas data preparation and import
- 【 Knowledge map 】 Practice chapter —— Practice of question answering system based on medical knowledge map (Part3): Rule based problem classification
background
The problem classification has been dealt with in the previous article , Next, we need to further analyze the problems of specific categories , To generate the corresponding neo4j Query statement .
Problem analysis
The design problem in the original program is also relatively simple , The analysis of the corresponding problem is not complicated . In fact, entity alignment has been done by default in the output results of problem classification ( The entities in the questions correspond to those in the database ), The main work is to generate corresponding neo4j The statement of relation query or entity attribute query . It has the following effects :
What can I eat for pertussis , We live by rules cypher Query statement . The specific implementation is as follows :
class RuleQuestionParser(object):
@staticmethod
def _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_dict
def 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'] = sql
sql_list.append(sql_dict)
return sql_list
def sql_transfer(self, question_kind, entities):
if not entities:
return []
# query disease cause
if 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 + sql2
elif 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 + sql2
elif 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 + sql2
elif 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 + sql2
elif 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 + sql2
elif 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
边栏推荐
- Roson的Qt之旅#99 QML表格控件-TableView
- Rosen's QT journey 99 QML table control tableview
- 简述redis集群的实现原理
- Talk about how to use redis to realize distributed locks?
- 【MySQL篇】一文带你初识数据库
- 新增批量删除
- Fastadmin TP installation uses Baidu rich text editor ueeditor
- 【目标检测】YOLOv5跑通VOC2007数据集(修复版)
- easyui datagrid控件使用
- Baidu rich text editor ueeditor image width 100% adaptive, mobile terminal
猜你喜欢

Jenkins' file parameters can be used to upload files

柏睿数据加入阿里云PolarDB开源数据库社区

2D semantic segmentation -- deeplabv3plus reproduction

一百个用户眼中,就有一百个QQ

Multi tenant software development architecture

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

Hcip notes 12 days

152. 乘积最大子数组

Communication between processes (pipeline details)

easyui下拉框,增加以及商品的上架,下架
随机推荐
Outlook 教程,如何在 Outlook 中搜索日历项?
Automatic reply of wechat official account development message
[book club issue 13] +ffmpeg video capture function
城市燃气安全再拉警钟,如何防患于未“燃”?
气数已尽!运营 23 年,昔日“国内第一大电商网站”黄了。。。
QT ListView 列表显示组件笔记
新增批量删除
激荡20年,芯片产能从零起步到反超美国,中国制造的又一大成就
什么是链游系统开发?链游系统开发如何制作
easyui修改以及datagrid dialog form控件使用
China's chip self-sufficiency rate has increased significantly, resulting in high foreign chip inventories and heavy losses. American chips can be said to have thrown themselves in the foot
【redis】redis安装
linux内核源码分析之页表缓存
Don't believe these "rumors" in the process of preparing for the exam!
Multi tenant software development architecture
[OBS] frame loss and frame priority before transmission
微信公众号开发之消息的自动回复
2D 语义分割——DeepLabV3plus 复现
easyui datagrid控件使用
7.依赖注入