【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统

     大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流

个人主页-Sonhhxg_柒的博客_CSDN博客 

欢迎各位→点赞 + 收藏⭐️ + 留言​

系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟

文章目录

质量保证系统的类型

使用 BERT 设计问答系统

对于 Windows 服务器

对于 Linux 服务器

开放域问答系统

DeepPavlov QA系统

结论


我们被以文档、图像、博客、网站等形式存在的大量信息所包围。在大多数情况下,我们总是寻找直接的答案,而不是阅读整个冗长的文档。问答系统通常用于此目的。这些系统扫描文档语料库并为您提供相关的答案或段落。它是信息检索和 NLP 领域计算机科学学科的一部分,专注于构建系统,自动提取人类或机器以自然语言提出的问题的答案。

最早的两个问答系统BASEBALL和LUNAR,因其核心数据库或信息系统而大受欢迎。BASEBALL 旨在回答一年周期内的美国联盟棒球问题。LUNAR 旨在根据从阿波罗登月任务收集的数据回答与月球岩石地质分析相关的问题。此类早期系统集中于封闭域,其中每个查询都必须与特定域有关,而答案文本必须仅来自受限的词汇表。

现代世界的一些高级问答系统是 Apple Siri、Amazon Alexa 和 Google Assistant。有各种流行的数据集可用于问答系统,可用于检查您的模型性能。这些包括以下内容。
  • SQuAD :斯坦福问答数据集 (SQuAD) 是我们在第4章中介绍的阅读理解数据集。

  • NewsQA :创建此数据集是为了帮助研究社区构建能够回答需要人类水平理解和推理技能的问题的算法。通过使用来自 DeepMind 问答数据集的 CNN 文章,作者准备了一个包含 120,000 个问答对的众包机器阅读理解数据集。

  • WikiQA :这个公开可用的数据集包含成对的问题和答案。它已被收集和注释用于开放域问答系统的研究。此外,WikiQA 数据集还包括没有正确答案的问题,使研究人员能够处理负面案例,同时避免选择不相关的答案。

质量保证系统的类型

问答系统大致分为两类:开放域问答(ODQA)系统和闭域问答(CDQA)系统。
  • 封闭域 在封闭域系统中,问题属于特定域。他们只能回答来自单个域的问题。例如,医疗保健领域的问答系统无法回答任何与 IT 相关的问题。这些系统通过使用在特定领域数据集上训练的模型来利用特定领域的知识。CDQA 套件可用于构建此类闭域 QA 系统。

  • 开放域 在开放域系统中,问题可以来自任何领域,例如医疗保健、IT、体育等。这些系统旨在回答来自任何领域的问题。这些系统实际上模仿人类智能来回答问题。此类系统的一个示例是 DeepPavlov ODQA 系统,它是 MIPT 开发的一种 ODQA,它使用来自维基百科的大量文章数据集作为其知识来源。

这些系统可以进一步分为事实类和非事实类,如第4章简要介绍和此处所述。
  • Factoid 问题  Factoid问题是关于提供简明的事实。事实型问题的答案基于已证实的事实。例如,可能会要求学习者看一段文章,然后根据他或她刚刚阅读的内容回答一系列事实性问题。这些类型的问题通常以谁、什么、何时或何地开头。

    以下是事实型问题的一些示例。
    • Who is the president of the United States?

    • Who is the prime minister of India?

    • Who is the CEO of Google?

    如果文本包含足以回答问题的相关数据,则可以从任何文档或博客中回答所有这些问题。
    • Non-factoid 问题 :Non-factoid 问题需要关于任何主题的详细答案。例如,用户可以提出与数学问题、如何驾驶车辆、温度意味着什么等相关的问题。非事实性问题通常需要多个句子作为答案,而这些答案来自文档中的特定段落。因此,句子的上下文对于检索相关答案起着重要作用。

    以下是一些非事实性问题的示例。
    • What is the process of installing Python on Windows?

    • How can I reset my Microsoft Outlook password?

    • What do you mean by temperature?

    这些问题的答案将是文档、段落或段落中的定义。

使用 BERT 设计问答系统

本节详细介绍了如何使用 BERT 来实现事实型问答系统。对于本书,我们使用的是在 SQuAD 版本 1 数据集上训练过的预训练模型。

例如,考虑这个问题,以及维基百科关于足球联赛的文章中的段落。
  • Question: Where was the Football League founded?

  • Passage: In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world.

因此,这个问题的答案将是英格兰。

现在,我们将仔细研究如何使用 BERT 处理这个问题和段落以找到相关答案。与第4章中的文本分类方法相比,这都是在问答系统的背景下进行的。

BERT 从问题和段落中提取标记并将它们组合在一起作为输入。如前所述,它以指示句子开始的 [CLS] 标记开头,并使用 [SEP] 分隔符分隔问题和段落。除了 [SEP] 标记外,BERT 还使用段嵌入来区分问题和包含答案的段落。BERT 创建两个片段嵌入,一个用于问题,另一个用于段落,以区分问题和段落。然后将这些嵌入添加到令牌的单热表示中,以在问题和段落之间进行隔离,如图5-1所示。

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第1张图片

                                                               图 5-1  BERT输入表示
接下来,我们将问题和段落的组合嵌入式表示作为 BERT 模型的输入。然后将更改 BERT 的最后一个隐藏层,并使用 softmax 为定义子字符串(即答案)的输入文本句子生成开始和结束索引的概率分布,如图5-2所示。

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第2张图片

                                                图 5-2  问答系统的BERT架构

至此,我们已经讨论了 BERT 将如何处理输入的问题和段落。接下来,我们将看到在 Python 中使用 BERT 实现问答系统。

按照此处给出的步骤安装基于 BERT 的问答系统所需的先决条件。其中许多与第4章中的示例相同,但为了完整性而包含在内以确保您可以运行本章中的示例。
1. 确保您的系统上安装了 Python。打开命令提示符,运行以下命令,判断是否安装了Python,如图5-3所示。
Python

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第3张图片

                                                                图 5-3  Python控制台

这将在命令提示符下打开您的 Python 控制台。如果您的系统上未安装 Python,请根据您的操作系统从Download Python | Python.org下载并安装它。

 
2. 接下来,安装我们将用于编码的 Jupyter Notebook。打开命令提示符并运行以下命令。
 
pip install notebook

3.打开命令提示符并运行以下命令以运行 Jupyter Notebook。

jupyter notebook

笔记本将在您的默认浏览器中打开,主机地址为 localhost,端口号为 8888,以及一个唯一的令牌 ID。现在,您可以开始编写后续步骤中提到的代码,如图5-4所示。

 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第4张图片
                                                图 5-4  Jupyter Notebook 控制台

4. 您也可以出于相同目的使用 Google Colab Notebook。如果您的系统没有足够的可用资源,它提供了一个快速且免费的环境来运行您的 Python 代码。您还可以在 Google Colab 中免费使用 GPU 和 TPU,但限时(12 小时)。您只需要一个 Google 帐户即可登录 Google Colab Notebook。对于本书,我们将使用 Google Colab Notebook 来演示使用 BERT 的问答系统。登录到您的 Google 帐户并单击https://colab.research.google.com。您将看到如图5-5所示的屏幕。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第5张图片

                                图 5-5  用于创建或导入笔记本的Google Colab 界面
5. 要创建新的 Colab notebook,请点击右下角的 New Notebook,如图5-5所示。
 
6. 从 Huggingface 安装变形金刚库。在 Jupyter Notebook 或 Colab Notebook 中运行以下命令。

pip 安装变压器

 
7. 成功安装 transformers 库后,您应该能够看到如图5-6所示的输出。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第6张图片

                                                         图 5-6 安装transformers

接下来,我们将继续使用 BERT 实现问答系统。包含的代码片段将为问答系统提供分步说明。
1. 导入转换器库的BertQuestionAnswering和BertTokenizer类,如此处所示。
 
from transformers import BertForQuestionAnswering
from transformers import BertTokenizer
import torch
2. 接下来,加载在 SQuAD 版本 2 数据集上微调的 BERT 问答模型。它将是 BERT 的大版本,有 24 层,3.4 亿个参数,嵌入大小为 1,024。除了 BERT 模型,我们还下载了经过训练的模型词汇集,如下所示。
 
# 为问答加载预训练模型
bert_model = BertForQuestionAnswering.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
# 加载词汇
bert_tokenizer = BertTokenizer.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
笔记

这将需要几分钟时间,具体取决于您的 Internet 带宽,因为模型大小约为 1.34 GB。

3. 接下来,它需要一个问题和候选段落上下文,其中存在问题的答案。您可以使用任何搜索引擎或文档索引器系统(例如 Apache Solr 或 Watson Discovery Service (WDS))查找候选段落。这些系统将为用户提出的问题提供上下文段落。
 
4. 然后 ,问题连同上下文段落将被传递到问答系统,首先将根据下载的词汇对它们进行标记化。如前所述,它们将使用中间的特殊字符 [SEP] 标记连接在一起,如此处所示(参考文本取自维基百科文章)。
question = "Where was the Football League founded?”
reference_text = " In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world."
# 对输入文本进行分词
input_ids = bert_tokenizer.encode(question, reference_text)
input_tokens = bert_tokenizer.convert_ids_to_tokens(input_ids)
  5. 接下来,我们需要使用段嵌入将它们连接起来,以区分问题和上下文段落。问题的片段嵌入将被添加到问题的标记向量中,并且类似地用于上下文段落的片段嵌入。这甚至应该在将其用作 BERT 模型的输入之前完成。这些添加由转换器库在内部管理,但我们需要提供布尔值(0 或 1)来区分每个标记,如此处所示。
#查找第一次出现的[SEP]令牌的索引
sep_location = input_ids.index(bert_tokenizer.sep_token_id)
first_seg_len, second_seg_len = sep_location+1, len(input_ids)-(sep_location+1)
seg_embedding = [0]*first_seg_len + [1]*second_seg_len
  6. 现在我们可以将示例传递给模型。
# 在我们的例子中测试模型
model_scores=bert_model(torch.tensor([input_ids]),token_type_ids=torch.tensor([seg_embedding]))
ans_start_loc, ans_end_loc = torch.argmax(model_scores[0]),
torch.argmax(model_scores[1])
result = ' '.join(input_tokens[ans_start_loc:ans_end_loc+1])
result = result.replace(' ##','')

  7. 该模型将提供上下文通道的开始和结束索引作为答案,例如起始索引值为 11,结束索引值为 18。最终输出将使用这些索引从上下文通道中提取。
 
这是完整的 Python代码,它将问题和参考文章作为输入并找到该问题的答案。
from transformers import BertForQuestionAnswering
from transformers import BertTokenizer
import torch
def get_answer_using_bert(question, reference_text):
    # 为问答加载预训练模型
    bert_model = BertForQuestionAnswering.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
    # 加载词汇
    bert_tokenizer = BertTokenizer.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
    # 对输入文本进行分词
    input_ids = bert_tokenizer.encode(question, reference_text)
    input_tokens = bert_tokenizer.convert_ids_to_tokens(input_ids)
# 查找第一次出现的[SEP]令牌的索引
    sep_location = input_ids.index(bert_tokenizer.sep_token_id)
    first_seg_len, second_seg_len = sep_location+1, len(input_ids)-(sep_location+1)
    seg_embedding = [0]*first_seg_len + [1]*second_seg_len
    # 在我们的例子中测试模型
    model_scores = bert_model(torch.tensor([input_ids]), token_type_ids=torch.tensor([seg_embedding]))
    ans_start_loc, ans_end_loc = torch.argmax(model_scores[0]), torch.argmax(model_scores[1])
    result = ' '.join(input_tokens[ans_start_loc:ans_end_loc+1])
    result = result.replace(' ##','')
    return result
if __name__ == "__main__" :
question = "Where was the Football League founded?"
reference_text = " In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world."
print(get_answer_using_bert(question, reference_text))
在 Colab Notebook 中运行此代码后,我们得到以下输出:
england

现在,我们已经了解了如何将基于 BERT 的问答系统用于研究目的。接下来,考虑这样一个场景,您需要部署此功能以供某些网站或对话系统使用,以便为正在寻找其查询答案的最终用户提供服务。在这种情况下,您需要将 QA 系统的功能发布或公开为 REST API。现在,按照以下步骤将 QA 系统的功能发布为 REST API。

让我们完成为 Windows 和 Linux 服务器上的问答系统设置 REST API 和该 API 的公共 URL 的步骤(如果您在专用网络内,请使用 ngrok 生成公共 URL)。

对于 Windows 服务器

先决条件:需要在您的系统上安装 Python 3.6.x 和 Pip。

创建 REST API

1. 安装 Flask-RESTful

Flask-RESTful 是用于构建 REST API 的微框架 Flask 的扩展。

安装时,在Windows命令提示符下运行如下命令,如图5-7所示。
pip install flask-restful

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第7张图片

                                                图 5-7 安装Flask-RESTful

 此命令将安装包及其所有依赖项。

2 . 构建 REST API

RESTful API 使用 HTTP 请求来获取和发布数据。

首先创建一个QuestionAnswering.py文件,其中包含您从 GitHub 下载的问题回答代码。

3. 部署 Flask REST API

使用 Flask 部署 REST API 服务,并在 Windows 命令提示符下运行以下命令,如图5-8所示。
python QuestionAnswering.py
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第8张图片

                                                         图 5-8 服务部署

4 . 来自 REST API 的响应

现在该服务已托管在 URL http://127.0.0.1:5000/getResponse上。我们希望问答系统的功能是公开的。因此,我们将使用 ngrok 生成一个与我们之前配置的本地 URL 相对应的公共 URL。

让我们看看使用 ngrok 生成公共 URL 的步骤。
1. 要配置 ngrok,请从ngrok - download下载它。
 
2. 仅当在 https://ngrok.com/signup 注册后从 https://dashboard.ngrok.com 下载身份验证令牌时,公共URL才可用。
 
3. 必须将身份验证令牌指定给 ngrok,以便客户端绑定到此帐户。ngrok 将 auth token 保存在~/.ngrok2/ngrok.yml中,这样就不需要重复前面的步骤了。
 
4. 解压缩下载的 ngrok 文件夹并运行ngrok.exe应用程序。
 
5. 从命令中提到的用户帐户复制身份验证令牌,并在 ngrok 终端提示符下运行此命令,如图5-9所示。
 

                                                        图 5-9 令牌生成
“ngrok authtoken
6. 经过上一步,authtoken被保存到配置文件中,如图5-10所示。
 
                                                图 5-10 ngrok 配置

 7.ngrok 是一个命令行应用程序,因此在此终端提示符下键入ngrok http https://:以公开 HTTPS URL。这里的IP和端口设置对应问答API主机和API所在的端口,如图5-11所示。

 

                                                  图 5-11  生成公共 URL
8. 执行命令后会打开一个新的终端,显示本地服务器URL对应的公共URL https://44e2f215.ngrok.io,如图5-12所示。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第9张图片

                                                    图 5-12 公共网址

现在,您可以使用图5-12中突出显示的 URL 。也就是说,/getResponse Flask适用于开发环境,但不适用于生产环境。对于生产环境,API 应该托管在 Apache 服务器上。请参考以下网址在 Windows 中的 Apache Server 上部署服务。
https://medium.com/@madumalt/flask-app-deployment-in-windows-apache-server-mod-wsgi-82e1cfeeb2ed

对于 Linux 服务器

先决条件:需要在您的系统上安装 Python 3.6.x 和 Pip。

创建 REST API

1. 安装 Flask-RESTful

如图5-13所示,在Linux Shell上运行以下命令进行安装。
$ pip install flask-restful

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第10张图片

                                                         图 5-13 安装flask-restful

这将安装包及其依赖项。

2 . 构建 REST API

创建一个QuestionAnswering.py文件,其中包含您从 GitHub 下载的问答系统代码。

3. 部署 Flask REST API

使用Flask部署REST API服务,在Linux Shell上运行如下命令,如图5-14所示。
$ python QuestionAnswering.py

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第11张图片

                                                         图 5-14 服务部署

4. REST API 的响应

现在该服务已托管在 URL http://127.0.0.1:5000/getResponse上。因为我们希望问答系统的功能是公开可用的,所以我们使用 ngrok 生成一个公共 URL 对应于我们之前配置的本地 URL。

让我们看看使用 ngrok 生成公共 URL 的步骤。
1. 要公开本地 HTTPS 服务器,请从https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip下载适用于 Linux 服务器的 ngrok 。
 
2. 仅当在 https://ngrok.com/signup 注册后从 https://dashboard.ngrok.com 下载身份验证令牌时,公共URL才可用。
 
3. 必须将 auth 令牌指定给 ngrok,以便客户端绑定到此帐户。ngrok 将 auth 令牌保存在~/.ngrok2/ngrok.yml中,因此无需重复此步骤。
 
4. 解压下载的ngrok文件,如图5-15所示,在终端运行如下命令。
 

                                                图 5-15  解压 ngrok
$ unzip /path/to/ngrok.zip

5.从用户帐户复制身份验证令牌并添加到命令中。在 ngrok 终端提示符下运行此命令,如图5-16所示。

“ngrok authtoken

 
                                                                图 5-16  ngrok 配置
6. 在上一步之后,身份验证令牌将保存到配置文件中。
7. ngrok 是一个命令行应用程序,因此在此终端提示符下键入ngrok http https://:以公开 HTTPS URL。这里的IP和端口设置对应问答API主机和API所在的端口,如图5-17所示。
 

                                                 图 5-17 生成公共 URL

8. 命令执行后,终端会显示本地服务器URL对应的公共URL https://44e2f215.ngrok.io如图5-18所示。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第12张图片

                                                         图 5-18 公共网址

有关详细信息,请参阅Overview | ngrok documentation上的 ngrok 文档。

现在,您可以使用图5-18中突出显示的 URL 。也就是说,/getResponse Flask适用于开发环境,但不适用于生产环境。对于生产环境,API 应该托管在 Apache 服务器上。有关在 Linux 中的 Apache 服务器上部署服务的指南,请参阅以下 URL。

Minimal Apache configuration for deploying a flask app (Ubuntu 18.04) | Codementor

按照接下来给出的步骤将问答系统的功能作为 REST API 发布。
1. 创建一个名为QuestionAnsweringAPI.py的文件。
 
2. 复制以下代码并将其粘贴到该文件中,然后保存。
 
from flask import Flask, request
import json
from QuestionAnsweringSystem.QuestionAnswer import get_answer_using_bert
app=Flask(__name__)
@app.route ("/questionAnswering", methods=['POST'])
def questionAnswering():
    try:
        json_data = request.get_json(force=True)
       query = json_data['query']
       context_list = json_data['context_list']
       result = []
       for val in context_list:
            context = val['context']
            context = context.replace("\n"," ")
            answer_json_final = dict()
            answer = get_answer_using_bert(context, query)
            answer_json_final['answer'] = answer
            answer_json_final['id'] = val['id']
            answer_json_final['question'] = query
            result.append(answer_json_final)
           result={'results':result}
        result = json.dumps(result)
        return result
    except Exception as e:
        return {"Error": str(e)}
if __name__ == "__main__" :
    app.run(port="5000")
3. 该代码处理传递给 API 的输入,调用函数get_answer_using_bert,并将来自该函数的响应作为 API 响应发送。
 
4. 打开命令提示符并运行以下命令。

Python QuestionAnsweringAPI.py

这将在http://127.0.0.1:5000/上启动一个服务,如图5-19所示。

 

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第13张图片

                                                     图 5-19  服务部署。
5. 现在要测试 Rest API,我们将使用 Postman。这是一个用于测试 API URL 的 REST API 客户端。我们可以测试任何复杂的 HTTP/s 请求,也可以读取它们的响应。首先,转到Download Postman | Get Started for Free下载 Postman 工具并将其安装到您的系统上。
 
6. 安装后,测试以下 URL 和发送到问答 API 端的示例请求 JSON 以及将作为响应从 API 接收的响应 JSON,如图5-20所示。
 

网址: http: //127.0.0.1 :5000/questionAnswering

问答系统示例输入请求JSON:
{
    "query": "Where was the Football league founded?",
    "context_list": [
        {
            "id": 1,
            "context": "In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world"
        }
    ]
}
问答系统示例输出响应JSON:
{
    "results": [
        {
            "answer": "england",
            "id": 1,
            "question": "Where was the Football leagure founded?"
        }
    ]
}
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第14张图片
                                                        图 5-20  调用问答API
s

可以从 GitHub 下载此练习的代码库,网址为https://github.com/bertbook/Python_code/tree/master/Chapter5/QuestionAnsweringSystem。

开放域问答系统

ODQA 系统旨在从维基百科文章中找到任何问题的准确答案。因此,对于一个问题,该系统将提供相关的答案。ODQA 系统的默认实现处理一批查询作为输入并返回答案。

模型架构

DeepPavlov ODQA 系统的架构由两部分组成:排序器和阅读器。为了找到任何问题的答案,排序器首先从文档集合中检索相关文章列表,然后读者扫描它们以确定答案。

Ranker组件基于 Facebook Research 提出的 DrQA 架构。具体来说,DrQA 方法使用 unigram-bigram 哈希和 TF-IDF 算法根据问题有效地返回相关文章的子集。阅读器组件基于微软亚洲研究院提出并由周文轩实现的R-NET 。R -NET 架构是一种端到端的神经网络模型,旨在根据给定的文档回答问题。R-NET 首先通过基于门控注意力的循环网络匹配问题和文档以获得问题感知文档表示。然后,自匹配注意机制通过将文档与自身进行匹配来改进表示,从而有效地对整个文档中的信息进行编码。最后,指针网络定位文章中答案的开始和结束索引。图5-21显示了 DeepPavlov ODQA 系统的逻辑流程。

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第15张图片

图 5-21

基于DeepPavlov的ODQA系统架构

为了将此模型用于 ODQA 系统,我们使用了 Python 中的 deeppavlov 库。请注意,ODQA 系统使用维基百科文章或文档的语料库。按照以下步骤配置和使用 ODQA 系统。
1. 新建一个Jupyter notebook,运行如下命令安装deeppavlov库,如图5-22所示。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第16张图片
                                        图 5-22  安装 deeppavlov 库
pip install deeppavlov

2.运行以下命令安装所有需要的模型、词汇等,在英语维基百科语料库上训练,如图5-23所示。

! python -m deeppavlov install en_odqa_infer_wiki
笔记

请使用 '!' 如果您使用的是 Colab Notebook,请在安装命令前添加符号,如刚才所示。

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第17张图片

                                         图 5-23 为 deeppavlov安装所需的包

3. 执行此实现所需的必要导入,如此处所示。
 
from deeppavlov import configs
from deeppavlov.core.commands.infer import build_model
4.然后我们将使用 deeppavlov 库的build_model类获得一个 ODQA 模型。它需要两个参数:
  • 配置 文件路径:定义配置文件的名称,其中包含要使用的相关 NLP 模型的详细信息。对于这种情况,我们将使用en_odqa_infer_wiki。此名称暗示来自维基百科的 ODQA 模型。

  • download 如果需要下载模型,则为True ,否则为False。

 
odqa = build_model(configs.odqa.en_odqa_infer_wiki, download = True)

5.加载 ODQA 模型后,您可以通过提供诸如“谁是 Virat Kohli?”之类的问题来测试该模型。如此处所示。

questions = ["Where did guinea pigs originate?", "Who is virat kohli?"]
answers = odqa(questions)
The output of this code will be the answer to questions asked from Wikipedia documents. Here is the complete code for the ODQA system.
from deeppavlov import configs
from deeppavlov.core.commands.infer import build_model
def odqa_deeppavlov(questions):
    odqa = build_model(configs.odqa.en_odqa_infer_wiki, download = True)
    results = odqa(questions)
    return results
if __name__ == "__main__" :
       questions = ["Where did guinea pigs originate?", "Who is virat kohli?"]
answers = odqa_deeppavlov(questions)
print(answers)
这是输出:
['Andes of South America',  'Indian international cricketer who currently captains the India national team']

现在,我们已经了解了如何将 ODQA 系统用于研究或开发目的。接下来,考虑这样一个场景,您需要部署此功能以供某些网站或对话系统使用,以便为正在寻找其查询答案的最终用户提供服务。在这种情况下,您需要将 ODQA 系统的功能发布或公开为 REST API。现在,按照以下步骤将问答系统的功能作为REST API发布。

1. 创建一个名为OpenDomainQuestionAnsweringAPI的文件。
 
2. 复制以下代码并将其粘贴到该文件中,然后保存。
 
from flask import Flask, request
import json
from OpenDomainQuestionAnsweringSystem.OpenDomainQA import odqa_deeppavlov
app=Flask(__name__)
@route ("/opendomainquestionAnswering", methods=['POST'])
def opendomainquestionAnswering():
    try:
        json_data = request.get_json(force=True)
        questions = json_data['questions']
        answers_list = odqa_deeppavlov(questions)
        index = 0
        result = []
        for answer in answers_list:
            qa_dict = dict()
            qa_dict['answer']=answer
            qa_dict['question']=questions[index]
            index = index+1
            result.append(qa_dict)
        results = {'results':result}
        results = json.dumps(results)
        return results
    except Exception as e:
        return {"Error": str(e)}
if __name__ == "__main__" :
    app.run(debug=True,port="5000")
3. 此代码处理传递给 API 的输入,调用函数odqa_deeppavlov,并从该函数发送响应作为 API 响应。
 
4. 打开命令提示符并运行以下命令。
Python OpenDomainQuestionAnsweringAPI.py

这将在http://127.0.0.1:5000/上启动一个服务,如图5-24所示。

 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第18张图片

                                                         图 5-24 服务部署

5. 现在,要测试这个 API,可以使用 Postman。请参考以下 URL 和提供给问答 API 的示例请求 JSON 以及将作为响应从 API 接收的响应 JSON,如图5-25所示。
 

网址: http: //127.0.0.1 :5000/opendomainquestionAnswering

ODQA系统示例输入请求JSON:
{
    "questions": [
       {
            "question": "Where did guinea pigs originate?"
        },
{
             "question": "Who is virat kohli?"
        }
    ]
}
ODQA 系统示例输出响应 JSON:
{
    "results": [
        {
            "answer": "Andes of South America",
            "question": "Where did guinea pigs originate?"
        },
       {
            "answer": "Indian international cricketer who currently captains the India national team",
            "question": "Who is virat kohli?"
        }
    ]
}

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第19张图片

                                        图 5-25  调用 ODQA 系统API

可以从 GitHub 下载此练习的代码库,网址为https://github.com/bertbook/Python_code/tree/master/Chapter5/OpenDomainQuestionAnsweringSystem。

DeepPavlov QA系统

在上一节 中,我们讨论了如何使用经过维基百科文档训练的 ODQA 系统来回答事实性和非事实性问题。接下来,我们看看如何使用 DeepPavlov 来实现基于上下文的问答系统,其中问题的答案存在于上下文中。例如,请考虑维基百科文章中的以下上下文和问题。

Context: In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world.

Question: In which year was the Football League founded?

Answer: 1888

请按照以下步骤实施基于上下文的问答系统。
1. 创建一个新的 Jupyter 笔记本并运行以下命令来安装 deeppavlov 库。
 
pip install deeppavlov

2.运行以下命令以安装所有必需的模型、词汇表等。

 
! python -m deeppavlov install squad_bert

笔记

请使用 '!' 如果您使用的是 Colab Notebook,请在安装命令前添加符号,如刚才所示。

3. 如此处所示导入所需的包。
 
from deeppavlov import configs, build_model

4.然后我们将使用 deeppavlov 库的build_model类获得 BERT 模型。它需要两个参数:

  • 配置 文件路径:定义配置文件的名称,其中包含要使用的相关 NLP 模型的详细信息。对于这种情况,我们将使用squad_bert。此配置包含已在 SQuAD 数据集上训练的特定 BERT 模型的所有详细信息。

  • 下载:如果需要下载模型,则为True ,否则为False。

odqa = build_model(configs.squad.squad_bert, download = True)

5.加载 BERT 模型后,您可以通过提供问题以及提取答案的上下文来测试它,如此处所示。

context = " In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world."
question = "In which year the Football league was founded?"
answers = qa_ deeppavlov (context, question)
6. 此代码片段的输出将是从所问问题的上下文中提取的答案。
 
这是完整的 Python 代码,显示了上下文 CDQA 系统的实现。
from deeppavlov import build_model, configs
def qa_deeppavlov(question, context):
    model = build_model(configs.squad.squad_bert, download=True)
    result = model([context], [question])
    return result [0]
if __name__=="__main__":
context = "In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world."
question = "In which year the Football league was founded?"
answers = qa_deeppavlov (context, question)
             print(answers)
这是输出:
1888

现在,我们已经了解了如何将基于上下文的问答系统(BERT 的另一种变体)用于研究或开发目的。接下来,考虑这样一个场景,您需要部署此功能以供某些网站或对话系统使用,以便为正在寻找其查询答案的最终用户提供服务。在这种情况下,您需要将 ODQA 系统的功能发布或公开为 REST API。按照此处给出的步骤将问答系统的功能作为 REST API 发布。

1. 创建一个名为DeepPavlovQASystemAPI的文件。
 
2. 复制以下代码并粘贴到该文件中,然后保存。
 
from flask import Flask, request
from DeeppavlovQASystem.QA_Deepplavlov import qa_deeppavlov
import json
app=Flask(__name__)
@app.route ("/qaDeepPavlov", methods=['POST'])
def qaDeepPavlov():
    try:
        json_data = request.get_json(force=True)
        query = json_data['query']
        context_list = json_data['context_list']
        result = []
        for val in context_list:
            context = val['context']
            context = context.replace("\n"," ")
            answer_json_final = dict()
            answer = qa_deeppavlov(context, query)
            answer_json_final['answer'] = answer
            answer_json_final['id'] = val['id']
            answer_json_final['question'] = query
            result.append(answer_json_final)
        result = json.dumps(result)
        return result
    except Exception as e:
        return {"Error": str(e)}
3. 此代码处理传递给 API 的输入,调用函数qa_deeppavlov,并将此函数的响应作为 API 响应发送。
 
4. 打开命令提示符并运行以下命令。
 
Python DeepPavlovQASystemAPI.py
这将在http://127.0.0.1:5000/上启动一个服务,如图5-26所示。
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第20张图片
                                                        图 5-26  服务部署
5. 现在,要测试这个 API,可以使用 Postman。请参考以下提供给 DeepPavlov QA API 端的 URL 和示例请求 JSON,以及将作为来自 API 的响应接收的响应 JSON,如图5-27所示。

  

网址: http: //127.0.0.1 :5000/qaDeepPavlov

DeepPavlov QA 系统示例输入请求 JSON:
{
    "query": "In which year the Football league was founded?",
    "context_list": [
        {
            "id": 1,
            "context": "In 1888, The Football League was founded in England, becoming the first of many professional football competitions. During the 20th century, several of the various kinds of football grew to become some of the most popular team sports in the world"
        }
    ]
}
DeepPavlov QA 系统示例输出响应 JSON:
{
    "results": [
        {
            "answer": "1888",
            "id": 1,
            "question": "In which year the Football league was founded?"
        }
    ]
}

【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统_第21张图片

                                        图 5-27  调用 DeepPavlov QA 系统 API

可以从 GitHub 下载此练习的代码库,网址为https://github.com/bertbook/Python_code/tree/master/Chapter5/DeeppavlovQASystem。

结论

本章介绍了问答系统,这是 BERT 模型的重要应用之一。我们了解了 CDQA 和 ODQA 等问答系统的类型。我们使用 BERT 构建了一个问答系统,并将其部署为 API 以供第三方系统使用。在下一章中,我们将了解 BERT 如何用于其他 NLP 任务。

你可能感兴趣的:(使用,BERT,的问答系统,bert,人工智能,深度学习)