# KgCLUE **Repository Path**: sixwalter/KgCLUE ## Basic Information - **Project Name**: KgCLUE - **Description**: No description available - **Primary Language**: Python - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-12 - **Last Updated**: 2022-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于知识图谱的开放域问答系统 ## 一. 项目总体介绍 ### 1. 任务目标 **开放域问答系统:** 使用大量不同主题的文档来回答问题,是自然语言处理(NLP)、信息检索(IR)和相关领域长期研究的主题。 image-20220506113613101 **知识图谱:** 知识图谱(Knowledge Graph),是结构化的语义知识库,用于以符号形式描述物理世界中的概念及其相互关系。其基本组成单位是“实体-关系-实体”三元组,以及实体及其相关属性-值对,实体间通过关系相互联结,构成网状的知识结构。 image-20220506113858423 ### 2. 模型整体设计及流程 image-20220503172309406 具体流程如下: - 使用NER模型从问题中抽取实体并将其送入知识库进行匹配,找出所有可能的候选关系。 - 使用相似度模型计算所有候选关系与问题实体的相似度,找到可能性最大的候选关系。 - 使用该候选关系在知识图谱中查找,找到最终答案。 ## 二. 模型介绍 ### 1. 命名实体识别(NER) 命名实体识别( NER )是[信息提取](https://en.wikipedia.org/wiki/Information_extraction)、问答系统、句法分析、机器翻译等众多NLP任务的重要基础工具,旨在将[非结构化文本](https://en.wikipedia.org/wiki/Unstructured_data)中提到的[命名实体](https://en.wikipedia.org/wiki/Named_entity)定位并分类为预定义的类别,例如人姓名、组织、地点、[医疗代码](https://en.wikipedia.org/wiki/Medical_classification)、时间表达、数量、货币价值、百分比等。 **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](https://raw.githubusercontent.com/coelien/image-hosting/master/img/202205031741753.png) | **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 ## 五. 个人工作总结 > 后端模型代码基于[该仓库](https://github.com/CLUEbenchmark/KgCLUE)进行修改 - NER和SIM模型解耦(提取出推理部分,去掉了冗余wrapper) - Flask服务器搭建及与前端交互的代码(socketio)编写加调试 - 前端Uniapp聊天室编写及与后端交互的代码编写加调试 - 将该项目开源到[gitee仓库](https://gitee.com/sixwalter/KgCLUE)并进行维护