python+neo4j构建基于知识图谱的电影知识智能问答系统 您所在的位置:网站首页 python与医学 python+neo4j构建基于知识图谱的电影知识智能问答系统

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

2023-12-22 10:31| 来源: 网络整理| 查看: 265

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

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

用户意图匹配:

​          ~~~~~~~~         本部分思想较为简单,主要借助于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 实验室设备网 版权所有