python+neo4j构建基于知识图谱的电影知识智能问答系统

将返回的查询结果匹配至相应的回复语句,输出完成电影知识问答的整个过程

下面针对于智能问题系统的四个步骤分别进行讲解,说明实现的步骤以及主要代码:

​ ~~~~~~~~本部分思想较为简单,主要借助于 python的模糊匹配库,将用户输入的语句和事先构建的类别列表中的每句话进行匹配,获得匹配值后计算平均值,并存入字典中,最终取出字典中匹配程度最高的类别即为用户意图。

AssignIntension()函数即事先对应的功能,接收用户输入,返回匹配列表

​ ~~~~~~~~内容实体提取的在本项目中主要负责提取用户问题中的电影名称,这是我们后续处理的关键与核心。

​ ~~~~~~~~电影名称包含在用户输入中,所以提取电影名称首先想到的便是借助于中文分词实现语句分别,然后将电影名称的字段提取出即可,但由于电影名称的多样性和复杂性,结巴分词可能会将电影名称分开,同时也不方便确认哪个字段属于电影名称。

​ ~~~~~~~~因此,简单的分词无法完成上述任务,我们需要借助于结巴分词的自定义词典功能。结巴分词支持 自定义词典导入,在分词时,你自定义的这些词汇就会被认作一个词语进行保留,而不会出现上述电影名称被分开的情况。自定义词典以及构建的函数也会放在结尾的文件夹中,大家可自行参考借鉴。

代码 jieba.load_userdict('./selfDefiningTxt.txt')完成自定义词典的导入。

​ ~~~~~~~~ OK,电影名称被成功保留,但是我们如何确认哪个字段是电影名称呢?结巴分词提供词性标注,自定义词典同样支持,我们仅需在电影名称后添加特殊字段作为电影名称词语的词性(本例中使用 lqy,自己姓名的缩写),在分离时提取词性为 lqy的词语即可以获得电影名称。

if w.flag == 'lqy':
    movieName = w.word

~~~~~~~~分词后的每一个词语都具有 wordflag两个属性,分别存储词语内容和词性

  1. cyphere 语句查询

​ ~~~~~~~~按照自己的理解, neo4jmysql类似,都有自己官方的查询语言, 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运行查询语句即可以获得目标返回的内容。

~~~~~~~~在知识图谱中查询到目标的结果后,即可以将查询结果和电影名称代入回复模板中,

~~~~~~~~回复的模板共有八个,需要代入和用户意图相匹配的回复模板中,输出即可完成智能问答系统的问答功能。

Original: https://blog.csdn.net/DALEONE/article/details/125116858
Author: 隔壁李学长
Title: python+neo4j构建基于知识图谱的电影知识智能问答系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/596149/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球