Datawhale 知识图谱组队学习 之 Task 4 用户输入->知识库的查询语句 Part1

文章编写人:王翔
特别鸣谢:QASystemOnMedicalGraph

目录

  • Datawhale 知识图谱组队学习 之 Task 4 用户输入->知识库的查询语句
    • 目录
    • 一、引言
    • 二、什么是问答系统?
      • 2.1 问答系统简介
      • 2.2 Query理解
        • 2.2.1 Query理解介绍
        • 2.2.2 意图识别
        • 2.2.3 槽值填充
    • 三、任务实践
    • 四、 主体类 EntityExtractor 框架介绍

一、引言

本部分任务主要是将用户输入问答系统的自然语言转化成知识库的查询语句,因此本文将分成两部分进行介绍。

  • 第一部分介绍任务所涉及的背景知识;
  • 第二部分则是相应的代码和其注释

二、什么是问答系统?

2.1 问答系统简介

问答系统(Question Answering System,QA System)是用来回答人提出的自然语言问题的系统。根据划分标准不同,问答系统可以被分为各种不同的类型。

  • 问答系统从知识领域划分:

    • 封闭领域:封闭领域系统专注于回答特定领域的问题,由于问题领域受限,系统有比较大的发挥空间,可以导入领域知识或将答案来源全部转换成结构性资料来有效提升系统的表现;
    • 开放领域:开放领域系统则希望不设限问题的内容范围,因此其难度也相对较大。
  • 问答系统从实现方式划分:

    • 基于流水线(pipeline)实现:如下图 1 所示,基于流水线实现的问答系统有四大核心模块,分别由自然语言理解(NLU)、对话状态跟踪器(DST)、对话策略(DPL)和自然语言生成(NLG)依次串联构成的一条流水线,各模块可独立设计,模块间协作完成任务。
    • 基于端到端(end-to-end)实现:基于端到端实现的问答系统,主要是结合深度学习技术,通过海量数据训练,挖掘出从用户自然语言输入到系统自然语言输出的整体映射关系,而忽略中间过程的一种方法。但就目前工业界整体应用而言,工业界的问答系统目前大多采用的还是基于流水线实现的方式。

图 1 基于流水线(pipeline)实现

  • 问答系统从答案来源划分:
    • 「知识库问答」。是目前的研究热点。知识库问答(knowledge base question answering, KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。如下图 2 所示:
    • 「常问问题问答」;
    • 「新闻问答」;
    • 「网际网路问答」;

图 2 知识库问答

2.2 Query理解

2.2.1 Query理解介绍

Query理解 (QU,Query Understanding),简单来说就是从词法、句法、语义三个层面对 Query 进行结构化解析。

  • 搜索 Query 理解包含的模块主要有:
    • Query预处理
    • Query纠错
    • Query扩展
    • Query归一
    • 意图识别
    • 槽值填充
    • Term重要性分析;

由于本任务后面代码主要涉及意图识别和槽位解析,因此这里仅对这两部分内容做介绍:

2.2.2 意图识别

  • 介绍:意图识别是用来检测用户当前输入的意图,通常其被建模为将一段自然语言文本分类为预先设定的一个或多个意图的文本分类任务。
  • 所用方法:和文本分类模型的方法大同小异,主要有:
    • 基于词典模板的规则分类
    • 传统的机器学习模型(文本特征工程+分类器)
    • 深度学习模型(Fasttext、TextCNN、BiLSTM + Self-Attention、BERT等)

图 3 意图识别

2.2.3 槽值填充

  • 介绍:槽值填充就是根据我们既定的一些结构化字段,将用户输入的信息中与其对应的部分提取出来。因此,槽值填充经常被建模为序列标注的任务。
  • 举例介绍:例如下图所示的 Query “北京飞成都的机票”,通过意图分类模型可以识别出 Query 的整体意图是订机票,在此基础上进一步语义解析出对应的出发地 Depart=“北京”,到达地 Arrive=“成都”,所以生成的形式化表达可以是:Ticket=Order(Depart,Arrive),Depart={北京},Arrive={成都}。

图 4 槽值填充

  • 序列标注的任务常用的模型有:【注:这部分内容,第二期知识图谱组队学习将进行介绍】
    • 词典匹配;
    • BiLSTM + CRF;
    • IDCNN
    • BERT等。

三、任务实践

图 5 基于知识图谱的问答系统框架

四、 主体类 EntityExtractor 框架介绍

#!/usr/bin/env python3
# coding: utf-8
import os
import ahocorasick
from sklearn.externals import joblib
import jieba
import numpy as np

class EntityExtractor:
    def __init__(self):
        pass

    # 构造actree,加速过滤
    def build_actree(self, wordlist):
        """
        构造actree,加速过滤
        :param wordlist:
        :return:
        """
        pass
    # 模式匹配, 得到匹配的词和类型。如疾病,疾病别名,并发症,症状
    def entity_reg(self, question):
        """
        模式匹配, 得到匹配的词和类型。如疾病,疾病别名,并发症,症状
        :param question:str
        :return:
        """
        pass

    # 当全匹配失败时,就采用相似度计算来找相似的词
    def find_sim_words(self, question):
        """
        当全匹配失败时,就采用相似度计算来找相似的词
        :param question:
        :return:
        """
        pass

    # 采用DP方法计算编辑距离
    def editDistanceDP(self, s1, s2):
        """
        采用DP方法计算编辑距离
        :param s1:
        :param s2:
        :return:
        """
        pass

    # 计算词语和字典中的词的相似度
    def simCal(self, word, entities, flag):
        """
        计算词语和字典中的词的相似度
        相同字符的个数/min(|A|,|B|)   +  余弦相似度
        :param word: str
        :param entities:List
        :return:
        """
        pass

    # 基于特征词分类
    def check_words(self, wds, sent):
        """
        基于特征词分类
        :param wds:
        :param sent:
        :return:
        """
        pass

    # 提取问题的TF-IDF特征
    def tfidf_features(self, text, vectorizer):
        """
        提取问题的TF-IDF特征
        :param text:
        :param vectorizer:
        :return:
        """
        pass

    # 提取问题的关键词特征
    def other_features(self, text):
        """
        提取问题的关键词特征
        :param text:
        :return:
        """
        pass

    # 预测意图
    def model_predict(self, x, model):
        """
        预测意图
        :param x:
        :param model:
        :return:
        """
        pass

    # 实体抽取主函数
    def extractor(self, question):
        pass

热门文章

编程学习 ·

仿element自定义进度条

由于element官网进度条是按百分比显示的 可选值只有0-100;如果是一个量值的显示,如图这样的用element进度条实现起来就比较麻烦,所以就有了下边的自定义进度条 github: https://github.com/Hans-326/ProgressBar
编程学习 ·

[UML] 类图之间的关系 | 3.泛化关系

[UML] 类图之间的关系 | 3.泛化关系 3.泛化关系泛化(Generalization)关系也就是**继承关系**,用于描述父类与子类之间的关系,父类又称为基类或超类,子类又称为派生类 在UML中,泛化关系用带空心三角形的直线来表示 在代码实现时,使用面向对象的继承机制来实现泛化关系,在J…
编程学习 ·

怎么才能最短时、高效、踏实的学习 Python?

作者:飞绝眷岭 链接:https://www.zhihu.com/question/28530832/answer/58656332 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。Dataquest 这个网站上提供了一系列和数据分析相关的python教程,从python基本语法到data analysis的基本函数…
编程学习 ·

销售分析 II

题目描述:Table: Product+--------------+---------+ | Column Name | Type | +--------------+---------+ | product_id | int | | product_name | varchar | | unit_price | int | +--------------+---------+ product_id 是这张表的主键 Table: Sales+----…
编程学习 ·

【GNURadio RTL-SDR】双RTL-SDR信号源的FM调频广播接收机

文章目录1. 前言2. 实验过程2.1 制作流图2.2 RTL-SDR的设备参数1. 前言 两个RTL-SDR的dongle“电视棒”,芯片 RTL2832U + R820T ,淘宝50左右那种能收FM和我国DTMB频段,想都接到同一台电脑去用软件无线电(GNURadio)的方式收多个FM调频广播信号。 2. 实验过程 在谷歌搜了不少…
编程学习 ·

Flutter 混合接入实战

Flutter 混合接入是指 Flutter 以依赖库的形式接入现有的 Android 或 iOS 项目。不同于集中式的 Flutter 项目( Flutter 做为主项目,把 Android 和 iOS 项目包括在内),Flutter 混合接入更适合当前已有 Android 和 iOS 项目,以及可能需要与 Flutter 页面产生交互的场景。 混…
编程学习 ·

Python代码

hello world!!! import numpy as npfrom sklearn import linear_modelfrom mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as pltxx, yy = np.meshgrid(np.linspace(0,10,10), np.linspace(0,100,10)) zz = 1.0 * xx + 3.5 * yy + np.random.randint(0,100,…
编程学习 ·

CentOS Liniux 使用john进行弱口令检测

什么是弱口令? 弱口令(weak password) 没有严格和准确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如“123”、“abc”等,因为这样的口令很容易被别人破解,从而使用户的计算机面…
编程学习 ·

Java四种访问权限从大大小排列

public:可以被所有其他类所访问 protected:自身、子类及同一个包中类可以访问 default:同一包中的类可以访问,声明时没有加修饰符,认为是friendly private:只能被自己访问和修改。 public: 具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往…
编程学习 ·

Jmeter之JDBC的使用

(一)环境准备 1、下载mysql-connector-java-x.x.x.jar放到 jmeter根目录的lib目录下,重启jmeter(二)数据库配置 1、在测试计划下面,添加一个setup线程组2、在setup线程组下,添加一个配置元件JDBC Connection Configuration3、填写配置信息 Variable Name:数据库连接池的…
编程学习 ·

UE4学习-添加机关并添加代码控制

文章目录添加机关代码编写给密室添加屋顶打印日志控制系统角色创建一个新游戏模式替换DefaultPawn添加抓取组件获取起点和终点物体拾取,碰撞属性设置今日完整代码 添加机关 首先向场景里面添加一个聚光源添加聚光源以后,可以对其属性进行修改,如图:然后需要给聚光源添加一个…
编程学习 ·

Vue + Alioss前端上传图片

Vue + Alioss前端上传图片准备工作安装依赖js工具类封装使用end 准备工作 需要注册一个ali云申请accesskeys,具体的操作请参考 link. 安装依赖 npm install ali-ossjs工具类封装 let OSS=require(ali-oss);let client=new OSS({accessKeyId: 你创建的Bucket时获取的accessKey…
编程学习 ·

文件夹内图片批量重命名代码

文件夹内图片批量重命名代码import os import re import sys import cv2 import torchvision.transforms as transforms path = r"data/masks/" def renameall(path):fileList = os.listdir(path) # 待修改文件夹currentpath = os.getcwd() # 得到进程当前工作目录…
编程学习 ·

Niushop单商户商城系统后台新增功能啦!

随着单商户商城系统直播功能的上线,越来越多的牛友反馈,这真的是太方便啦! 抗疫期间,商城直播无疑是当下最红,再加上地摊经济,线上直播,线下溜达的功夫还能看看商品实物,简直不要太完美! 因此,Niushop研发团队就直播这一功能,又新增了几项功能,更方便于牛友们直播带…
编程学习 ·

C++ 宏的几个基本用法

变量定义#define PI 3.1415926 直接展开作为变量条件编译#if, #elif, #else, #endif用于条件编译: 在编译时期执行 #if 常量表达式1 语句… #elif 常量表达式2 语句… #elif 常量表达式3 语句… … #else 语句… #endif预定义#ifdef, #ifndef, defined. 它们经常用于避免头文件…
编程学习 ·

有什么报表工具支持多个不同的数据源?

基本上所有的报表都号称支持多源,确实简单的关系型所有产品都支持。如果报表工具连关系型都支持不全,那么直接可以淘汰掉。所以考察是否支持多源的重点应该放在以下三点上:报表工具对非关系型数据源的支持,例如文件、webservice 接口、nosql 数据库等,报表工具对这些数据源…
编程学习 ·

当成为后学的博士后,你的眼中已无所畏惧

后学者后进者也。说到博士后许多人会望而却步,对于他们来说,博士后如同一座难以翻越的大山无法想象。而对于另外一部分人来说,他们是后学者,是后进者,有些已年过半百,有些是全家人的支柱,还有的人已生居高位,却从来不忘进取,成为了后学者,选择了博士后进行深造,此时…
编程学习 ·

df 命令查看的 Size 不等于 Used + Available

根据下面显示的这张图片,有几个疑问 1、除了 tempfs , 其余的磁盘 Size 为什么不等于 Used + Available ? 2、Available = 0 时,还可以写文件吗?还可以创建目录吗?root 权限 和 普通用户会有区别吗?我们先来做个测试:普通用户:sysuser 不可以使用 Size - (Used+Avai…