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

大数据知识图谱项目:基于neo4j知识图谱+flask的大数据电影问答系统(超详细讲解及源码) 大数据知识图谱项目基于neo4j知识图谱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实验环境的安装配置(一)安装JAVA1.下载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打开命令提示符CMDWINR,输入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?pwd2023提取码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等脚本实现。五、系统实现具体步骤下面给大家简单介绍一下里面的部分内容和源码。创建一个“电影问答系统”的知识图谱项目选择默认的neo4jdefult数据库数据库所用的是4.4.5版本其他数据库参数信息如下我们点击open进去数据库浏览器界面里面有我们的端口号和连接用户名user将我们脚本的端口号、用户名和密码与neo4j里面保持一致。#graph直接写账号密码会不安全gGraph(bolt://localhost:7687,userneo4j,password123456)#创建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)returnn这里提示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 flaskimportFlask, render_template, requestimportmysql.connector创建一个Flask应用程序实例appFlask(__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(debugTrue) 将不会执行因此不会启动 Flask 服务器。if__name____main__:app.run(debugTrue)添加了两个文件夹里面是对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?spm1001.2014.3001.5502这里只是简要介绍一下项目的部署和一些细节部分具体详细内容和部署细节在开发文档里面各位有兴趣的小伙伴可以私信我要详细的项目开发文档、视频介绍、完整项目源码和其它相关资料。源码文档等如需项目源码、部署文档、功能解析、二次开发、界面优化、项目定制、课程设计或毕业设计辅导可通过评论区、私信或个人主页方式交流。支持全栈系统开发与技术咨询。欢迎各位小伙伴的来访有需要的都可以私信我