本部分任务主要是将用户输入问答系统的自然语言转化成知识库的查询语句,因此本文将分成两部分进行介绍。
- 第一部分介绍任务所涉及的背景知识;
- 第二部分则是相应的代码和其注释
一、问答系统
1.1 问答系统简介
问答系统(Question Answering System,QA System)是用来回答人提出的自然语言问题的系统。根据划分标准不同,问答系统可以被分为各种不同的类型。
-
问答系统从知识领域划分:
- 封闭领域:封闭领域系统专注于回答特定领域的问题,由于问题领域受限,系统有比较大的发挥空间,可以导入领域知识或将答案来源全部转换成结构性资料来有效提升系统的表现;
- 开放领域:开放领域系统则希望不设限问题的内容范围,因此其难度也相对较大。
-
问答系统从实现方式划分:
- 基于流水线(pipeline)实现:如下图 1 所示,基于流水线实现的问答系统有四大核心模块,分别由自然语言理解(NLU)、对话状态跟踪器(DST)、对话策略(DPL)和自然语言生成(NLG)依次串联构成的一条流水线,各模块可独立设计,模块间协作完成任务。
- 基于端到端(end-to-end)实现:基于端到端实现的问答系统,主要是结合深度学习技术,通过海量数据训练,挖掘出从用户自然语言输入到系统自然语言输出的整体映射关系,而忽略中间过程的一种方法。但就目前工业界整体应用而言,工业界的问答系统目前大多采用的还是基于流水线实现的方式
-
问答系统从答案来源划分:
- 「知识库问答」。是目前的研究热点。知识库问答(knowledge base question answering, KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。如下图 2 所示:
- 「常问问题问答」;
- 「新闻问答」;
- 「网际网路问答」;
图1 基于流水线实现的问答系统
图2 知识库问答系统
二、Query理解
2.1 query理解的目的
query理解是整个搜索系统中最上游的一环,负责的是从query中提取信息,从而了解用户希望通过这个query搜索出什么。
2.2 query理解的任务
- 纠错改写。针对用户输错的,没输入完全的,内容,进行修正。底层数据库只支持精准搜索,因此需要将query改写到正确的内容下。
- 意图识别。通过分析语义等方式,在一定的类目结构下,识别出具体意图。这个意图识别的目标,大家可以理解为告诉下游,需要在哪个库数据进行搜索。
- 实体识别。其实和意图识别一样,只不过,粒度更细,但是是词级别的分析,从query中抽取关键的实体,如果说意图识别是为了告诉下游该检索那个数据库,那实体识别就是为了告诉下游,在该数据库下,该检索哪些字段。
- 词权重问题。query里面有两个词,两个文档分别匹配到了其中一个词,那谁能靠前?这就要看匹配到什么内容更为重要。如家宾馆,匹配到一个如家酒店和五洲宾馆,如家酒店应该在前,这里就是为了解决这个问题。
- Query预处理
- Query纠错
- Query扩展
- Query归一
- 意图识别
- 槽值填充
- Term重要性分析;
由于本任务后面代码主要涉及意图识别和槽位解析,因此这里仅对这两部分内容做介绍:
2.3 意图识别
- 作用:意图识别是用来检测用户当前输入的意图,通常其被建模为将一段自然语言文本分类为预先设定的一个或多个意图的文本分类任务。
- 所用方法:和文本分类模型的方法大同小异,主要有:
- 基于词典模板的规则分类
- 传统的机器学习模型(文本特征工程+分类器)
- 深度学习模型(Fasttext、TextCNN、BiLSTM + Self-Attention、BERT等)
图3 意图识别
2.4 槽值填充
- 介绍:槽值填充就是根据我们既定的一些结构化字段,将用户输入的信息中与其对应的部分提取出来。因此,槽值填充经常被建模为序列标注的任务。
- 举例介绍:例如下图所示的 Query "北京飞成都的机票",通过意图分类模型可以识别出 Query 的整体意图是订机票,在此基础上进一步语义解析出对应的出发地 Depart="北京",到达地 Arrive="成都",所以生成的形式化表达可以是:Ticket=Order(Depart,Arrive),Depart={北京},Arrive={成都}。
图4 槽值填充
三、任务实践
3.1 整体框架
图5 基于知识图谱的问答系统框架
3.2 项目文件
本项目主要包含build_graph.py,entity_extractor.py,kbqa_test.py,search_answer.py四个文件。
四、命名实体
命名实体识别是指在文档集合中识别出特定类型的事物名称或符号的过程。命名实体识别由3个问题组成:1.识别出文本中的命名实体;2.确定该实体的类型;3.对于多个实体表示同一事物时,选择其中的一个实体作为该组实体的代表。
4.1 命名实体识别整体思路介绍
- step 1:对于用户的输入,先使用预先构建的疾病、疾病别名、并发症和症状的AC Tree进行匹配;
- step 2:若全都无法匹配到相应实体,则使用结巴切词库对用户输入的文本进行切分;
- step 3:然后将每一个词都去与疾病词库、疾病别名词库、并发症词库和症状词库中的词计算相似度得分(overlap score、余弦相似度分数和编辑距离分数),如果相似度得分超过0.7,则认为该词是这一类实体;
- step 4:最后排序选取最相关的词作为实体(项目所有的实体类型如图6所示,但实体识别时仅使用了疾病、别名、并发症和症状四种实体)
图6 实体介绍
4.2 结合代码介绍
五、意图识别
5.1 意图识别整体思路介绍
- step 1:利用TF-IDF表征文本特征,同时构建一些人工特征(每一类意图常见词在句子中出现的个数);
- step 2:训练朴素贝叶斯模型进行意图识别任务;
- step 3:使用实体信息进行意图的纠正和补充。
图7 意图识别
5.2 代码介绍