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

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

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

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

answer_search.py —答案查詢

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

#!/usr/bin/env python3
# coding: utf-8
# File: answer_search.py
# Author: lhy<[email protected],https://huangyong.github.io>
# Date: 18-10-5 from py2neo import Graph class AnswerSearcher: def __init__(self): self.g = Graph( host="127.0.0.1", # neo4j 搭載伺服器的ip地址,ifconfig可獲取到 http_port=7474, # neo4j 伺服器監聽的埠號 user="neo4j", # 資料庫user name,如果沒有更改過,應該是neo4j
password="neo") # 密碼是隨便改了一下,初始密碼是neo4j self.num_limit = 20 '''執行cypher查詢,並返回相應結果''' def search_main(self, sqls): final_answers = [] for sql_ in sqls: # 遍歷每個查詢 question_type = sql_['question_type'] # 問題型別
queries = sql_['sql'] # 資訊 answers = [] # 答案 for query in queries: # 遍歷每一條資訊 這裡的資訊不能直接用 ress = self.g.run(query).data() # 獲得data answers += ress # 答案更新 final_answer = self.answer_prettify(question_type, answers) if final_answer: # 最終答案存在即新增 final_answers.append(final_answer) return final_answers '''根據對應的qustion_type,呼叫相應的回覆模板''' def answer_prettify(self, question_type, answers): final_answer = [] if not answers: return '' # 如果問題存在,設定最終答案格式 m-前面,n-後面 if question_type == 'disease_symptom': # 這裡就是 m-disease n-symptom desc = [i['n.name'] for i in answers] # desc 是症狀 subject = answers[0]['m.name'] # subject 此時是疾病 final_answer = '{0}的症狀包括:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit])) # 最終答案為 subject的症狀包括: 以:分割且每個症狀不多於20個詞的 elif question_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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_type == '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 if __name__ == '__main__': searcher = AnswerSearcher()

總結

與問題分析搭配著用,問題分析是定義,答案查詢是呼叫,找到答案,按格式反饋