基于知识图谱的开放域问答系统
sixwalter Lv6

基于知识图谱的开放域问答系统

一. 项目总体介绍

1. 任务目标

开放域问答系统:

使用大量不同主题的文档来回答问题,是自然语言处理(NLP)、信息检索(IR)和相关领域长期研究的主题。

image-20220506113613101

知识图谱:

知识图谱(Knowledge Graph),是结构化的语义知识库,用于以符号形式描述物理世界中的概念及其相互关系。其基本组成单位是“实体-关系-实体”三元组,以及实体及其相关属性-值对,实体间通过关系相互联结,构成网状的知识结构。

image-20220506113858423

2. 模型整体设计及流程

image-20220503172309406

具体流程如下:

  • 使用NER模型从问题中抽取实体并将其送入知识库进行匹配,找出所有可能的候选关系。
  • 使用相似度模型计算所有候选关系与问题实体的相似度,找到可能性最大的候选关系。
  • 使用该候选关系在知识图谱中查找,找到最终答案。

二. 模型介绍

1. 命名实体识别(NER)

命名实体识别( NER )是信息提取、问答系统、句法分析、机器翻译等众多NLP任务的重要基础工具,旨在将非结构化文本中提到的命名实体定位并分类为预定义的类别,例如人姓名、组织、地点、医疗代码、时间表达、数量、货币价值、百分比等。

BIO标注法

将每个元素标注为“B-X”、“I-X”或者“O”。其中,“B-X”表示此元素所在的片段属于X类型并且此元素在此片段的开头,“I-X”表示此元素所在的片段属于X类型并且此元素在此片段的中间位置,“O”表示不属于任何类型,如下图所示:

image-20220503172543360

NER模型结构

image-20220503172634938

上图展示的NER模型使用Bert+BiLSTM+CRF的结构,首先使用Bert对输入的句子进行embedding,然后将这些向量输入BILSTM提取句子信息,最后输入CRF测算不同标注序列的概率,最后选取概率最大的序列作为最终结果。具体流程如下图所示。

image-20220503172702670

2. 相似度计算(SIM)

模型设计

  • KGQA子任务(关系识别)

    确定哪个关系必须被逻辑形式的特定部分使用是一项关键任务。类似于实体链接,我们需要学习映射自然语言表达到知识图谱,在该任务中是针对关系映射。

  • 阶段目标

    获得问题与知识三元组<头实体,关系,尾实体> 中相对应的关系。

  • 上游任务

    获得通过NER阶段识别到的头实体。

  • 下游任务

    通过头实体与SIM计算得到的关系检索尾实体(答案)。

image-20220503173133145

流程实现

  1. 根据识别到的实体,通过es接口找到可能的候选关系的列表

  2. 训练相似度模型进行关系预测:输入为问句和候选关系的拼接,输出为两者相似度

  3. 获得问句和候选关系的相似度,以最高相似度的关系作为结果用于下游任务

三. 数据集介绍

知识库

知识库来源于百科类数据,由百科类搜索页面的事实性三元组构成。格式为<头实体,关系,尾实体>

image-20220503173921792
实体数量 关系数量 高频关系(>100) 三元组数量
3121457 245838 3833 20559652

问答数据集

问答数据集为json格式,每行为一条问答对。问题是one-hop问题,即答案为知识库中的一条三元组。数据格式如下,其中id为问答对索引,quetion为问题,answer为答案,来自知识库,以’ ||| ‘分割。

image-20220503174113714

Corpus Train Dev Test Public Test Private
Num Samples 18k 2k 2k 3k
Num Relations 2164 1258 1260 423

四. 项目设计与体验优化

1. 项目设计前端

项目采用前端采用uni-app框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序、快应用等多个平台。

image-20220503174331338

2. 项目设计后端

项目后端采用flask框架,搭建简便快速,较其他同类型框架更为灵活、轻便、安全且容易上手;flask社区活跃,基于flask的应用插件及其丰富,足够满足后端需求,同时它也具有很好的扩展性。

image-20220503174458340

3. 体验优化

意图识别

普通的问答系统难以满足日益增长的用户需求,如果是知识库中不存在的问题或是用户的意图不够明确的话,问答系统都难以给出我们期望的回复,因此实现一个可以能够理解我们在问什么的,并能根据我们的询问以不同的方式来回复的聊天机器人是很必要的。目前的话,该项目采用的svm分类器,对预先可能的结果进行分类。作为训练数据目前主要有三类,如打招呼,百科信息询问,普通聊天。若分类为信息询问,则接入我们的问答接口,如果是普通聊天,则接入我们的聊天机器人接口。因为是手动构想用户可能的输入作为训练数据,所有难免效果不好,未来我们打算采用RASA这一更加强大的框架作为我们的意图分类器。

聊天室

设计聊天室的功能,是有多方面因素推动的,而非冗余的扩展。

  1. 首先的目的是分不同的群组,每个群组有特定支持的机器人,即该机器人是用该领域的语料训练的,并且表现较好。

  2. 二是收集特定领域的语料数据,有利于机器人把握句子的语义,持续有新的训练数据补充来对模型进行更新,有利于模型的迭代优化。

image-20220503181147667

五. 个人工作总结

后端模型代码基于该仓库进行修改

  • NER和SIM模型解耦(提取出推理部分,去掉了冗余wrapper)

  • Flask服务器搭建及与前端交互的代码(socketio)编写加调试

  • 前端Uniapp聊天室编写及与后端交互的代码编写加调试

  • 将该项目开源到gitee仓库并进行维护

  • Post title:基于知识图谱的开放域问答系统
  • Post author:sixwalter
  • Create time:2023-08-05 11:14:26
  • Post link:https://coelien.github.io/2023/08/05/projects/nlp project/项目概览/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments