知识图谱学习笔记 04用户输入——知识库的查询语句
1.问答系统
定义:问答系统(Question Answering System, QA System)是用来回答人提出的自然语言问题的系统。主要有以下分类:
- 按知识领域划分:
- 封闭领域:回答特定领域的问题,系统发挥空间大,可以通过导入领域知识或将答案来源全部转化成结构性资料来有效提升系统的表现
- 开放领域:难度大,需要回答不设限问题
- 按实现方式划分:
- 流水线实现(pipeline):四大核心模块(自然语言理解NLU、对话状态跟踪器DST、对话策略DPL和自然语言生成NLG依次串联构成的一条流水线),各模块可独立设计,模块间协作完成任务
- 端到端end to end实现:主要结合深度学习技术,通过海量数据训练,挖掘出从用户自然语言输入到系统自然语言输出的整体映射关系,忽略中间过程。但目前工业界的问答系统主要采用基于流水线实现的方式。
- 按答案来源划分:
- 知识库问答Knowledge base question answering, KB-QA:是目前的研究热点。给定自然语言问题,通过对问题进行语义理解和解析,利用知识库进行查询、推理得出答案。
- 常问问题问答
- 新闻问答
- 网际网路问答
2. Query理解
Query理解(QU, Query Understanding),即从词法、句法、语义三个层面对Query进行结构化解析。
- 搜索Query理解包含的模块主要有:
- Query预处理
- Query纠错
- Query扩展
- Query归一
- 意图识别
- 槽值填充
- Term重要性分析
- …
2.1 意图识别
意图识别是用来检测用户当前输入的意图,通常其被建模为将一段自然语言文本分类为预先设定的一个或多个意图的文本分类任务。
方法主要有:
- 基于词典模板的规则分类
- 传统的机器学习模型(文本特征工程+分类器)
- 深度学习模型(Fastttext,TextCNN,BiLSTM+Self-Attention,BERT等)
2.2 槽值填充
槽值填充就是根据我们既定的一些结构化字段,将用户输入的信息中与其对应的部分提取出来。
常用模型:
- 词典匹配
- BiLSTM+CRF
- IDCNN
- BERT等
3.任务实践
4.主体类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
5.命名实体识别任务实践
5.1 命名实体识别整体思路
- 对于用户的输入,先使用预先构建的疾病、疾病别名、并发症和症状的AC Tree进行匹配;
- 若全都无法匹配到相应实体,则使用结巴切词库对用户输入的文本进行切分;
- 然后将每一个词都去与疾病词库、疾病别名词库、并发症词库和症状词库中的词计算相似度得分(overlap score、余弦相似度分数和编辑距离分数),如果相似度得分超过0.7,则认为该词是这一类实体;
- 最后排序选取最相关的词作为实体(项目所有的实体类型如下图所示,但实体识别时仅使用了疾病、别名、并发症和症状四种实体)
5.2 模块代码
5.2.1 构建AC Tree
先通过 entity_extractor.py 中 类 EntityExtractor 的 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
- 函数调用模块
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 +