当前位置:网站首页>【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part4):结合问题分类的问题解析与检索语句生成
【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part4):结合问题分类的问题解析与检索语句生成
2022-07-25 16:38:00 【科皮子菊】
前序文章:
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part1):项目介绍与环境准备
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part2):图谱数据准备与导入
- 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part3):基于规则的问题分类
背景
前文中已经对问题分类做了处理,下面就需要针对具体类别的问题进行进一步的解析,以生成对应的neo4j的查询语句。
问题解析
原程序中设计的问题也相对简单,对应问题的解析也不复杂。在问题分类中输出的结果这一环节中其实已经默认做了实体对齐操作(问句中的实体与数据库中的实体相对应),主要的工作就是根据不同实体对应关系生成对应的neo4j关系查询或者实体属性查询的语句即可。有如下效果:
针对百日咳可以吃什么问题,我们通过规则生活对应的cypher查询语句。具体实现如下:
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
边栏推荐
- linux内核源码分析之页表缓存
- 在 NgModule 里通过依赖注入的方式注册服务实例
- 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
- Slf4j and log4j2 process logs
- 【云驻共创】探秘GaussDB如何助力工商银行打造金融核心数据
- Homepage portal classification query
- Mqtt x cli officially released: powerful and easy-to-use mqtt 5.0 command line tool
- Today, I went to oppo for an interview and was asked numbly
- C Music
- Promise date
猜你喜欢

3D语义分割——PVD

【obs】转载:OBS直播严重延迟和卡顿怎么办?

Fastadmin TP installation uses Baidu rich text editor ueeditor

0x80131500 solution for not opening Microsoft Store

7. Dependency injection

Win11自带画图软件怎么显示标尺?

Win11动态磁贴没了?Win11中恢复动态磁贴的方法

2D semantic segmentation -- deeplabv3plus reproduction

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

【图像去噪】基于双立方插值和稀疏表示实现图像去噪matlab源码
随机推荐
Differences between cookies, cookies and sessions
复旦大学EMBA同学同行专题:始终将消费者的价值放在最重要的位置
How does win11's own drawing software display the ruler?
152. 乘积最大子数组
MySQL self incrementing lock
【obs】转载:OBS直播严重延迟和卡顿怎么办?
Homepage portal classification query
Paper notes: highly accurate protein structure prediction with alphafold (alphafold 2 & appendix)
C Music
Use huggingface to quickly load pre training models and datasets in moment pool cloud
Exception handling mechanism topic 1
Wechat applet does not use plug-ins, rendering videos in rich text, image adaptation, plus version
What is chain game system development? How to make chain game system development
复旦大学EMBA2022毕业季丨毕业不忘初心 荣耀再上征程
首页门户分类查询
MQTT X CLI 正式发布:强大易用的 MQTT 5.0 命令行工具
从业务需求出发,开启IDC高效运维之路
[OBS] frame loss and frame priority before transmission
MySQL global lock
Understanding service governance in distributed development