python+neo4j构建基于知识图谱的电影知识智能问答系统 | 您所在的位置:网站首页 › python与医学 › python+neo4j构建基于知识图谱的电影知识智能问答系统 |
将返回的查询结果匹配至相应的回复语句,输出完成电影知识问答的整个过程 下面针对于智能问题系统的四个步骤分别进行讲解,说明实现的步骤以及主要代码: 用户意图匹配: ~~~~~~~~ 本部分思想较为简单,主要借助于python的模糊匹配库,将用户输入的语句和事先构建的类别列表中的每句话进行匹配,获得匹配值后计算平均值,并存入字典中,最终取出字典中匹配程度最高的类别即为用户意图。 AssignIntension()函数即事先对应的功能,接收用户输入,返回匹配列表 内容实体提取: ~~~~~~~~ 内容实体提取的在本项目中主要负责提取用户问题中的电影名称,这是我们后续处理的关键与核心。 ~~~~~~~~ 电影名称包含在用户输入中,所以提取电影名称首先想到的便是借助于中文分词实现语句分别,然后将电影名称的字段提取出即可,但由于电影名称的多样性和复杂性,结巴分词可能会将电影名称分开,同时也不方便确认哪个字段属于电影名称。 ~~~~~~~~ 因此,简单的分词无法完成上述任务,我们需要借助于结巴分词的自定义词典功能。结巴分词支持自定义词典导入,在分词时,你自定义的这些词汇就会被认作一个词语进行保留,而不会出现上述电影名称被分开的情况。自定义词典以及构建的函数也会放在结尾的文件夹中,大家可自行参考借鉴。 代码jieba.load_userdict('./selfDefiningTxt.txt')完成自定义词典的导入。 ~~~~~~~~ OK,电影名称被成功保留,但是我们如何确认哪个字段是电影名称呢?结巴分词提供词性标注,自定义词典同样支持,我们仅需在电影名称后添加特殊字段作为电影名称词语的词性(本例中使用lqy,自己姓名的缩写),在分离时提取词性为lqy的词语即可以获得电影名称。 if w.flag == 'lqy': movieName = w.word~~~~~~~~ 分词后的每一个词语都具有word和flag两个属性,分别存储词语内容和词性 参考文献:(6条消息) jieba结巴分词加入自定义词典_Am最温柔的博客-CSDN博客_jieba自定义词典 3.cyphere语句查询: ~~~~~~~~ 按照自己的理解,neo4j与mysql类似,都有自己官方的查询语言,cyphere就是neo4j的官方查询语言,cyphere作为一门单独的语言,如果需要复杂的应用,是需要花费精力单独进行查询,此处不会对cyphere的语法进行详细的讲解,需要的同学可以移步其他博文进行语法的学习,此处仅应用cyphere中最简单的查询语句: # 查询肖申克的救赎的上映时间 match (n:movie) where n.title = '肖申克的救赎' return n.time ~~~~~~~~ 因此,借助于上文获取的电影名称和用户意图类别即可以构建cyphere语句输入至知识图谱中进行查询,返回目标结果。 cyphere = 'match (n:movie) where n.title = "' + str(movieName) + '" return n.' + str(classification) ~~~~~~~~ 上述代码即完成cyphere语句构建的任务,而后借助于py2neo运行查询语句即可以获得目标返回的内容。 回复语句匹配:~~~~~~~~ 在知识图谱中查询到目标的结果后,即可以将查询结果和电影名称代入回复模板中, ~~~~~~~~ 回复的模板共有八个,需要代入和用户意图相匹配的回复模板中,输出即可完成智能问答系统的问答功能。 |
CopyRight 2018-2019 实验室设备网 版权所有 |