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

这篇具有很好参考价值的文章主要介绍了【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

 🖍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模型应用:问答系统

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

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

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

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

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

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

                                                                图 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模型应用:问答系统
                                                图 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  用于创建或导入笔记本的Google Colab 界面
5. 要创建新的 Colab notebook,请点击右下角的 New Notebook,如图5-5所示。
 
6.从 Huggingface 安装transformers库。在 Jupyter Notebook 或 Colab Notebook 中运行以下命令。
pip install tansformers
 
7. 成功安装 transformers 库后,您应该能够看到如图5-6所示的输出。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统

                                                         图 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模型应用:问答系统

                                                图 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模型应用:问答系统

                                                         图 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所示。
 

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

                                                        图 5-9 令牌生成
“ngrok authtoken <AUTHTOKEN>”
6. 经过上一步,authtoken被保存到配置文件中,如图5-10所示。
 
【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统
                                                图 5-10 ngrok 配置

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

 

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

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

                                                    图 5-12 公共网址

现在,您可以使用图5-12中突出显示的 URL 。也就是说,<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模型应用:问答系统

                                                         图 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模型应用:问答系统

                                                         图 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所示,在终端运行如下命令。
 

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

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

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

“ngrok authtoken <AUTHTOKEN>”

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

                                                 图 5-17 生成公共 URL

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

                                                         图 5-18 公共网址

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

现在,您可以使用图5-18中突出显示的 URL 。也就是说,<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模型应用:问答系统

                                                     图 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模型应用:问答系统
                                                        图 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模型应用:问答系统

图 5-21

基于DeepPavlov的ODQA系统架构

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

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

! python -m deeppavlov install en_odqa_infer_wiki
笔记

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

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

                                         图 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模型应用:问答系统

                                                         图 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模型应用:问答系统

                                        图 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模型应用:问答系统
                                                        图 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模型应用:问答系统

                                        图 5-27  调用 DeepPavlov QA 系统 API

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

结论

本章介绍了问答系统,这是 BERT 模型的重要应用之一。我们了解了 CDQA 和 ODQA 等问答系统的类型。我们使用 BERT 构建了一个问答系统,并将其部署为 API 以供第三方系统使用。在下一章中,我们将了解 BERT 如何用于其他 NLP 任务。文章来源地址https://www.toymoban.com/news/detail-428955.html

到了这里,关于【使用 BERT 的问答系统】第 5 章 :BERT模型应用:问答系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大模型在百度智能问答、搜索中的应用

    本文主要介绍了智能问答技术在百度搜索中的应用。包括机器问答的发展历程、生成式问答、百度搜索智能问答应用。欢迎大家加入百度搜索团队,共同探索智能问答技术的发展方向,文末有简历投递方式。 01 什么是机器问答 机器问答,就是让计算机软件系统自动回答人类

    2024年02月08日
    浏览(31)
  • 【深度学习应用】基于Bert模型的中文语义相似度匹配算法[离线模式]

    配置文件夹 文件获取方法:  访问官网:https://huggingface.co/bert-base-chinese/tree/main 下载以下文件 

    2024年01月16日
    浏览(41)
  • 基于大语言模型知识问答应用落地实践 – 知识库构建(下)

    上篇介绍了构建知识库的大体流程和一些优化经验细节,但并没有结合一个具体的场景给出更细节的实战经验以及相关的一些 benchmark 等,所以本文将会切入到一个具体场景进行讨论。 目标场景:对于 PubMed 医疗学术数据中的 1w 篇文章进行知识库构建,实现快速的注入和查

    2024年02月10日
    浏览(38)
  • 自然语言处理实战项目25-T5模型和BERT模型的应用场景以及对比研究、问题解答

    大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目25-T5模型和BERT模型的应用场景以及对比研究、问题解答。T5模型和BERT模型是两种常用的自然语言处理模型。T5是一种序列到序列模型,可以处理各种NLP任务,而BERT主要用于预训练语言表示。T5使用了类似于BERT的

    2024年01月17日
    浏览(46)
  • 大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明

    大家好,我是微学AI,今天给大家讲一下大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明。在大规模语料库上预先训练的BERT等神经语言表示模型可以很好地从纯文本中捕获丰富的语义模式,并通过微调的方式一致地提高各种NLP任务的性能。

    2024年02月05日
    浏览(37)
  • 如何用大语言模型构建一个知识问答系统

    打造  特定领域知识(Domain-specific Knowledge)   问答  系统,具体需求有: 通过自然语言问答的形式,和用户交互,同时支持中文和英文。 理解用户不同形式的问题,找到与之匹配的答案。可以对答案进行二次处理,比如将关联的多个知识点进行去重、汇总等。 支持上下文。有

    2024年02月09日
    浏览(34)
  • 【大模型应用开发教程】04_大模型开发整体流程 & 基于个人知识库的问答助手 项目流程架构解析

    项目仓库地址 项目学习地址 定义 将 开发以LLM为功能核心 ,通过LLM的强大理解能力和生成能力,结合特殊的数据或业务逻辑来提供独特功能的应用。 核心点 通过调用 API 或开源模型来实现核心的理解与生成 通过 Prompt Enginnering 来实现大语言模型的控制 在大模型开发中,我们

    2024年02月05日
    浏览(38)
  • 使用Bert预训练模型处理序列推荐任务

    最近的工作有涉及该任务,整理一下思路以及代码细节。 总体来说思路就是首先用预训练的bert模型,在训练集的序列上进行CLS任务。对序列内容(这里默认是token id的sequence)以0.3左右的概率进行随机mask,然后将相应sequence的attention mask(原来决定padding index)和label(也就是

    2024年02月14日
    浏览(28)
  • 大模型从入门到应用——LangChain:链(Chains)-[链与索引:图问答(Graph QA)和带来源的问答(Q&A with Sources)]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月11日
    浏览(35)
  • 【大模型】自动化问答生成:使用GPT-3.5将文档转化为问答对

    当我们需要将大段文档转化为问答对时,OpenAI的GPT-3.5模型提供了一个强大的工具。这个教程将向您展示如何编写一个Python脚本,利用GPT-3.5的能力,将文档转化为一问一答的问答对。这个流程几乎无需人工介入,能够自动获取问题并生成答案。我们将使用GPT-3.5-16k,以便处理大

    2024年02月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包