1.问答系统介绍
- 问答系统的实现方式:
- 基于流水线(pipeline)实现:基于流水线实现的问答系统有四大核心模块,分别由自然语言理解(NLU)、对话状态跟踪器(DST)、对话策略(DPL)和自然语言生成(NLG)依次串联构成的一条流水线,各模块可独立设计,模块间协作完成任务。
- 基于端到端(end-to-end)实现:基于端到端实现的问答系统,主要是结合深度学习技术,通过海量数据训练,挖掘出从用户自然语言输入到系统自然语言输出的整体映射关系,而忽略中间过程的一种方法。但就目前工业界整体应用而言,工业界的问答系统目前大多采用的还是基于流水线实现的方式。
-
问答系统的答案来源:
1.「知识库问答」。是目前的研究热点。知识库问答(knowledge base question answering, KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。
2.「常问问题问答」
3.「新闻问答」
4.「网际网路问答」
2.Query理解介绍
Query理解 (QU,Query Understanding),简单来说就是从词法、句法、语义三个层面对 Query 进行结构化解析。
搜索 Query 理解包含的模块主要有:
Query预处理,Query纠错,Query扩展,Query归一,意图识别,槽值填充,Term重要性分析
本任务后面代码主要涉及意图识别和槽位解析,因此这里仅对这两部分内容做介绍。
2.1.意图识别
意图识别是用来检测用户当前输入的意图,通常其被建模为将一段自然语言文本分类为预先设定的一个或多个意图的文本分类任务。
- 所用方法:和文本分类模型的方法大同小异,主要有:
基于词典模板的规则分类
传统的机器学习模型(文本特征工程+分类器)
深度学习模型(Fasttext、TextCNN、BiLSTM + Self-Attention、BERT等)
2.2.槽值填充
槽值填充就是根据我们既定的一些结构化字段,将用户输入的信息中与其对应的部分提取出来。因此,槽值填充经常被建模为序列标注的任务。
例如 Query “北京飞成都的机票”:通过意图分类模型可以识别出 Query 的整体意图是订机票,在此基础上进一步语义解析出对应的出发地 Depart=“北京”,到达地 Arrive=“成都”,所以生成的形式化表达可以是:Ticket=Order(Depart,Arrive),Depart={北京},Arrive={成都}。
- 序列标注的任务常用的模型有:
词典匹配
BiLSTM + CRF
IDCNN
BERT等
3.QASystemOnMedicalGraph的实践
其中有两个关键步骤:命名实体和意图识别
3.1.命名实体
- step 1:对于用户的输入,先使用预先构建的疾病、疾病别名、并发症和症状的AC Tree进行匹配;
- step 2:若全都无法匹配到相应实体,则使用结巴切词库对用户输入的文本进行切分;
- step 3:然后将每一个词都去与疾病词库、疾病别名词库、并发症词库和症状词库中的词计算相似度得分(overlap score、余弦相似度分数和编辑距离分数),如果相似度得分超过0.7,则认为该词是这一类实体;
- step 4:最后排序选取最相关的词作为实体(项目所有的实体类型如下图所示,但实体识别时仅使用了疾病、别名、并发症和症状四种实体)
1:构建 AC Tree
entity_extractor.py 中的 build_actree 函数构建AC Tree
- 函数模块
def build_actree(self, wordlist):
"""
构造actree,加速过滤
:param wordlist:
:return:
"""
actree = ahocorasick.Automaton()
# 向树中添加单词
for index, word in enumerate(wordlist):
actree.add_word(word, (index, word))
actree.make_automaton()
return actree
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 函数调用模块
def __init__(self):
...
self.disease_path = cur_dir + 'disease_vocab.txt'
self.symptom_path = cur_dir + 'symptom_vocab.txt'
self.alias_path = cur_dir + 'alias_vocab.txt'
self.complication_path = cur_dir + 'complications_vocab.txt'