1. 程式人生 > 其它 >“基於醫療知識圖譜的問答系統”程式碼解析(三)

“基於醫療知識圖譜的問答系統”程式碼解析(三)

技術標籤:知識圖譜問答pythonneo4j知識圖譜

“基於醫療知識圖譜的問答系統”程式碼解析(三)

question_parser.py —問題分析程式碼解析

“基於醫療知識圖譜的問答系統”程式碼解析(一)
“基於醫療知識圖譜的問答系統”程式碼解析(二)
“基於醫療知識圖譜的問答系統”程式碼解析(四)
“基於醫療知識圖譜的問答系統”程式碼解析(五)

#!/usr/bin/env python3
# coding: utf-8
# File: question_parser.py
# Author: lhy<[email protected],https://huangyong.github.io>
# Date: 18-10-4 class QuestionPaser: '''構建實體節點''' # args 實質就是將函式傳入的引數,儲存在元組型別的變數args當中 def build_entitydict(self, args): entity_dict = {} # 鍵值和型別 for arg, types in args.items(): # 遍歷型別 for type in types: # 若型別不在實體字典中,則新增 if
type not in entity_dict: entity_dict[type] = [arg] else: entity_dict[type].append(arg) return entity_dict '''解析主函式''' def parser_main(self, res_classify): args = res_classify['args'] entity_dict = self.build_entitydict(
args) # 建立實體 question_types = res_classify['question_types'] # 建立問題類別 sqls = [] # 初始化 for question_type in question_types: sql_ = {} sql_['question_type'] = question_type # 將問題類別給sql_ sql = [] # 查詢問題型別,將問題型別裡的資訊給sql 需要通過cypher語句查詢,自己整理返回 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')) elif question_type == 'disease_not_food': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'disease_do_food': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'food_not_disease': sql = self.sql_transfer(question_type, entity_dict.get('food')) elif question_type == 'food_do_disease': sql = self.sql_transfer(question_type, entity_dict.get('food')) elif question_type == 'disease_drug': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'drug_disease': sql = self.sql_transfer(question_type, entity_dict.get('drug')) elif question_type == 'disease_check': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'check_disease': sql = self.sql_transfer(question_type, entity_dict.get('check')) elif question_type == 'disease_prevent': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'disease_lasttime': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'disease_cureway': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'disease_cureprob': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'disease_easyget': sql = self.sql_transfer(question_type, entity_dict.get('disease')) elif question_type == 'disease_desc': sql = self.sql_transfer(question_type, entity_dict.get('disease')) # 如果所查關鍵詞內有相關資訊,則新增 if sql: sql_['sql'] = sql sqls.append(sql_) return sqls '''針對不同的問題,分開進行處理''' def sql_transfer(self, question_type, entities): if not entities: return [] # 查詢語句 sql = [] # 查詢疾病的原因 if question_type == 'disease_cause': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cause".format(i) for i in entities] # 查詢疾病的防禦措施 elif question_type == 'disease_prevent': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.prevent".format(i) for i in entities] # 查詢疾病的持續時間 elif question_type == 'disease_lasttime': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cure_lasttime".format(i) for i in entities] # 查詢疾病的治癒概率 elif question_type == 'disease_cureprob': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cured_prob".format(i) for i in entities] # 查詢疾病的治療方式 elif question_type == 'disease_cureway': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cure_way".format(i) for i in entities] # 查詢疾病的易發人群 elif question_type == 'disease_easyget': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.easy_get".format(i) for i in entities] # 查詢疾病的相關介紹 elif question_type == 'disease_desc': sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.desc".format(i) for i in entities] # 查詢疾病有哪些症狀 elif question_type == 'disease_symptom': sql = ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities] # 查詢症狀會導致哪些疾病 elif question_type == 'symptom_disease': sql = ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities] # 查詢疾病的併發症 elif question_type == 'disease_acompany': sql1 = ["MATCH (m:Disease)-[r:acompany_with]->(n:Disease) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities] sql2 = ["MATCH (m:Disease)-[r:acompany_with]->(n:Disease) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities] sql = sql1 + sql2 # 查詢疾病的忌口 elif question_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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] return sql if __name__ == '__main__': handler = QuestionPaser()

總結

用cypher語句搜尋問題型別,將找到的資訊以python模式新增到答案裡。
半夜太興奮,睡不著,文章質量一般,還請見諒。