在这篇文章中,我们将探讨 Question Answering(QA),即问答任务。这种任务有很多不同的形式,但我们将重点放在抽取式问答上。抽取式问答涉及根据给定的文档,提出问题并在文档中找到答案对应的文本片段。
我们将基于 SQuAD 数据集对 BERT 模型进行微调。SQuAD 数据集包含 Wikipedia 文章的相关问题,这些问题是由众包工人提出的。
1. 加载数据
在学术界,SQuAD 数据集是用于评估抽取式问答的基准数据集,因此我们在此使用该数据集。更具挑战性的 SQuAD v2 基准数据集还包括没有答案的问题。只要你有一个包含上下文(context)、问题(question)和答案(answers)列的数据集,你就可以按照本节中的步骤进行微调。
SQuAD 数据集
像往常一样,我们可以通过 load_dataset()
下载并缓存数据集:
import os
os.environ['http_proxy'] = ''
os.environ['https_proxy'] = ''
from datasets import load_dataset
raw_datasets = load_dataset("squad")
让我们看一下该数据集中的字段:
print("Context: ", raw_datasets["train"][0]["context"])
print("Question: ", raw_datasets["train"][0]["question"])
print("Answer: ", raw_datasets["train"][0]["answers"])
这里我们可以看到 context
(上下文)和 question
(问题)的字段,而 answers
字段稍微复杂一些,因为它包含两个列表:一个是答案文本,另一个是答案在上下文中的起始位置。
对于训练数据集,每个问题通常只有一个正确答案:
raw_datasets["train"].filter(lambda x: len(x["answers"]["text"]) != 1)
在评估数据集中,每个问题可能