File size: 2,965 Bytes
b4b0f75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python3
"""Reconstruct decisions from privately held dataset snapshots and a case manifest."""
import argparse,csv,json
from pathlib import Path


def main():
    p=argparse.ArgumentParser();p.add_argument('--snapshots',type=Path,required=True);p.add_argument('--manifest',type=Path,required=True)
    p.add_argument('--sources',type=Path,required=True);p.add_argument('--output',type=Path,required=True);a=p.parse_args()
    manifest=json.loads(a.manifest.read_text());sources={r['domain']:r for r in json.loads(a.sources.read_text())};cache={}
    with a.output.open('x') as out:
        for item in manifest['case_identifiers']['public']:
            domain=item['domain'];index=int(item['id'].rsplit('-',1)[1])
            if domain=='banking20':
                if domain not in cache:
                    with (a.snapshots/'banking-test.csv').open() as f:cache[domain]=list(csv.DictReader(f))
                r=cache[domain][index];labels=sources[domain]['classes']
                state=r['text'];question='Which banking support intent best matches the customer message?'
                options=[[x,x.replace('_',' ')] for x in labels];gold=r['category']
            else:
                if domain not in cache:
                    data=json.loads((a.snapshots/(domain+'-rows.json')).read_text())
                    cache[domain]=({x['row_idx']:x['row'] for x in data['rows']},next((f['type']['names'] for f in data['features'] if f['name']=='label'),None))
                rows,names=cache[domain];r=rows[index]
                if domain in ['news','emotion']:
                    state=r['text'];question='Which topic best describes this news item?' if domain=='news' else 'Which emotion is predominantly expressed by the author?'
                    options=[[n,n] for n in names];gold=names[r['label']]
                elif domain=='reading':
                    state=r['passage'];question='Based on the passage, answer yes or no: '+r['question'];options=[['yes','Yes'],['no','No']];gold='yes' if r['answer'] else 'no'
                elif domain=='entailment':
                    state='Premise: '+r['premise']+'\nHypothesis: '+r['hypothesis'];question='Given only the premise, is the hypothesis entailed, contradicted, or neither (neutral)?'
                    options=[['entailment','The premise entails the hypothesis'],['neutral','Neither entailed nor contradicted by the premise'],['contradiction','The premise contradicts the hypothesis']];gold=names[r['label']]
                elif domain=='science':
                    state='Choose the best answer to this science question.';question=r['question'];options=list(map(list,zip(r['choices']['label'],r['choices']['text'])));gold=r['answerKey']
                else:raise ValueError('Unknown domain '+domain)
            out.write(json.dumps(dict(id=item['id'],request=dict(state=state,question=question,options=options),expected=gold))+'\n')


if __name__=='__main__':main()