# -*- coding: utf-8 -*- from . import file_utils import re # Key for wikipedia eval is question-id. Key for web eval is the (question_id, filename) tuple def get_key_to_ground_truth(data): if data['Domain'] == 'Wikipedia': return {datum['QuestionId']: datum['Answer'] for datum in data['Data']} else: return get_qd_to_answer(data) def get_question_doc_string(qid, doc_name): return '{}--{}'.format(qid, doc_name) def get_qd_to_answer(data): key_to_answer = {} for datum in data['Data']: for page in datum.get('EntityPages', []) + datum.get('SearchResults', []): qd_tuple = get_question_doc_string(datum['QuestionId'], page['Filename']) key_to_answer[qd_tuple] = datum['Answer'] return key_to_answer def read_clean_part(datum): for key in ['EntityPages', 'SearchResults']: new_page_list = [] for page in datum.get(key, []): if page['DocPartOfVerifiedEval']: new_page_list.append(page) datum[key] = new_page_list assert len(datum['EntityPages']) + len(datum['SearchResults']) > 0 return datum def read_triviaqa_data(qajson): data = file_utils.read_json(qajson) # read only documents and questions that are a part of clean data set if data['VerifiedEval']: clean_data = [] for datum in data['Data']: if datum['QuestionPartOfVerifiedEval']: if data['Domain'] == 'Web': datum = read_clean_part(datum) clean_data.append(datum) data['Data'] = clean_data return data def answer_index_in_document(answer, document): answer_list = answer['NormalizedAliases'] answers_in_doc = [] for answer_string_in_doc in answer_list: indices = [m.start() for m in re.finditer(answer_string_in_doc, document, flags=re.IGNORECASE)] for index in indices: answers_in_doc.append({ 'text': answer_string_in_doc, 'answer_start': index }) return answers_in_doc