一.问答系统
问答系统从知识领域划分:
- 封闭领域:封闭领域系统专注于回答特定领域的问题,由于问题领域受限,系统有比较大的发挥空间,可以导入领域知识或将答案来源全部转换成结构性资料来有效提升系统的表现;
- 开放领域:开放领域系统则希望不设限问题的内容范围,因此其难度也相对较大。
问答系统从实现方式划分:
- 基于流水线(pipeline)实现:如下图 1 所示,基于流水线实现的问答系统有四大核心模块,分别由自然语言理解(NLU)、对话状态跟踪器(DST)、对话策略(DPL)和自然语言生成(NLG)依次串联构成的一条流水线,各模块可独立设计,模块间协作完成任务。基于端到端(end-to-end)实现:
- 基于端到端实现的问答系统,主要是结合深度学习技术,通过海量数据训练,挖掘出从用户自然语言输入到系统自然语言输出的整体映射关系,而忽略中间过程的一种方法。但就目前工业界整体应用而言,工业界的问答系统目前大多采用的还是基于流水线实现的方式。
二.基于知识图谱的问答系统框架
#!/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