知识图谱系列四

本文介绍了问答系统的工作原理,包括封闭领域与开放领域的问答,以及基于流水线和端到端的实现方式。重点探讨了Query理解、槽值填充和实体抽取。实体Extractor类展示了如何构建ACTree、进行模式匹配和相似度计算。此外,文章还分享了命名实体识别的实践,利用TF-IDF和人工特征识别用户意图。
摘要由CSDN通过智能技术生成

问答系统

什么是问答系统

问答系统(Question Answering System,QA System)是用来回答人提出的自然语言问题的系统

  • 从知识领域划分
    • 封闭领域
    • 开放领域
  • 从实现方式划分
    • 基于流水线(pipeline),四大核心模块,分别由自然语言理解(NLU)、对话状态跟踪器(DST)、对话策略(DPL)和自然语言生成(NLG)
    • 基于端到端(end-to-end)实现,结合深度学习技术,通过海量数据训练,挖掘出从用户自然语言输入到系统自然语言输出的整体映射关系,而忽略中间过程的一种方法
  • 从答案来源划分
    • 知识库问答
    • 常问问题问答
    • 新闻问答
    • 网际网路问答

Query

Query理解 (QU,Query Understanding),简单来说就是从词法、句法、语义三个层面对 Query 进行结构化解析。
包含的模块主要有:

  • Query预处理
  • Query纠错
  • Query扩展
  • Query归一
  • 意图识别
    • 所用方法和文本分类模型的方法大同小异,包括基于词典模板的规则分类,传统的机器学习模型(文本特征工程+分类器),深度学习模型(Fasttext、TextCNN、BiLSTM + Self-Attention、BERT等)
  • 槽值填充
    • 根据既定的一些结构化字段,将用户输入的信息中与其对应的部分提取出来。因此,槽值填充经常被建模为序列标注的任务。序列标注的任务常用的模型有词典匹配,BiLSTM + CRF,IDCNN,BERT。
  • Term重要性分析

EntityExtractor 框架介绍

为entity_extractor.py 中的 EntityExtractor 类

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

命名实体识别任务实践

  1. 对于用户的输入,先使用预先构建的疾病、疾病别名、并发症和症状的AC Tree进行匹配
  2. 若全都无法匹配到相应实体,则使用jieba对用户输入的文本进行切分
  3. 然后将每一个词都去与疾病词库、疾病别名词库、并发症词库和症状词库中的词计算相似度得分(overlap score、余弦相似度分数和编辑距离分数),如果相似度得分超过0.7,则认为该词是这一类实体
  4. 最后排序选取最相关的词作为实体(项目所有的实体类型如下图所示,但实体识别时仅使用了疾病、别名、并发症和症状四种实体)

意图识别任务实践

  1. 利用TF-IDF表征文本特征,同时构建一些人工特征(每一类意图常见词在句子中出现的个数)
  2. 训练朴素贝叶斯模型进行意图识别任务
  3. 使用实体信息进行意图的纠正和补充
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值