大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
个人主页-Sonhhxg_柒的博客_CSDN博客
欢迎各位→点赞 + 收藏⭐️ + 留言
系列专栏 - 机器学习【ML】 自然语言处理【NLP】 深度学习【DL】
foreword
✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。
如果你对这个系列感兴趣的话,可以关注订阅哟
文章目录
质量保证系统的类型
使用 BERT 设计问答系统
对于 Windows 服务器
对于 Linux 服务器
开放域问答系统
DeepPavlov QA系统
结论
我们被以文档、图像、博客、网站等形式存在的大量信息所包围。在大多数情况下,我们总是寻找直接的答案,而不是阅读整个冗长的文档。问答系统通常用于此目的。这些系统扫描文档语料库并为您提供相关的答案或段落。它是信息检索和 NLP 领域计算机科学学科的一部分,专注于构建系统,自动提取人类或机器以自然语言提出的问题的答案。
最早的两个问答系统BASEBALL和LUNAR,因其核心数据库或信息系统而大受欢迎。BASEBALL 旨在回答一年周期内的美国联盟棒球问题。LUNAR 旨在根据从阿波罗登月任务收集的数据回答与月球岩石地质分析相关的问题。此类早期系统集中于封闭域,其中每个查询都必须与特定域有关,而答案文本必须仅来自受限的词汇表。
SQuAD :斯坦福问答数据集 (SQuAD) 是我们在第4章中介绍的阅读理解数据集。
NewsQA :创建此数据集是为了帮助研究社区构建能够回答需要人类水平理解和推理技能的问题的算法。通过使用来自 DeepMind 问答数据集的 CNN 文章,作者准备了一个包含 120,000 个问答对的众包机器阅读理解数据集。
WikiQA :这个公开可用的数据集包含成对的问题和答案。它已被收集和注释用于开放域问答系统的研究。此外,WikiQA 数据集还包括没有正确答案的问题,使研究人员能够处理负面案例,同时避免选择不相关的答案。
封闭域 :在封闭域系统中,问题属于特定域。他们只能回答来自单个域的问题。例如,医疗保健领域的问答系统无法回答任何与 IT 相关的问题。这些系统通过使用在特定领域数据集上训练的模型来利用特定领域的知识。CDQA 套件可用于构建此类闭域 QA 系统。
开放域 :在开放域系统中,问题可以来自任何领域,例如医疗保健、IT、体育等。这些系统旨在回答来自任何领域的问题。这些系统实际上模仿人类智能来回答问题。此类系统的一个示例是 DeepPavlov ODQA 系统,它是 MIPT 开发的一种 ODQA,它使用来自维基百科的大量文章数据集作为其知识来源。
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 来实现事实型问答系统。对于本书,我们使用的是在 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 将如何处理输入的问题和段落。接下来,我们将看到在 Python 中使用 BERT 实现问答系统。
pip install notebook
3.打开命令提示符并运行以下命令以运行 Jupyter Notebook。
jupyter notebook
笔记本将在您的默认浏览器中打开,主机地址为 localhost,端口号为 8888,以及一个唯一的令牌 ID。现在,您可以开始编写后续步骤中提到的代码,如图5-4所示。
pip 安装变压器
图 5-6 安装transformers库
from transformers import BertForQuestionAnswering
from transformers import BertTokenizer
import torch
# 为问答加载预训练模型
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。
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)
#查找第一次出现的[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(' ##','')
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))
england
现在,我们已经了解了如何将基于 BERT 的问答系统用于研究目的。接下来,考虑这样一个场景,您需要部署此功能以供某些网站或对话系统使用,以便为正在寻找其查询答案的最终用户提供服务。在这种情况下,您需要将 QA 系统的功能发布或公开为 REST API。现在,按照以下步骤将 QA 系统的功能发布为 REST API。
让我们完成为 Windows 和 Linux 服务器上的问答系统设置 REST API 和该 API 的公共 URL 的步骤(如果您在专用网络内,请使用 ngrok 生成公共 URL)。
先决条件:需要在您的系统上安装 Python 3.6.x 和 Pip。
创建 REST API
1. 安装 Flask-RESTful
Flask-RESTful 是用于构建 REST API 的微框架 Flask 的扩展。
2 . 构建 REST API
RESTful API 使用 HTTP 请求来获取和发布数据。
首先创建一个QuestionAnswering.py文件,其中包含您从 GitHub 下载的问题回答代码。
3. 部署 Flask REST API
4 . 来自 REST API 的响应
现在该服务已托管在 URL http://127.0.0.1:5000/getResponse上。我们希望问答系统的功能是公开的。因此,我们将使用 ngrok 生成一个与我们之前配置的本地 URL 相对应的公共 URL。
7.ngrok 是一个命令行应用程序,因此在此终端提示符下键入ngrok http https://
https://medium.com/@madumalt/flask-app-deployment-in-windows-apache-server-mod-wsgi-82e1cfeeb2ed
先决条件:需要在您的系统上安装 Python 3.6.x 和 Pip。
创建 REST API
1. 安装 Flask-RESTful
这将安装包及其依赖项。
2 . 构建 REST API
创建一个QuestionAnswering.py文件,其中包含您从 GitHub 下载的问答系统代码。
3. 部署 Flask REST API
4. REST API 的响应
现在该服务已托管在 URL http://127.0.0.1:5000/getResponse上。因为我们希望问答系统的功能是公开可用的,所以我们使用 ngrok 生成一个公共 URL 对应于我们之前配置的本地 URL。
$ unzip /path/to/ngrok.zip
5.从用户帐户复制身份验证令牌并添加到命令中。在 ngrok 终端提示符下运行此命令,如图5-16所示。
图 5-17 生成公共 URL
有关详细信息,请参阅Overview | ngrok documentation上的 ngrok 文档。
现在,您可以使用图5-18中突出显示的 URL 。也就是说,
Minimal Apache configuration for deploying a flask app (Ubuntu 18.04) | Codementor
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")
Python QuestionAnsweringAPI.py
这将在http://127.0.0.1:5000/上启动一个服务,如图5-19所示。
网址: http: //127.0.0.1 :5000/questionAnswering
{
"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"
}
]
}
{
"results": [
{
"answer": "england",
"id": 1,
"question": "Where was the Football leagure founded?"
}
]
}
可以从 GitHub 下载此练习的代码库,网址为https://github.com/bertbook/Python_code/tree/master/Chapter5/QuestionAnsweringSystem。
ODQA 系统旨在从维基百科文章中找到任何问题的准确答案。因此,对于一个问题,该系统将提供相关的答案。ODQA 系统的默认实现处理一批查询作为输入并返回答案。
模型架构
DeepPavlov ODQA 系统的架构由两部分组成:排序器和阅读器。为了找到任何问题的答案,排序器首先从文档集合中检索相关文章列表,然后读者扫描它们以确定答案。
基于DeepPavlov的ODQA系统架构
pip install deeppavlov
2.运行以下命令安装所有需要的模型、词汇等,在英语维基百科语料库上训练,如图5-23所示。
! python -m deeppavlov install en_odqa_infer_wiki
笔记请使用 '!' 如果您使用的是 Colab Notebook,请在安装命令前添加符号,如刚才所示。
from deeppavlov import configs
from deeppavlov.core.commands.infer import build_model
配置 文件路径:定义配置文件的名称,其中包含要使用的相关 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发布。
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")
Python OpenDomainQuestionAnsweringAPI.py
这将在http://127.0.0.1:5000/上启动一个服务,如图5-24所示。
图 5-24 服务部署
网址: http: //127.0.0.1 :5000/opendomainquestionAnswering
{
"questions": [
{
"question": "Where did guinea pigs originate?"
},
{
"question": "Who is virat kohli?"
}
]
}
{
"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?"
}
]
}
可以从 GitHub 下载此练习的代码库,网址为https://github.com/bertbook/Python_code/tree/master/Chapter5/OpenDomainQuestionAnsweringSystem。
在上一节 中,我们讨论了如何使用经过维基百科文档训练的 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
pip install deeppavlov
2.运行以下命令以安装所有必需的模型、词汇表等。
! python -m deeppavlov install squad_bert
笔记
请使用 '!' 如果您使用的是 Colab Notebook,请在安装命令前添加符号,如刚才所示。
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)
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 发布。
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)}
网址: http: //127.0.0.1 :5000/qaDeepPavlov
{
"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"
}
]
}
{
"results": [
{
"answer": "1888",
"id": 1,
"question": "In which year the Football league was founded?"
}
]
}
可以从 GitHub 下载此练习的代码库,网址为https://github.com/bertbook/Python_code/tree/master/Chapter5/DeeppavlovQASystem。
本章介绍了问答系统,这是 BERT 模型的重要应用之一。我们了解了 CDQA 和 ODQA 等问答系统的类型。我们使用 BERT 构建了一个问答系统,并将其部署为 API 以供第三方系统使用。在下一章中,我们将了解 BERT 如何用于其他 NLP 任务。