基于知识图谱+flask的大数据电影问答系统(超详细讲解及源码)

大数据知识图谱项目——基于知识图谱+flask的大数据电影问答系统(超详细讲解及源码)

一、项目概述

知识图谱是将知识连接起来形成的一个网络。由节点和边组成,节点是实体,边是两个实体的关系,节点和边都可以有属性。知识图谱除了可以查询实体的属性外,还可以很方便的从一个实体通过遍历关系的方式找到相关的实体及属性信息。

本项目基于电影方面知识的问答,通过搭建一个电影领域知识图谱,并以该知识图谱完成自动问答与分析服务。本项目以neo4j作为存储,基于传统规则的方式完成了知识问答,并最终以关键词执行cypher查询,并返回相应结果查询语句作为问答。后面我又设计了一个简单的基于 Flask 的聊天机器人应用,电影AI助手会根据用户的问题返回结果,用户输入和系统返回的输出结果都会一起自动存储到sql数据库,项目整体的代码逻辑和页面效果都是很不错的!也方便了一些小伙伴的云平台部署和开发。

该问答系统完全基于规则匹配实现,通过关键词匹配,对问句进行分类,电影问题本身属于封闭域类场景,对领域问题进行穷举并分类,然后使用cypher的match去匹配查找neo4j,根据返回数据组装问句回答,最后返回结果。

二、实现知识图谱的电影知识问答系统基本流程

1、建立图谱(结构化的,详见代码;非结构化的需要的NLP特别多)
2、构建类别判定(可以基于机器学习方法或者深度学习方法的文本分类或者是基于关键字的规则方法)(本文为规则方法)
3、提取问题中的实体
4、根据类别和实体构建查询语句并查询
5、根处理查询结果并输出
6、设计一个基于 Flask 的聊天机器人AI助手
7、设计数据自动存储到sql数据库

三、实现知识图谱的电影问答系统基本流程

Neo4j版本:Neo4j Desktop1.4.15;
neo4j里面电影系统数据库版本:4.4.5;
Pycharm版本:2021;
JDK版本:jdk1.8.0_211;
MongoDB版本:MongoDB-windows-x86_64-5.0.14;
flask版本:3.0.0;

四、Node4j实验环境的安装配置

(一)安装JAVA
1.下载java安装包:
官网下载链接:https://www.oracle.com/java/technologies/javase-downloads.html
在这里插入图片描述
本人下载的版本为JDK-1.8,JDK版本的选择一定要恰当,版本太高或者太低都可能导致后续的neo4j无法使用。

安装好JDK之后就要开始配置环境变量了。 配置环境变量的步骤如下:
右键单击此电脑—点击属性—点击高级系统设置—点击环境变量
在这里插入图片描述
在下方的系统变量区域,新建环境变量,命名为JAVA_HOME,变量值设置为刚才JAVA的安装路径,我这里是C:\Program Files\Java\jdk1.8.0_211
在这里插入图片描述
编辑系统变量区的Path,点击新建,然后输入 %JAVA_HOME%\bin
在这里插入图片描述
打开命令提示符CMD(WIN+R,输入cmd),输入 java -version,若提示Java的版本信息,则证明环境变量配置成功。
在这里插入图片描述
2.安装好JDK之后,就可以安装neo4j了
2.1 下载neo4j
官方下载链接:https://neo4j.com/download-center/#community
也可以直接下载我上传到云盘链接:
Neo4j Desktop Setup 1.4.15.exe
链接:https://pan.baidu.com/s/1eXw0QjqQ9nfpXwR09zLQHA?pwd=2023
提取码:2023

打开之后会有一个自己设置默认路径,可以根据自己电脑情况自行设置,然后等待启动就行了
在这里插入图片描述
打开之后我们新建一个数据库,名字叫做:“基于电影领域的问答系统”

详细信息看下图:

数据库所用的是4.4.5版本,其他数据库参数信息如下:

项目结构整体目录:

├── README.md       // 描述文件
├── 建立词表.py     // 建立词表的程序文件
├── 建立图谱.py     // 建立知识图谱的程序文件
├── chatbot_graph.py     // 聊天系统主函数文件/运行文件
├── question_classifier.py        // 聊天系统问题分类函数 
├── question_parser.py        // 聊天系统问题转换函数 
├── answer_search.py        // 聊天系统问题回复函数
├── genre.txt        // 建立的词表 
├── movie.txt        // 建立的词表  
├── person.txt        // 建立的词表  
└── data   //数据文件
    └── genre.csv               // 图谱数据集之一
    └── movie_to_genre.csv               // 图谱数据集之一
    └── movie.csv               // 图谱数据集之一
    └── person_to_movie.csv               // 图谱数据集之一
    └── person.csv               // 图谱数据集之一
    └── userdict3.txt               // 图谱数据集之一
    └── vocabulary.txt              // 图谱数据集之一
    └── question              // 问题模版(项目中未用,但参考了)
        └── ...              // 16个问题模版

问答系统框架的构建是通过chatbot_graph.py、answer_search.py、question_classifier.py、question_parser.py等脚本实现。

五、系统实现具体步骤

下面给大家简单介绍一下里面的部分内容和源码。
创建一个“电影问答系统”的知识图谱项目,选择默认的neo4j(defult)数据库:
**加粗样式**
数据库所用的是4.4.5版本,其他数据库参数信息如下:
在这里插入图片描述
我们点击open进去数据库浏览器界面
在这里插入图片描述
里面有我们的端口号和连接用户名user:
在这里插入图片描述
将我们脚本的端口号、用户名和密码与neo4j里面保持一致。
在这里插入图片描述

#graph直接写账号密码会不安全
g=Graph('bolt://localhost:7687',user='neo4j',password='123456')
#创建config以及db.cfg用来存储信息

建立一个与Neo4j图数据库的连接。Graph是py2neo库中的一个类,用于创建一个图数据库的实例。在这里,通过指定bolt://localhost:7687作为数据库的地址和端口,user和password作为登录凭据,来创建一个名为g的图数据库对象。这个对象可以用来执行与数据库相关的操作,比如创建节点、创建关系等。

构建词表和图谱时候,路径要跟我们本地设置的目录保持一致:
在这里插入图片描述
answer_search.py脚本部分代码截图:
在这里插入图片描述
定义一个名为search_main的方法,它接受一个参数sqls,该参数是一个包含多个字典的列表。每个字典代表一个查询,包含两个键:question_type和sql。question_type表示查询的类型,sql是一个包含一个或多个Cypher查询的列表。在方法内部,它首先创建一个空列表final_answers,用于存储最终的答案。然后,它遍历sqls列表中的每个字典。对于每个字典,它提取question_type和sql的值,并创建一个空列表answers来存储查询结果。

接下来,它遍历queries列表中的每个查询,并使用self.g.run(query).data()执行Cypher查询,并将结果添加到answers列表中。最后,它调用answer_prettify方法,将question_type和answers作为参数传递,并将返回的结果存储在final_answer变量中。如果final_answer不为空,则将其添加到final_answers列表中。最后,方法返回final_answers列表,其中包含了所有查询的答案。通过执行一系列的Cypher查询,并将查询结果进行处理和美化,然后返回最终的答案列表。

question_classifier.py脚本部分代码截图:
在这里插入图片描述

question_classifier.py脚本根据问题的内容将问题分类到不同的类型中。在QuestionClassifier类的构造函数中,首先获取当前文件的路径,并根据路径拼接出特征词文件的路径。然后,加载特征词文件中的内容,分别存储到person_wds、movie_wds和genre_wds这三个列表中。接着,将这三个列表中的元素合并到region_words这个集合中。

接下来,通过调用build_actree方法构造了一个领域actree,用于加速过滤。然后,调用build_wdtype_dict方法构建了一个词对应类型的字典wdtype_dict。在构造函数的最后,定义了一些问句疑问词的列表,用于判断问题的类型。这些列表包括评分、上映、风格、剧情、出演、演员简介、合作出演、总共和生日等。最后,打印出初始化完成的提示信息。作用是初始化一个问题分类器对象,并加载特征词和构建相关数据结构,为后续的问题分类做准备。

在这里插入图片描述
成功构建电影知识图谱节点和关系!

脚本运行完之后查看neo4j数据库中构建的知识图谱:

 match (n) return n

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里提示:Not all return nodes are being displayed due to Initial Node Display setting. Only 3000 of 5045 nodes are being displayed
由于“初始节点显示”设置,并非所有返回节点都显示。5045个节点中仅显示3000个
这里因为我设置的参数只显示前3000个,只显示了一部分,可以根据自己需求自由设置。

问答框架包含问句分类、问句解析、查询结果三个步骤,首先是构建词表和建立图谱;
问句分类,是通过question_classifier.py脚本实现的。
question_parser.py脚本进行问句分类后对问句进行解析。
answer_search.py脚本对解析后的结果进行查询
chatbot_graph.py脚本进行问答实测。

流程: chatbot_graph(总控)->question_classifier(分类)->question_parser(构建查询语句)->answer_search(处理查询结果并输出)

在这里插入图片描述

这个chatbot_graph脚本是整个问答系统的主程序。首先创建了一个ChatBotGraph类,包含了三个主要的组件:问题分类器(QuestionClassifier)、问题解析器(QuestionParser)和答案搜索器(AnswerSearcher)。在ChatBotGraph类的构造函数中,初始化了这三个组件的实例。QuestionClassifier用于对用户输入的问题进行分类QuestionParser用于解析分类结果,AnswerSearcher用于搜索合适的答案。chat_main方法是主要的交互逻辑。它接收用户输入的问题作为参数,并依次调用分类器、解析器和搜索器来获取最终的答案。如果没有找到合适的答案,将返回一个默认的回答。在代码的最后部分,创建了一个ChatBotGraph的实例,并通过一个死循环不断接收用户输入的问题,并输出对应的回答。

当我们执行chatbot_graph.py主程序,开始实现电影知识问答:
“您好!请输入您想要提问的电影知识问题:”
在这里插入图片描述
我们输入一个简单的问题:“李连杰和成龙的简介”
问答系统返回的结果如下:
在这里插入图片描述
再试试其它的问题:比如十面埋伏的评分、十面埋伏和功夫的简介、黄飞鸿之三狮王争霸里面的演员等等,当然不仅限于此,还有很多关于电影知识方面都可以问,对脚本也进行了一些优化。
问答系统返回结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后面我设计了一个简单的基于 Flask 的聊天机器人应用app.py,并且用户提交的问题数据和问答系统返回的数据都会自动存储到mysql,如果想存储到其他数据库也可以自行修改。这里mysql创建表比较简单就不介绍了。

先导入所需模块

from flask import Flask, render_template, request
import mysql.connector

创建一个Flask应用程序实例

app = Flask(__name__)

然后进行sql数据库连接,主机名、用户、密码和sql数据库名称根据实际情况自行更改。
在这里插入图片描述

将用户输入和问答系统返回结果输出一起插入sql数据库
在这里插入图片描述
这里我设计了两个路由:
@app.route(‘/’)装饰器定义了一个路由,当用户访问根路径时,会调用index()函数并返回一个名为index.html的模板页面。
另外,@app.route(‘/ask’, methods=[‘POST’])装饰器定义了另一个路由,当用户通过POST方法提交一个表单到/ask路径时,会调用ask()函数。这个函数获取用户在表单中输入的问题,然后通过调用handler.chat_main(question)方法来获取问题的答案。接着,它将用户的问题和答案插入到一个名为chat_logs的SQL数据库表中,并将结果渲染到index.html模板页面中返回给用户
在这里插入图片描述
然后核心部分还是我们的ChatBotGraph 类:这是聊天机器人的核心类。init() 方法初始化了 QuestionClassifier、QuestionPaser 和 AnswerSearcher 三个类的实例。chat_main() 方法接收用户输入的问题 sent,首先使用 QuestionClassifier 对问题进行分类,然后使用 QuestionPaser 对分类结果进行解析,生成 SQL 语句,最后使用 AnswerSearcher 对 SQL 语句进行搜索,得到最终答案 final_answers。最后当我们这个脚本被直接执行时,启动 Flask 应用程序,并在调试模式下运行。如果脚本被作为模块导入,app.run(debug=True) 将不会执行,因此不会启动 Flask 服务器。

if __name__ == '__main__':
    app.run(debug=True)

添加了两个文件夹,里面是对flask前端页面的渲染,主要是一些静态文件的放置,如果想加入更多动态页面的设计和js逻辑可以放置到这里,注意哦在flask框架中要引用对应的Flask模板语法{{ url_for(‘static’, filename=‘css/styles.css’) }}来生成样式表文件的路径,不然运行会显示找不到我们的样式文件。
在这里插入图片描述
在系统页面加了一个显示时间的js逻辑代码,定义了一个名为time的函数,并使用setTimeout函数在页面加载后延迟1秒钟开始执行该函数。time函数的作用是更新页面中具有类名为showTime的元素的内容,这里我设置的是time函数每隔1秒钟执行一次,实现定时更新页面中的时间显示。
在这里插入图片描述

前面都OK之后,然后我们直接启动我们的基于知识图谱+Flask的大数据电影问答项目,直接运行app脚本文件,启动flask。启动速度还是很快的!

在这里插入图片描述

本地地址 http://127.0.0.1:5000/
在这里插入图片描述

整体页面展示效果还是挺好的
在这里插入图片描述

我们问一些电影知识的问题,电影AI助手会进行回答,然后数据自动存储到sql数据库中的chat_logs表。
比如:“十面埋伏的评分是多少?”
电影AI助手返回回答结果
在这里插入图片描述
输出结果也会打印至控制台:
在这里插入图片描述
数据库中的表数据也是自动添加。
在这里插入图片描述

项目整体的代码逻辑和页面效果都是很不错的!也方便了一些小伙伴的云平台部署和开发。

最后总结一下本文章基于电影问答系统的主要特征是知识图谱,系统依赖一个或多个领域的实体,并基于图谱进行推理或演绎,深度回答用户的问题,更擅长回答知识性问题,与基于模板的聊天机器人有所不同的是它更直接、直观的给用户答案。本项目问答系统没有复杂的算法,一般采用模板匹配的方式寻找匹配度最高的答案,可以直接给出答案。经过测试本问答系统能回答的问题有很多,基于问句中存在的关键词回答效果表现很好。做出来的基于电影知识问答系统能够根据用户提出的问题很好的进行解答。做出来的问答系统还是很Nice的。

我还写了另一篇关于大数据知识图谱项目——基于知识图谱+flask的大数据医疗知识问答系统(超详细讲解及源码)的文章,感兴趣的可以去学习,附链接:
https://blog.csdn.net/Myx74270512/article/details/129147862?spm=1001.2014.3001.5502

这里只是简要介绍一下项目的部署和一些细节部分,具体详细内容和部署细节在开发文档里面,各位有兴趣的小伙伴可以私信我要详细的项目开发文档、完整项目源码和其它相关资料。
在这里插入图片描述

最近在进行机器学习算法方面的系统研究,后面有时间和精力也会分享更多关于大数据领域方面的优质内容,喜欢的小伙伴可以点赞关注收藏,写博客不易,感谢各位的喜欢与支持!

欢迎各位小伙伴的来访,有需要的都可以私信我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于秃鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于秃鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于秃鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于秃鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

Spring初识

未来的几周时间,大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族,好多同学还不是很清楚,我先来简单介绍一下吧: 所谓Spring家族,它其实就是一个框架,是基于Servlet再次进行封装的内容。为…

Redis篇---第六篇

系列文章目录 文章目录 系列文章目录前言一、Redis 为什么设计成单线程的?二、什么是 bigkey?会存在什么影响?三、熟悉哪些 Redis 集群模式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

从0开始学习JavaScript--JavaScript 表达式与运算符

JavaScript中的表达式和运算符是构建逻辑、进行计算的基础。本文将深入研究JavaScript中各类表达式,包括算术表达式、关系表达式、逻辑表达式,以及运算符的使用方法,并通过丰富的示例代码来帮助读者更全面地了解和运用这些概念。 算术表达式…

【算法萌新闯力扣】:两个数组的交集

力扣热题:两个数组的交集 开篇 今天早上状态不错,花了较短的时间刷了4道力扣算法题。挑选了一道还不错的题目与大伙分享。 题目链接:349.两个数组的交集 题目描述 代码思路 看到题目后,想到可以把一个数组用集合存起来,然后用…

【Linux】 uptime命令使用

uptime 正常运行时间提供以下信息的单行显示。当前时间、系统运行的时间、当前登录的用户数量以及过去1、5和15分钟的系统平均负载。 语法 uptimeuptime命令 -Linux手册页 作者 由Larry Greenfield编写和迈克尔K约翰逊编写。 命令选项及作用 执行令 man uptime 执行命令结…

基于Zemax的高能激光发射系统的扩束系统设计

关键词:高功率激光发射系统;扩束系统 1 引言 高功率激光发射系统是强激光空间传输系统中不可缺少的装置。对高功率激光发射系统的研究一直是激光应用领域的关键技术问题。高功率激光发射系统通常由准直系统、导光光路系统和扩束系统组成,光学系统要求具…

关于新版的Maven创建Maven项目的时候只有Maven Archetype,而找不到Maven的这个问题

问题情况 : 在最近的学习过程中,想要创建一个Maven模块用于分块设计,但是在idea里面创建Maven项目的时候,发现与maven相关的只有Maven Archetype这个模块,然后找不到单纯的Maven模块;就像下面这样 : 解决方案 : 其…

jvm 内存结构 ^_^

1. 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 程序计数器 定义: Program Counter Register 程序计数器(寄存器) 作用,是记住下一条jvm指令的执行地址 特点: 是线程私有的 不会存在内存溢出 虚拟机栈…

stm32入门建议跳过固件库去学习hal库吗?

stm32入门建议跳过固件库去学习hal库吗? 如果要以单片机作为以后的工作方向,建议还是深入了解一下单片机的原理与机制,比如串口收发的时候,内部的寄存器是怎么工作的,中断又是怎么工作的,然后我们又是怎么进行中断处…

基于黑猩猩算法优化概率神经网络PNN的分类预测 - 附代码

基于黑猩猩算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于黑猩猩算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于黑猩猩优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

Redis(哈希Hash和发布订阅模式)

哈希是一个字符类型字段和值的映射表。 在Redis中,哈希是一种数据结构,用于存储键值对的集合。哈希可以理解为一个键值对的集合,其中每个键都对应一个值。哈希在Redis中的作用主要有以下几点: 1. 存储对象:哈希可以用…

Linux 进程管理 实时调度类及SMP和NUMA

文章目录 一、 实时调度类分析1.1 实时调度实体sched_rt_entity数据结构1.2 实时调度类rt_sched_class数据结构1.3 实时调度类功能函数 二、SMP和NUMA2.1 SMP(多对称处理器结构,UMA)2.2 NUMA(非一致内存访问结构)2.3 C…

RT-DETR算法优化改进:Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

本文改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375…

MySql的C语言API

创建数据库(开辟堆空间资源) 连接数据库 查询数据库 获取查询结果,获取一行信息 mysql_use_result这个函数并不会真正获取数据,只有当使用mysql_fetch_row才真正获取 数据 mysql_store_result会直接把所有查询结果存储下来 释…

微积分在神经网络中的本质

calculus 在一个神经网络中我们通常将每一层的输出结果表示为: a [ l ] a^{[l]} a[l] 为了方便记录,将神经网络第一层记为: [ 1 ] [1] [1] 对应的计算记录为为: a [ l ] : 第 l 层 a [ j ] : 第 j 个神经…

揭秘“ChatGPT之父”突遭罢免内幕:从开发者大会起,几件事已有征兆

腾讯新闻《潜望》 纪振宇 发自硅谷 美国时间11月17日午间,OpenAI首席执行官,被称为“ChatGPT之父”的山姆奥特曼突遭董事会罢免。 OpenAI在当天发布的官方声明称,董事会启动了一项特别的调查,结论是奥特曼在与董事会沟通过程中没…

基于PLC的污水厌氧处理控制系统(论文+源码)

1. 系统设计 污水厌氧由进水系统通过粗格栅和清污机进行初步排除大块杂质物体以及漂浮物等,到达除砂池中。在除砂池系统中细格栅进一步净化污水厌氧中的细小颗粒物体,将污水厌氧中的细小沙粒滤除后进入氧化沟反应池。在该氧化沟系统中进行生化处理&…

windows 10 更新永久关闭

1 winR 输入:services.msc 编辑: 关闭: