我们下载的是train-v1.1.json.
用json打开
data=json.load(open(train-v1.1.json))
data是一个dict,长度是2,key是"data"和"version".
数据全在data[“data”]中
data[“data”]是一个长度为442的list,每一个元素是一个dict.
我们来看第一个元素:data[“data”][0]
这是一个dict,key是"title"和"paragraphs".
也就是说data[“data”]中每一个元素是一篇文章,用字典表示,文章的标题对应的key是title,文章中的所有段落用"paragraphs"表示.
paragraphs=data[“data”][0][“paragraphs”]
paragraphs是一个list,每一个元素代表这篇文章的一个段落,用一个dict表示,key是"context"和"qas".显然当前段落的文本就是"context"对应的字符串,而"qas"则是针对这个段落文本提出的问题和正确的答案。
question_and_answers=data[“data”][0][“paragraphs”][0][“qas”]
question_and_answers是整个数据集中所有段落的第一个段落的问题和答案。是一个list。每一个元素是一个dict。
如图,每一个元素表示的就是答案,问题,以及问题编号。答案中给出了答案的起始位置和答案的文本字符串。
下面用ppt画了一个草图
我们要的数据包括context,这代表一个段落,而对于这个段落会有几个问题和对应的答案,所以还需要question和text以及answer start,text就是question的答案。这个数据集好像一个question只有一个答案。
下面的数据处理代码希望帮助您理解
data=json.load(open("train-v1.1.json"))["data"]
result=[]
for each_article in data:
assert type(each_article)==dict and list(each_article.keys())==["title","paragraphs"]
paragraphs=each_article["paragraphs"]
assert type(paragraphs)==list
for each_paragraph in paragraphs:
assert type(each_paragraph)==dict and list(each_paragraph.keys())==["context","qas"]
context=each_paragraph["context"]
#tokens_list=word_tokenize(context)
qas=each_paragraph["qas"]
assert type(qas)==list
for each_qas in qas:
assert type(each_qas)==dict and list(each_qas.keys())==["answers","question","id"]
qa_id=each_qas["id"]
question=each_qas["question"]
answers=each_qas["answers"]
assert type(answers)==list
for each_answer in answers:
assert type(each_answer)==dict and list(each_answer.keys())==["answer_start","text"]
answer=each_answer["text"]
s_idx=each_answer["answer_start"]
e_idx=s_idx+len(answer)
result.append({"id":qa_id,"context":context,"question":question,
"answer":answer,"s_idx":s_idx,"e_idx":e_idx})