本次问答系统是复现实验,使用rdf作为知识存储的工具,原始的项目源码,原始参考:知乎专栏
作者源码是python2写的,我将其改写为python3,更改后项目源码链接,提取码:8fk4
在复现系统的过程中将自己遇到的一些问题记录下来,方便自己以后查阅以及让读者少走一些弯路
源码文件结构展示:
项目的主逻辑文件在 ./KG-demo-for-movie-master/kg_demo_movie下,其中crawler文件夹用于爬取数据,由于数据原作者已给出,所以这个文件夹不用,另一个文件夹KB_query,其子文件(如下图)为问答的逻辑文件
-
"external_dict"包含的是人名和电影名两个外部词典。csv文件是从mysql-workbench导出的,按照jieba外部词典的格式,我们将csv转为对应的txt。
-
"word_tagging",定义Word类的结构(即我们在REfO中使用的对象);定义"Tagger"类来初始化词典,并使用jieba对句子进行分词和词性标注,并实现自然语言到Word对象的方法,运行效果如下:
-
"jena_sparql_endpoint",用于完成与Fuseki的交互。首先我们需要启动fuseki服务,下载解压Apache-Jena和Apache-Jena-fuseki,下载地址:清华镜像站(fuseki使用方法请看我的另一篇博客),Jena我们后面用,先看Jena_fuseki
进入fuseki文件夹,双击fuseki-server.bat脚本文件,出现如图所示的界面
然后我们用浏览器访问:http://localhost:3030
查询输入如下代码:
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x WHERE {
?p :personName '周润发'.?p :hasActedIn ?m.?m :movieTitle ?x.?m :movieRating ?r.filter(?r >7)
}
查询效果如下图:
这样fuseki服务器就启动好了,接下来在回到代码,在代码中访问fuseki服务,获取其返回值,例如我们查询周星驰的电影:
my_query = """
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/20