前言
机器理解随着人工智能第一个概念的诞生开启了它的历史。杰出的艾兰图灵先生在他的著作《Computing Machinery and Intelligence》一书中提出了如今被称为图灵测试(The Turing test)的智能判定准则。大约70年之后,问答系统,作为机器理解的一个子领域,仍然是人工智能中最困难的任务之一。
不过,从去年开始,在深度学习研究的发展和迁移学习技巧的出现之下,自然语言处理(NLP)领域已经经历了一场快速的演变。强有力的预训练自然语言处理模型如OpenAI-GPT,ELMo,BERT和XLNet。
随着这样的进程,一些改良过的NLP系统和应用应运而生。其中一个系统是cdQA-suite,这是我和同事在一起开发的。
https://github.com/cdqa-suite/cdQA
Open-domain QA vs closed-domain QA
当我们在考虑问答系统时,我们应当注意到两种不同的系统:open-domain QA(ODQA)系统和closed-domain QA(CDQA)系统。
ODQA系统处理几乎所有的问题,并且能够仅仅依赖于通用知识本体和世界知识。这类系统的一个例子是DrQA:
https://github.com/facebookresearch/DrQA/
这是一个Facebook研究团队开发的开放域问答系统,它使用了大量的维基百科的文章作为知识源。因为这些文档与一些不同的话题和科目有关,我们可以理解为什么这个系统被称为是一个开放域问答系统。
另一方面,CDQA在某个特定的范畴(比如说,药品和自动维护)下解决问题,并且能够通过使用一个适合于一个特定领域的数据集的模型来开拓特定领域的知识。cdQA-suite就是为方便任何想要建立一个CDQA的人使用而搭建的。
https://cdqa-suite.github.io/cdQA-website/#about-us
cdQA-suite
一个端到端的闭合域问答系统
cdQA-suite包含三个模块:
cdQA:便捷的问答流程实现Python程序包
cdQA-annotator:为模型评估和性能调整实现问答数据集标注的工具
cdQA-ui:可以被连接到任何网页和可以被连接到后端系统的用户界面
我会解释每个模块是如何运作的,以及你在用你自己的数据建立问答系统时如何使用它们。
cdQA
cdQA架构基于两个主要部分:检索器(Retriever)和解读器(Reader)。你可以在下图中了解系统机理。
cdQA流程机理
当一个问题被送到这个系统时,检索器杂数据集中选择一系列最可能包含答案的文件。这基于与DrQA相同的检索器,它创造了基于一元和二元的TF-IDF(term frequency–inverse document frequency)特征,并计算了问题语句和数据集中的每个文档的余弦相似性。
在选择了可能性最大的文档之后,系统把每一个文档分成段落,并将它们和问题一起发送至解读器,解读器基本上是一个预训练深度学习模型。模型使用Pytorch版本的著名自然语言处理模型BERT:
https://github.com/huggingface/pytorch-pretrained-BERT
由HuggingFace提供:
https://huggingface.co/
然后,这个解读器输出它能在每个段落中找到的最可能的回答。在解读器之后,系统中的最后一层处理使用一个内部评分函数进行比较,并输出在这些分数中可能性最大的一个。
使用cdQA Python程序包
在开始使用这个程序包之前,让我们先把它下载好。你可以使用pip install cdqa 下载它,但是在这个教程中,我们会从GitHub源来下载它,以便我运行下载预训练模型和BNP数据集(一个含从他们的公开新闻网页中导出文章的数据集)的脚本。
现在,你可以打开一个jupyter notebook然后跟宋以下步骤来看看cdQA如何运行。
你将得到如下输出:
问答系统流程预测的输出
你将注意到这个系统不仅仅输出了一个结果,还输出了结果所在的段落和该文档或文章的标题。
在以上的片段中,需要用预处理/过滤步骤来将法国巴黎银行的数据转化为以下结构:
应当被输送至cdQA的数据及结构
如果你使用你自己的数据集,请保证你的数据矩阵是如下结构的。
当使用模型的CP版本时,每次预测需要花费10到20秒来完成。这个中等的运行时间是因为BERT解读器,这是一个非常大的深度学习模型(有大约110兆个变量)。如果你有一个GPU,你可以直接使用模型的GPU版本models/bert_qa_vGPU-sklearn.joblib
这些与训练模型也可以在cdQA的发布页面上获取:
https://github.com/cdqa-suite/cdQA/releases
解读器的训练和性能调整
你也可以提高基于SQuAD1.1数据集预训练的解读器的表现。
https://rajpurkar.github.io/SQuAD-explorer/
如果你有一个与SQuAD相同格式的被注释的数据集(可以在cdQA-annotator的帮助下获得),你可以对解读器进行性能调整:
请注意,这样的性能调整应当使用GPU进行,因为BERT模型太大以至于不能使用CPU来训练。
你也可以在官方教程中寻找其他的方法来做相同的步骤:
https://github.com/cdqa-suite/cdQA/tree/master/examples
CdQA-annotator
为了使数据标注顺利进行,团队搭建了一个基于网页的应用——cdQA-annotator。
为了使用它,你应当将你自己的数据集转换为一个像SQuAD 格式的JSON文件:
现在你可以下载这个标注器并运行它:
现在你可以打开http://localhost:8080/ ,在加载了你的JSON文件之后,你会看到以下内容:
cdQA-annotator界面
你只需要写一个问题,用鼠标光标高亮答案(答案会被自动写好)来开始标注问题-回答配对,然后点击Add annotation :
在标注之后,你可以下载并使用它来调整BERT解读器(方法参见上一节)。
cdQA-ui
我们也提供了一个基于网页的用户界面来与cdQA连结。在这一节中,我们会描述你能如何使用这个UI连接到cdQA后端。
首先,必须在你的位置(确认你在cdQA文件夹中运行)配置一个cdQA RSET API:
接下来,你需要运行cdQA-ui程序包的下载指令:
然后,你启动开发服务器:
你现在可以通过http://localhost:8080/ 进入页面程序。你也将看到以下图片:
cdQA-ui的网页应用
因为应用以及通过REST API连接到后端,你可以问一个问题然后这个应用会显示一个答案和答案所在的文章内容以及文章的标题。
网页应用运行示例
将界面嵌入一个网页
如果你想将这个界面和你的网页结合起来,你只需要在你的Vue app上做以下的输入:
然后你将cdQA界面组成部分插入
<CdqaUI api_endpoint_cpu="http://localhost:5000/api" :queries_examples="['What is Artificial Intelligence?', 'What is Blockchain?']">
</CdqaUI>
示例
你也可以在官方网页上获取应用的示例:
https://cdqa-suite.github.io/cdQA-website/#demo
总结
在这篇文章中,我介绍了用于配置端到端闭合域问答系统的软件套件cdQA-suite。
如果你对这个项目感兴趣并想学到更多,随时可以登录官方GitHub(https://github.com/cdqa-suite)进行查看。
我们近期发布了cdQA程序包的1.0.2版本,新版本具有很高的性能并展示了非常有价值的结果,也还有许多提高的空间。如果你想要对项目做出贡献,对提升提供帮助,你可以看看当前的问题:https://github.com/cdqa-suite/cdQA/issues。可以自行选择一个问题并PullRequest。
来源:https://towardsdatascience.com/how-to-create-your-own-question-answering-system-easily-with-python-2ef8abc8eb5