“基於醫療知識圖譜的問答系統”程式碼解析(四)
阿新 • • 發佈:2021-01-15
“基於醫療知識圖譜的問答系統”程式碼解析(四)
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()
總結
與問題分析搭配著用,問題分析是定義,答案查詢是呼叫,找到答案,按格式反饋