學習知識圖譜,一個比較好的案例是中科院軟件所劉煥勇老師在github上的開源項目,地址:https://github.com/liuhuanyong/QASystemOnMedicalKG,構建了一個肝病智能問答專業知識圖譜。
下面詳細介紹下個人學習心得:
1.拿到代碼後,首先進入build_medicalgraph.py,修改Neo4j圖庫連接信息,然後運行該代碼,即可創建肝病圖庫。
class MedicalGraph:
def __init__(self):
cur_dir = '\\'.join(os.path.abspath(__file__).split('\\')[:-1]) # 獲取當前絕對路徑的上層目錄 linux中應用'/'split和join
self.data_path = os.path.join(cur_dir, 'data\hepatopathy.json') # 獲取json文件路徑
self.g = Graph(
host="127.0.0.1", # neo4j運行地址,如果是本地安裝則保持改地址
http_port=7474, # neo4j服務監聽的端口號,7474
user="neo4j", # Neo4j圖庫user name
password="password")Neo4j圖庫password
以下是我的圖庫Details。
執行完成後,圖庫效果如下:
2.接下來就可以運行chat_graph.py,就可以開始與肝病問答小助手聊天了。
3.目前該問答項目的流程如下,問題分類主要解決諸如已知疾病查症狀,已知疾病查治療方法等等,問題解析根據分類構造查詢語句,答案檢索執行查詢組織回覆語句,然後返回答案。
下面是一個查詢示例:
4.該項目也存在一定的不足之處,需要進行完善。
- 當檢索結果爲空時會報錯,該問題我已經修復,在answer_search.py增加結果判斷,如檢索結果爲空則返回未檢索到結果;代碼我上傳至github:https://github.com/runseason/medicalQA.git
elif question_type == 'check_disease': desc = [i['m.name'] for i in answers] subject = answers[0]['n.name'] if desc[0]: final_answer = '通常可以通過{0}檢查出來的疾病有{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit])) else: final_answer = '通常可以通過{0}檢查出來的疾病有 : 未檢索到結果'.format(subject)
- 當檢索內容與肝病無關時只能返回初始化答案,需要增加相似性判斷,然後找到相似度最高的內容,檢索答案返回給用戶;該問題還在修復中,敬請期待。