Files
2026-07-13 13:24:13 +08:00

148 lines
5.7 KiB
Python

import csv
import json
import argparse
import os.path as osp
import os
from operator import itemgetter
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("--root_dir", default=None, type=str, required=True,
help="The root directory of the raw WebSRC dataset; The output SQuAD-style json file will also"
"be placed here.")
parser.add_argument("--version", default=None, type=str, required=True,
help="The version of the generating dataset, which will also be the name of the json file.")
parser.add_argument("--suffix", default="", type=str,
help="Other suffix to distinguish different dataset.")
return parser.parse_args()
def convert_csv_to_dict(args):
dir_list = os.walk(args.root_dir)
print('Start Converting')
data, websites, qas, answers = [], [], [], []
last_domain = None
for d, _, fs in dir_list:
for f in fs:
if f != 'dataset.csv':
continue
print('Now converting', d + '/' + f)
raw_data = list(csv.DictReader(open(osp.join(d, f))))
curr_domain = d.split('/')[-2]
if last_domain != curr_domain and last_domain is not None:
domain = {'domain': last_domain, 'websites': websites}
data.append(domain)
websites = []
last_domain = curr_domain
raw_data.sort(key=itemgetter('id'))
last = raw_data[0]
for i in range(len(raw_data)):
current = raw_data[i]
if i != 0:
qa = {'question': last['question'],
'id' : last['id'],
'answers' : answers} # , 'type': last['type']}
qas.append(qa)
answers = []
if last['id'][:-5] != current['id'][:-5]:
website = {'qas': qas, 'page_id': last['id'][2:-5]}
websites.append(website)
qas = []
answer = {'text' : current['answer'],
'element_id' : int(current['element_id']),
'answer_start': int(current['answer_start'])}
answers.append(answer)
last = current
if len(answers) > 0:
qa = {'question': last['question'],
'id' : last['id'],
'answers' : answers} # , 'type' : last['type']}
qas.append(qa)
answers = []
if len(qas) > 0:
website = {'qas': qas, 'page_id': last['id'][2:-5]}
websites.append(website)
qas = []
domain = {'domain': last_domain, 'websites': websites}
data.append(domain)
dataset = {'version': args.version, 'data': data}
print('Converting Finished\n')
return dataset
def dataset_split(args, dataset):
def count(last, curr):
if last is None:
return False
if last != curr:
return False
return True
split = json.load(open(osp.join(args.root_dir, 'dataset_split.json')))
data = dataset['data']
count_website = set()
for domain in data:
for website in domain['websites']:
count_website.add(domain['domain'][0:2] + website['page_id'][0:2])
print('The number of total websites is', len(count_website))
train_list = []
dev_list, test_list = split['dev'], split['test']
for website in count_website:
if website not in dev_list and website not in test_list:
train_list.append(website)
print('The train websites list is', train_list)
print('The test websites list is', test_list)
print('The dev websites list is', dev_list)
train_data, test_data, dev_data = [], [], []
cnt = 0
for domain in data:
train_websites, test_websites, dev_websites = [], [], []
last = None
for website in domain['websites']:
if not count(last, website['page_id'][0:2]):
last = website['page_id'][0:2]
cnt += 1
name = domain['domain'][0:2] + website['page_id'][0:2]
if name in test_list:
test_websites.append(website)
continue
if name in dev_list:
dev_websites.append(website)
continue
if len(train_list) != 0 and name not in train_list:
continue
train_websites.append(website)
if len(train_websites) != 0:
train_data.append({'domain': domain['domain'], 'websites': train_websites})
if len(test_websites) != 0:
test_data.append({'domain': domain['domain'], 'websites': test_websites})
if len(dev_websites) != 0:
dev_data.append({'domain': domain['domain'], 'websites': dev_websites})
print('The number of processed websites is', cnt)
train_dataset = {'version': dataset['version'], 'data': train_data}
with open(osp.join(args.root_dir, dataset['version'] + '_train_' + args.suffix + '.json'), 'w') as f:
f.write(json.dumps(train_dataset))
test_dataset = {'version': dataset['version'], 'data': test_data}
with open(osp.join(args.root_dir, dataset['version'] + '_test_' + args.suffix + '.json'), 'w') as f:
f.write(json.dumps(test_dataset))
dev_dataset = {'version': dataset['version'], 'data': dev_data}
with open(osp.join(args.root_dir, dataset['version'] + '_dev_' + args.suffix + '.json'), 'w') as f:
f.write(json.dumps(dev_dataset))
return
if __name__ == '__main__':
args = parse_args()
dataset = convert_csv_to_dict(args)
dataset_split(args, dataset)