各类QA问答系统的总结与技术实现(持续更新)

问答系统是近几年大火的nlp应用之一,很多公司不论大小都一窝蜂地研发问答机器人、智能客服。不论是搜狗机器人汪仔在《一战到底》中战胜人类选手,还是前阵子火爆的直播答题类软件,都加速了问答系统走入大众的视野。但是不得不说,即使问答系统前景如此广阔,其背后的技术仍没有达到十分成熟的地步。我从去年9月开始接触QA到现在,对这一领域的一些常见任务和方法都有了初步了解,现做一个总结。

根据应用场景和需求的不同,QA任务的建模过程千变万化。我将从知识的来源、答案类型、交互方式、业务场景及问题类型五个方面对QA任务进行分类,分别展开介绍。

按知识来源划分

回答一个问题需要有依据,人类在回答问题时,会去大脑中搜索相关的内容,然后给出答案;而机器要想实现自动问答,也需要从外部获取知识(或依据)。就好比学生上学时学习知识,并把知识存在大脑中;考试时看到考题,会回忆学习过的相关知识,从而给出答案。机器没有学习知识的过程,我们需要将知识作为结构化或非结构话的数据供其访问,作为其回答问题的依据。根据知识来源的不同,问答系统可以分为以下三种任务:基于知识库的问答、基于文档的问答、答案选择。

KBQA 基于知识库的问答

参考资料:
KBQA从入门到放弃
揭开知识库问答KB-QA的面纱
肖仰华 | 基于知识图谱的问答系统

给定自然语言问题,通过对问题进行语义理解和解析,利用知识库进行查询、推理得出答案。
其特点是,回答的答案是知识库中的实体。
这里写图片描述
当我们在百度询问 2016年奥斯卡最佳男主角 时,百度会根据知识库进行查询和推理,返回答案,这其实就是KBQA的一个应用。
这里写图片描述
知识库通常由大量的三元组组成,每一条三元组包括:entity - relation - entity,如果我们把实体看作是结点,把实体关系(包括属性,类别等等)看作是一条边,那么包含了大量三元组的知识库就成为了一个庞大的知识图。
这里写图片描述

这里根据问题的复杂程度,又可以分为两类:

  1. 简单问句:这种问题只需要一个三元组就能搞定,比较基础的通过LR的方法: Antoine Bordes, Jason Weston, Nicolas Usunier. Open question answering with weakly su-pervised embedding models;或者结合CNN、RNN神经网络的方法:Character-Level Question Answering with Attention
  2. 复杂问句:需要多个三元组,有时需要进一步的推理或者做一些计算。回答这类问题目前采用下面基于语义解析一类的方法效果较好。贴个微软目前比较新的工作 Wen-tau Yih, Ming-Wei Chang, Xiaodong He, and Jianfeng Gao. 2015. Semantic parsing via staged query graph generation: Question answering with knowledge base.

传统的解决方法可以分为三类:

  1. 语义解析(Semantic Parsing)
    该方法是一种偏linguistic的方法,主体思想是将自然语言转化为一系列形式化的逻辑形式(logic form),通过对逻辑形式进行自底向上的解析,得到一种可以表达整个问题语义的逻辑形式,通过相应的查询语句(类似lambda-Caculus)在知识库中进行查询,从而得出答案。下图红色部分即逻辑形式,绿色部分where was Obama born 为自然语言问题,蓝色部分为语义解析进行的相关操作,而形成的语义解析树的根节点则是最终的语义解析结果,可以通过查询语句直接在知识库中查询最终答案。
    这里写图片描述
  2. 信息抽取(Information Extraction)
    该类方法通过提取问题中的实体,通过在知识库中查询该实体可以得到以该实体节点为中心的知识库子图,子图中的每一个节点或边都可以作为候选答案,通过观察问题依据某些规则或模板进行信息抽取,得到问题特征向量,建立分类器通过输入问题特征向量对候选答案进行筛选,从而得出最终答案。
  3. 向量建模(Vector Modeling)
    该方法思想和信息抽取的思想比较接近,根据问题得出候选答案,把问题和候选答案都映射为分布式表达(Distributed Embedding),通过训练数据对该分布式表达进行训练,使得问题和正确答案的向量表达的得分(通常以点乘为形式)尽量高,如下图所示。模型训练完成后则可根据候选答案的向量表达和问题表达的得分进行筛选,得出最终答案。
    这里写图片描述
    以上三种方法的代表论文都集中在13-14年。那么14年之后KB-QA的主流方法是什么呢?
    随着深度学习(Deep Learning)在自然语言处理领域的飞速发展,从15年开始,开始涌现出一系列基于深度学习的KB-QA文章,通过深度学习对传统的方法进行提升,取得了较好的效果,比如:
    使用卷积神经网络对向量建模方法进行提升:
    Dong L, Wei F, Zhou M, et al. Question Answering over Freebase with Multi-Column Convolutional Neural Networks[C]//ACL (1). 2015: 260-269..
    使用卷积神经网络对语义解析方法进行提升:
    h S W, Chang M W, He X, et al. Semantic parsing via staged query graph generation: Question answering with knowledge base[J]. 2015.
    使用长短时记忆网络(LSTM),卷积神经网络(CNNs)进行实体关系分类:
    , Mou L, Li G, et al. Classifying Relations via Long Short Term Memory Networks along Shortest Dependency Paths[C]//EMNLP. 2015: 1785-1794.
    D, Liu K, Lai S, et al. Relation Classification via Convolutional Deep Neural Network[C]//COLING. 2014: 2335-2344.(Best paper)
    Zeng D, Liu K, Chen Y, et al. Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks[C]//EMNLP. 2015: 1753-1762.
    使用记忆网络(Memory Networks),注意力机制(Attention Mechanism)进行KB-QA:
    A, Usunier N, Chopra S, et al. Large-scale simple question answering with memory networks[J]. arXiv preprint arXiv:1506.02075, 2015.
    Zhang Y, Liu K, He S, et al. Question Answering over Knowledge Base with Neural Attention Combining Global Knowledge Information[J]. arXiv preprint arXiv:1606.00979, 2016.
    以上论文几乎都使用了Freebase作为knowledge base,并且在WebQuestion数据集上进行过测试,这里给出各种方法的效果对比图,给大家一个更加直观的感受。
    这里写图片描述

近两年又涌现出很多利用深度学习进行向量建模,解决KBQA任务的论文(且大部分关注于解决简单问题),我将会在下篇博客中做详细的介绍,包括很多端到端的方法。

DBQA 基于文档的问答

这一类型的任务通常也称为阅读理解问答任务,最有名的是斯坦福基于SQuAD数据集展开的比赛(https://rajpurkar.github.io/SQuAD-explorer/
对于每个问题,会给定几段文本作为参考,这些文本通常根据问题检索得到,每段文本中可能包含有答案,也可能只与问题描述相关,而不含有答案。我们需要从这些文本中抽取出一个词或几个词作为答案。

推荐阅读:
Reading Wikipedia to Answer Open-Domain Questions:https://github.com/facebookresearch/DrQA
Dynamic Coattention Networks for Question Answer:https://zhuanlan.zhihu.com/p/27151397
KBQA Learning Question Answering over QA Corpora and Knowledge Bases:https://zhuanlan.zhihu.com/p/27665853

Answer Select 答案选择

Applying Deep Learning To Answer Selection: A Study And An Open Task:http://www.52nlp.cn/qa问答系统中的深度学习技术实现

按答案类型划分

  • 事实型问题
  • 列举型问题
  • 定义型问题
  • 交互型问题
    • 单轮
    • 多轮交互

按业务场景划分

  • 闲聊(chatbot)
  • 任务型
  • 知识型

获取答案方式

  • 生成式
  • 检索式
  • 42
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
实现一个问答系统,可以使用 Flask 框架来搭建一个 Web 应用程序。下面是一个简单的问答系统的示例,使用了 Flask 和 Redis 数据库: 1. 安装 Flask 和 Redis 首先,需要安装 Flask 和 Redis。可以使用 pip 安装它们: ``` pip install Flask pip install redis ``` 2. 编写应用程序 然后,可以编写一个 Flask 应用程序,用于接收用户输入的问题,并从 Redis 数据库中查找答案。下面是一个示例: ```python from flask import Flask, request, jsonify import redis app = Flask(__name__) r = redis.Redis(host='localhost', port=6379, db=0) @app.route('/qa', methods=['POST']) def qa(): question = request.form['question'] answer = r.get(question) if answer: return jsonify({'answer': answer.decode('utf-8')}) else: return jsonify({'answer': 'Sorry, I do not know the answer to that question.'}) if __name__ == '__main__': app.run(debug=True) ``` 3. 添加数据 现在,可以使用 Redis 命令行客户端添加一些数据到 Redis 数据库中: ``` redis-cli > SET "What is the capital of China?" "Beijing" ``` 4. 测试 启动应用程序,并向 /qa 路径发送一个 POST 请求,包含问题参数: ``` curl -X POST -d 'question=What is the capital of China?' http://localhost:5000/qa ``` 应该会收到以下响应: ``` { "answer": "Beijing" } ``` 这个示例只是一个简单的问答系统的雏形,实际情况中需要更复杂的算法和数据处理方法来提供更好的答案。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值