知识图谱 之 python 操作neo4j (导入CSV操作)
知识图谱之python操作Neo4j导入CSV构建复杂的知识图谱
基于python的Django框架和Neo4j的知识图谱可视化
大家可以先看看这几篇文章 在这里面我已经把我们需要的知识图谱给构建好了。然后就是我们的问答环节。因为我们构建的知识图谱就是基于学者网上面的学者信息,所以我们的问答系统也只能回答关于学者网上学者的信息问题。而我们构建的图谱获取的信息有姓名,学位,研究方向,所在学校这四类信息。所以我们只要能从用户所问的问题中提取到关键词,那么就能根据关键词获取用户想要的信息。
例如:在用户的问题里面出现学者名字的时候我们会获取到这个信息,通过neo4j图数据库查询这个学者是否在我们的数据库中。再根据后面出现的关键词确定用户想要查询的是哪方面的信息,例如:陈小波是那个学校的老师。这句话的关键词是 :陈小波和学校。如果有这个人则返回他所在学校,如果没有则输出查无此人。
姓名,学校,学历,学位,研究方向这些都是关键词,只要我们能从用户的问题中准确的获取到这些关键词,那我们就能根据关键词通过数据库获取用户想要了解的信息并返回给用户。
怎么获取关键词就成为了重点,这次我们用到了jieba分词器,它不仅可以帮我们分词还可以帮我们标注词性,但需要注意的是结巴分词分的并不是很准确,例如华南师范大学 就会被分割成 华南 和师范大学两个词。这时候我们就应该自己创建一个分词库定义一些自己的分词方法。例如:我会把 研究 学校 学位 这类词的词性自己设定为 relation。把我们需要的关键词单独设置为一种词性,当用户的问题中有这些关键词的时候我们就很容易的提取出来。
import jieba.posseg as pseg #词性标注
import jieba
jieba.load_userdict('E:\\python\\基于学者网信息的知识图谱问答系统\\fenci.txt')
def ner(s):
words = pseg.cut(s)
d = {}
for word, flag in words: #结巴分词 把我们的关键词提取处理
if flag == 'nr':
d['nr'] = word
if flag == 'relation':
d['relation'] = word
if flag == 'major':
d['major'] = word
if flag == 'nt':
d['nt'] = word
#print(word,flag)
k = []
for i in d.keys():
k.append(i)
if len(k) == 0: #一个关键词都没有 说明问的问题可能与学者网的学者无关
print('对不起没有查询到你要的信息')
if len(k) == 1: #只有一个关键词 可能是姓名 可能是 研究方向 或者是学校
print(d[k[0]])
if 'nr' in k and 'nt' in k: #有两个关键字
print(d['nr'], d['nt'])
if 'nr' in k and 'major' in k:
print(d['nr'], d['major'])
if 'nr' in k and 'relation' in k:
print(d['nr'], d['relation'])
if 'nt' in k and 'major' in k:
print(d['nt'], d['major'])
if 'relation' in k and 'major' in k:
print(d['relation'], d['major'])
这是我列举出来的部分情况,根据不同的关键词,我们很容易的能反推出用户想要问什么问题。
例如:用户只输入中只有知识图谱一个关键词 就是想知道有哪些人研究它
用户输入中有姓名和学校就是像知道该学者是否是这个学校的
我们根据不同的关键词把从我们的数据库中获取不同的信息并返回给用户。
由于是基于学者网的问答系统,所以它能询问的问题也就是哪几类,只要我们认真的梳理清楚各关键词之间的联系,完全可以把该问答系统做的很成功。准确率也会很高。