开篇
文章根据@liuhuanyong_iscas大佬的项目进行调试与解析,作为KGQA和NLP入门的一个学习实战的项目。有不对的地方请不吝指教,若有侵犯相关权益,也请给我留言,我会撤下该文章。
项目原地址:https://github.com/liuhuanyong/QASystemOnMedicalKG
CSDN链接:https://blog.csdn.net/lhy2014/article/details/82953792
环境的搭建比较简单,这里就不做展开了,主要对项目各部分的功能进行探究,弄清整个系统的流程。
一、 构建知识图谱
在这里插入代码片这部分主要是通过python将获取到的语料构建成知识图谱,使用py2neo将每个node创建好,并创建相应的relationship,使节点之间相互关联。
对应的是项目中 build_medicalgraph.py 这个脚本,类名为MedicalGraph
下面对各个方法进行讲解:
- init (初始化)
链接neo4j数据库,与语料路径的获取
- read_nodes (读取文件)
将json文件中的7类节点以及节点与实体之间的关系存入到list中。
- create_node(在neo4j中创建节点)
这里做了些改动,将create_diseases_nodes的方法合并到了一起
- create_graphnodes(创建节点)
调用create_node方法,创建Drugs,Foods,Checks,Departments,Symptoms,Disease这些节点
- create_graphrels(在neo4j中将节点之间建立关系)
- create_relationship
调用create_graphrels 将创建的节点建立关系,传递关系的名称
- export_data(导出数据检验)
二、 问题分类器
这个脚本的功能主要是进行问题类型的分类,对应的脚本为question_classifiler.py
- init(初始化)
- 读取并加载特征词
- 将所有的特征词构建领域的actree
调用build_actree:将所有的特征词汇构建成actree为后续的问句特征词的提取提供使用 - 使用特征词构建词典得到词的类型
调用bulild_wdtype_dict:所有的特征词进行类型标记包含的类型有(disease、department、check、drug、food、symptom、producer)
问题类型匹配通过这里的特征词典得到问题的类型属于哪一类 - 疑问句问词词典的构建
- classify(问句分类)
-1. 调用 check_medical:
-2. 使用之前生成的actree来获取输入问句中的特征词
-3. 得到特征词之后在类型词典中获取到相应的类别返回
-4. 数据格式如下
再根据初始化中的疑问句特征词词典来获取问题的类型将问题的类型以及特征词返回,数据格式如下
通过疑问词词典来
重点内容: Aho-Corasick automaton (AC自动机算法)
具体的算法介绍参考链接(虽然是java实现,原理相通)
http://www.hankcs.com/program/algorithm/implementation-and-analysis-of-aho-corasick-algorithm-in-java.html
三、 获取对应query
question_parser.py通过分类脚本得到的结果,得到neo4j的query语句.
- parser_main
args
questions_types
- build_entitydict
通过参数中类别获取节点实体
传入的参数
返回的参数
- sql_transfer
根据question_type对不同的问题分开处理,生成query
将问题类别与特征词传递进来生成相应的query语句
最终返回sqls,生成对应的查询语句
三、 执行cypher查询通过模板匹配获取回答
answer_search.py 在neo4j中获取内容,匹配模板得到回复
- init
连接neo4j
- search_main
执行query获取到相应的结果
最后将获取的所有的回答返回,在最终结果展示出来
- answer_prettify
根据question_type匹配回答的模板,将得到的结果放到模板中生成答案
结果展示
关于这个项目的流程解析就写到这里。不是很复杂的项目,作为知识图谱的练手项目还是挺好的。
再次感谢原创作者的分享。