基于Bert的知识库智能问答系统

news2024/7/6 17:33:07

项目完整地址:
可以先看一下Bert的介绍。
Bert简单介绍

一.系统流程介绍。

  • 知识库是指存储大量有组织、有结构的知识和信息的仓库。这些知识和信息被存储为实体和实体关系的形式,通常用于支持智能问答系统。在一个知识库中,每个句子通常来说都具有三元组,例如“苏琳的性别是男”。在这个句子中,第一个实体是苏琳,第二个实体是男,实体关系(属性)就是性别。在这样的系统中,知识库起到了至关重要的作用。这些知识和信息被存储为实体和实体关系的形式,通常用于支持智能问答系统。在此基于知识库的智能问答系统中,对于一个问题,需要提取出来的有两部分内容,一是实体,二是实体关系。确定实体和实体关系之后,系统才能够通过知识库找到对应的答案。因此,在构建这样的系统时,首先需要搭建知识库数据库,将数据中的每一个知识点分别归纳出实体、实体关系和答案。一个知识点对应一行数据,接着将这些数据存储进mysql数据库中,如图:
    在这里插入图片描述

  • 接下来是训练模型,一共需要训练两个,一个是Bert-Crf模型,用于识别问题中的第一个实体。。在问答系统中,识别问题中的实体是非常关键的一步,因为它是回答问题所必须的基本信息。举例来说,对于“苏琳的性别是男”这个问题,Bert-Crf模型可以识别出“苏琳”这个实体。

  • 一般来说,回答一个问题需要三个要素:实体、实体关系和答案。但为了更快速地找到答案,在这里可以直接使用实体进行数据库查询。如果数据库中有关于这个实体的信息,就可以判断数据库中对应的属性是否存在于问题中。如果存在,就可以直接返回数据库中的答案,以此来简化整个问题回答的过程。

  • 以“苏琳”这个实体为例,如果在数据库中有对应的属性“性别”,并且问题中也提到了“性别”一词,那么就可以直接返回数据库中“性别”对应的答案“男”。这样,通过Bert-Crf模型和数据库的配合使用,可以快速准确地回答问题,提高问答系统的效率和精度。

  • 然而,实际上问题的复杂性可能不止于此。如果问题中涉及到多个实体,或者实体之间存在复杂的关系,这种简单的查询方法就不能满足需求了。此时,需要更加复杂的问答系统来处理这些问题。例如数据库中关于实体的数据的实体关系并不存在于问题中,这时候我们就需要利用第二个模型,即BertForSequenceClassification模型。

  • 利用预训练的 BERT模型来实现自然语言理解和问答,同时将知识库和问答系统进行整合,从而能够对用户提出的问题进行准确、高效的回答。该系统通过将问题和知识库中的实体和关系进行匹配,从而找到最佳答案。具体来说,本系统先将三个属性:实体(问题),实体关系(实体属性),实体(答案)存储进 mysql 数据库。当提出问题时,用 BertCrf模型来识别出问题中所包含的实体,识别出实体之后就可以进行数据库的查询;识别出实体后就需要进行实体与属性的连接,利用BertForSequenceClassification模型进行连接,连接完成后查询数据库得到答案并将结果返回。
    流程图如下:
    在这里插入图片描述
    结果展示如下:
    在这里插入图片描述

二.处理数据。

1.数据集介绍。

NLPCC(Natural Language Processing and Chinese Computing)是中国计算机学会主办的一个自然语言处理和中文计算会议,旨在促进中文自然语言处理领域的交流和发展。该会议自2002年开始举办,每年一届,通常在中国境内的某个城市举行。NLPCC已成为中国自然语言处理领域的重要学术盛会之一,吸引了众多国内外专家学者参与。该会议每年还会颁发最佳论文奖、最佳学生论文奖等奖项,以鼓励和表彰优秀的研究成果和研究人员。源数据集所在网址如下 :
源数据集
在本项目中,所使用的数据集是经过预处理的三元组数据。这些三元组数据包含了实体之间的关系和属性信息:
预处理过的数据集
其中包含了两个文件:一个是nlpcc-iccpol-2016.kbqa.training-data,另一个是nlpcc-iccpol-2016.kbqa.testing-data。分别是训练数据和测试数据。
内容如下:
在这里插入图片描述

2.切分数据。

  • training-data样本数量为14609,testing-data样本数量为9870 。将文件重新切分一下,划分为train.txt,test.txt,dev.txt三个文件。划分如下:(运行 1_split_data.py
    • 将nlpcc-iccpol-2016.kbqa.testing-data 中的对半分,一半变成验证集(dev.text),一半变成测试集(test.txt)。
    • nlpcc-iccpol-2016.kbqa.training-data 保持不变,直接复制成为训练集 train.txt。

3.构造命名实体识别(NER)数据集 (运行2-ner-data.py

  • 常见的命名实体识别的数据集实体类型包括国籍(CONT)、教育背景(EDU)、地名(LOC)、人名(NAME)、组织名(ORG)、专业(PRO)、民族(RACE)、职称(TITLE)。因为本系统只针对nlpcc的数据集做智能问答系统,故只定义一种数据类型LOC,并且以nlqcc的数据集作为训练数据。所以需要对nlqcc的数据做进一步处理。
    处理流程如下:首先,先检查每一行中是否包含 question 和 triple 两个字符串。虽然此系统只需要nlqcc数据集中的问题,但也需要得到问题中的实体作为标注的依据。如果发现包含这两个字符串中的一个,就将该行去除开头和结尾的空格并存储在 q_str 或 t_str 变量中。
  • 当遇到 ==== 这个分隔符时,说明已经是新的一个样本了。就可以将 q_str 和 t_str 进一步处理,提取出t_str 中的所有实体,将它们存储在 entities 变量中。
  • 接下来,代码将检查 entities 是否在 q_str 中出现,并将 q_str 拆分成一个字符列表 q_list,将其用空格分隔开并附加到 ner_list 后面,最后在 ner_tag_list 中附加相应的标记序列。
    具体地说,代码会将实体标记为 “B-LOC”(实体的开始)和 “I-LOC”(实体的中间或结尾),并将相应的标记附加到 ner_tag_list 中。完成后,代码会将 ner_list 和 ner_tag_list 中的所有标记和字符以及空格都合并成一个字符串列表。
    结果如下:
    在这里插入图片描述

4.制作知识库。

先需要将数据的问题,实体关系,答案制作成一个csv(运行3-q-t-a-data.py)。结果如下:
在这里插入图片描述
接着运行4-load_dbdata.py,将数据更新到数据库上面。

5.构建属性相似度的数据

  • 前文提到,如果我们输入的问题是“苏琳是男的吗?”,识别出“苏琳”这一实体后,当在数据库中查询到关于“苏琳”的数据后,因为数据库中关于“苏琳”这一数据的实体关系(属性)并不存在于问题当中,所以无法给出准确的答案,这个时候就需要利用到我们训练的第二个模型,BertForSequenceClassification模型。BertForSequenceClassification模型的作用简而言之就是判断我们提问的问题和知识库中存在的实体关系(属性)之间的关联,以此来找到准确的答案。所以数据集应该包含问题,属性,标签。
    结果如下:
    在这里插入图片描述

三.训练模型。

1. BertCrf模型(运行NER_main.py

BertCrf模型是一个结合了BertForTokenClassification和条件随机场(CRF)的模型,用于从问题中识别实体。
调用transformers下的BertForTokenClassification来创建MLM模型,然后在模型后面再接一个crf模型。
模型训练时的数据(模仿谷歌官网Bert模型对数据的处理方式处理):在这里插入图片描述
可以这么理解:

Input_ids:将输入到的词映射到模型当中的字典ID。
Attention_mask:要拿来mask的位置。在此处可以认为是判断是否有训练意义的标志。
Token_type_ids:在此处可以认为是segment_ids,因为是一个句子一个句子训练,所以都是第一个句子,都为0。
Labels_ids:文字对应的标签索引。(CRF_LABELS = [“O”, “B-LOC”, “I-LOC”])

评估结果如下:
在这里插入图片描述

2.BertForSequenceClassification模型(运行SIM_main.py)

在这里插入图片描述
模型训练时的数据(模仿谷歌官网Bert模型对数据的处理方式处理):
在这里插入图片描述

Input_ids:将输入到的词映射到模型当中的字典ID。
Attention_mask:要拿来mask的位置。在此处可以认为是判断是否有训练意义的标志。
Token_type_ids:在此处可以认为是属性词所在的位置,即segment_ids。
Labels:属性是否对应问题的标签。

评估结果如下:
在这里插入图片描述

四.搭建系统。(运行test_pro.py

  • 现在我们已经有了训练好的BertCrf模型和BertForSequenceClassification模型,分别保存为best_ner.bin和best_sim.bin,一个用于识别出问题中的实体,一个用于问题和属性相关性的判断。
  • 在这里插入图片描述
    参考文章:
    Bert谷歌地址:https://github.com/google-research/bert
    基于BERT模型的知识库问答(KBQA)系统
    Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
    TensorFlow:NLP自然语言处理,通用框架BERT项目实战,唐博士带你快速入门!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Morss获取全文RSS摘要

什么是 Morss ? Morss 工具的目标是从互联网上常见的 RSS 摘要中获取全文 RSS 摘要。Morss 能打开来自 RSS的链接,然后从网站下载整篇文章并将其放回 RSS 摘要中,还可以将摘要导出为 RSS/JSON/CSV/HTML。 Morss 需配合其他 RSS 阅读器使用&am…

人工智能AI图像风格迁移(StyleTransfer),基于双层ControlNet(Python3.10)

图像风格迁移(Style Transfer)是一种计算机视觉技术,旨在将一幅图像的风格应用到另一幅图像上,从而生成一幅新图像,该新图像结合了两幅原始图像的特点,目的是达到一种风格化叠加的效果,本次我们…

神经影像分析的统计学方法

线性模型概述 模型是对现实的一种数学近似,其中给定输入变量集的某个函数旨在重建一个输出变量。以fMRI范式为例,在这个范式中,给受试者呈现面孔和房屋的图像。该模型的目标是利用体素对面孔和房屋反应时的预期时间进程,并产生与…

基于html+css的图片展示20

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Mybatis(十)级联映射与懒加载

一、Mybatis的级联映射 使用Mybatis的级联映射,我们可以轻松的实现一对一、一对多或者多对多关联查询,甚至可以利用级联映射实现懒加载。 所谓的懒加载,就是我们在一个实体对象中关联了其他对象,如果不需要获取被关联的对象&…

什么样的测试才是优秀的测试

什么样的测试才是优秀的测试 优秀的测试应该包括以下要素: 测试代码的可读性和可维护性 代码在项目中及特定源代码中的组织方式 测试所检查的内容 测试的可靠性及可重复性 测试对测试替身的使用 可读的代码才是可维护的代码 代码较差的可读性与缺陷密度密切相…

GB 35114-2017 学习笔记

GB 35114-2017 学习笔记 第四章 公共安全视频监控联网信息安全系统互联结构 公共安全视频监控信息安全系统 公共安全视频监控信息安全系统由四部分组成: 具有安全功能的前端设备 FDWSF(安全前端设备:Front-end Device With Safety Function)具有安全功能的用户终…

Ubuntu18.04环境下安装igH EtherCAT Master

一、安装步骤 下载安装包 EtherCAT安装包:igH EtherCAT安装包(目前最新的稳定版) 安装依赖包 sudo apt install autoconf automake libtool net-tools解压EtherCAT安装包,进入解压出的文件夹,右键打开终端输入 ./b…

Spring IoC容器、IoC与DI

目录 Spring是什么? 理解容器 什么是IoC(Inversion of Control) 传统的new创建对象的方式中类与类的耦合程度很大。 IoC的优势: Spring IoC容器最核心的功能 什么是DI (Dependency Injection) IoC和DI的区别 Spring是什么? Spr…

145. 二叉树的后序遍历【34】

难度等级:容易 上一篇算法: 102. 二叉树的层序遍历【206】 力扣此题地址: 145. 二叉树的后序遍历 - 力扣(Leetcode) 1.题目:145. 二叉树的后序遍历 给你二叉树的根节点 root ,返回它节点值的 后…

Django DRF - JWT Token认证使用

JWT Token认证使用 jwt官网:https://jwt.io/ 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。 一. JWT概念 Json web token (JWT),…

JavaScript—javaEE

文章目录 1.关于JavaScript2.引入的方式3.输入输出4.语法4.1变量4.2基本数据类型4.3运算符4.4数组4.5函数4.6对象 5.dom5.1获取元素5.2操作元素5.3表单控件5.4样式:style属性5.5模仿和服务端交互 6.ajax6.1概念6.2作用6.3Ajax代码6.4Ajax发get请求6.5Ajax发post请求…

【文件系统和系统日志分析】

目录 一、inode和block概述block(块)inode(索引节点) 二、inode内容三、inode的号码3.1、查看inode号码的方法 四、inode的大小磁盘分区后的结构访问文件的简单流程 五、删除乱码文件六、inode节点耗尽故障处理6.1、模拟inode节点…

【Tomcat】Tomcat的安装配置和在Idea中使用Tomcat:

文章目录 一、获取安装包二、配置环境三、验证是否配置成功【法一】通过运行tomcat文件夹下的bin文件夹中的 startup.bat【法二】快捷键【winr】,输入【cmd】,点击【确定】,输入 startup.bat 四、出现乱码和端口号被占用的解决方案【1】出现乱…

Spring概述,IOC,AOP使用

Spring简介 Spring概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台,它最…

OpenStack 面板更替换代:Skyline Dashboard <-- Horizon 面板

~、OpenStack 面板更替换代&#xff1a;Skyline Dashboard <-- Horizon 面板 先决条件 一个至少运行核心组件的 OpenStack 环境, 并能通过 Keystone endpoint 访问 OpenStack 组件 一个安装有容器引擎的 (docker 或 podman) 的 Linux 服务器 一、 &#xff08;一&…

用starter实现api接口的加密与日志功能

一、概述 运用AOP技术实现对api接口的加密及日志功能。 加密&#xff1a; 需要加密的api接口上加注解&#xff1a;Encrypt&#xff08;自定义注解&#xff09;接口返回类型为String时才加密采用对称加密&#xff1a;加密和解密使用相同的密钥 日志&#xff1a; 对所有的api接…

【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章实现Unity3D打包WEBGL后播放视频&#xff0c;如下图所…

实现服务器版本的表白墙

目录 初始前端代码 网页初始效果 一、确定接口 二、编写代码 2.1 创建项目七步走 1、创建Maven项目 2、引入依赖 3、构建目录 4、编写代码 5、打包、部署 ​编辑 7、验证代码 三、具体的代码逻辑 3.1 服务器——两个服务接口 3.2 前端页面的代码 3.2.1 前端存档…

Springcloud快速复习

按照个人的习性,分布式我学习完以后一定会忘为此写次笔记自己快速复习 目录 Springcloud介绍注册中心 Springcloud介绍及微服务介绍 为什么学? 也不是以前的单体架构被淘汰而是,当业务足够大型,进行优化 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff…