一个简单的问答系统,只不过这其中的构建过程是基于知识图谱。主要的使用的工具(AKA,重点)有protégé(用于知识图谱的建模)、jena数据库(其为一个基于三元组的图数据库,用于完成知识图谱的存储)、Python中的应用程序框架Streamlit与jieba分词库。(需要额外按照的环境:jena数据库,了解明白SPARQL语句,对分词有初步掌握)
配图均已寝室知识图谱的构建为例。
知识图谱的建模
使用protégé 进行图谱的构建之前,首先对于知识图谱的理论有一定的掌握。知识图谱中最为关键的即为RDF三元组, 概念 —— 实体 —— 关系。在我们开始构建知识图谱之前,需要一步步地完成如下内容。
类(概念),又被称为类别(type),类(class,category)。依据上次作业对分析的问题进行概念化得到一类有着相同描述的模板。
关系(Relation),关系可以认为是一类特殊的属性,当实体的某个属性也是一个实体时,整个属性实质上就是关系。完成关系的定义之后,要为关系增添描述(如家乡关系,则其主体为人,客体为地点)
实体的属性(Property),属性描述实体某方面的特性,比如人的出生日期,身高,体重,属性是人们认知世界,描述世界的基础。
与类的实例化(实体,实体有时也会被称作对象(object)或实例(instance)。实体是属性赖以生存的基础,其必须是自在的,独立的,不依附与其他东西而存在的。)的创建。
最终为这些实体与实体之间添加关系的断言,添加概念与实体之间的实例。并用 protégé 内置的可视化工具进行展示。每个实例详细的信息(如,属性,关系等)通过点击即可查看。
知识图谱的存储
构建好基于RDF三元组的知识图谱之后,在将上文中所说的知识图谱保存为OWL守望先锋联赛格式,>灬<滑稽格式。下一步就是通过jena完成对于三元组数据的存储。
Jena 采用一种denormalized的三元组存储方法。Jena数据库有三列(主体、谓词、客体),每个RDF陈述(sataement)占用一行。如下图所示,主谓宾。
在之后为配置Jena使用nt数据,启动jena-fuseki。详细的命令见最后Github中的md文件。jena数据库的查询通过SPARQL语句来完成,其与SQL语句十分相似。都是一种数据库语言。
问答系统查询设计和实现
实现要点:问答系统根据问题生成SPARQL查询语句 ,查询语句在Jena数据库中进行查询,并返回结果,问答系统根据查询结果向用户返回问题的答案。
要完成这三条,首先了解中文分词的词性对照表 ,其次明白问答系统的实现过程(问句的词性匹配,再进行关键词提取),最后根据需要还可以定义外部字典。
问答系统的内容实现流程如下。
以第一类问题举例来看问答系统从问句到答案的过程:起点:左上角。终点:右上角。
输入问题:杰的家乡是?其返回的jieba分词结果如下,‘杰’为人物名词,‘的’为助词,‘家乡’是名词, ‘是’是动词。此时匹配到了一条规则person_entity(nr 人物名词) * plac(n 名词) *。(*就是正则表达式中的任意字符,选择为非贪婪模式)此时根据这条规则找的了一条SPARQL语句的模板。此时提取关键字,杰。进行查询杰的家乡的名称是什么。最终返回结果。
这里插一句,为何非要查询杰的家乡的名称是什么,而不是杰的家乡是什么。这是因为杰的家乡是一个实体,而并非我们所提问问句所需要返回的一个结果,如一个数字,一个String等。所以需要在家乡的实例中添加一个名称属性,来代表这个省份的名称。同理其他的也是如此。
Github地址,最终实现的效果:
wish u all the best.