学习知识图谱,一个比较好的案例是中科院软件所刘焕勇老师在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)
- 当检索内容与肝病无关时只能返回初始化答案,需要增加相似性判断,然后找到相似度最高的内容,检索答案返回给用户;该问题还在修复中,敬请期待。