package edu.stanford.nlp.sempre.tables.alter; import java.io.*; import java.util.*; import edu.stanford.nlp.sempre.DescriptionValue; import edu.stanford.nlp.sempre.ListValue; import edu.stanford.nlp.sempre.TargetValuePreprocessor; import edu.stanford.nlp.sempre.Value; import edu.stanford.nlp.sempre.tables.StringNormalizationUtils; import fig.basic.LogInfo; import fig.basic.MapUtils; /** * Read aggregated Turked results from TSV file. * * File format: * - HIT ID * - Example ID * - Alter table index * - Flag (A2/A3 = agreed on an answer, B2/B3 = agreed on "no answer", X = disagreed) * - Agreed answer (blank for B or X) * - Individual answers; come in pairs of (worker id, answer) -- not used here * * @author ppasupat */ public class AggregatedTurkData { /** * Map from Example ID -> altered table index -> agreed response */ Map<String, Map<Integer, Value>> data = new HashMap<>(); /** * List of all tables used regardless of agreement */ Map<String, List<Integer>> allTurkedTables = new HashMap<>(); public AggregatedTurkData() { } public AggregatedTurkData(String filename) { addFromFile(filename); } public AggregatedTurkData addFromFile(String filename) { LogInfo.begin_track("Reading Turked data from %s", filename); try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { int count = 0; String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); String exampleId = tokens[1]; int alteredTableIndex = Integer.parseInt(tokens[2]); MapUtils.addToList(allTurkedTables, exampleId, alteredTableIndex); char flagCode = tokens[3].charAt(0); if (flagCode != 'A' && flagCode != 'B') continue; String response = tokens[4]; Value canonicalized = toValue(response); MapUtils.set(data, exampleId, alteredTableIndex, canonicalized); count++; } LogInfo.logs("Read %d records", count); } catch (IOException e) { throw new RuntimeException(e); } LogInfo.end_track(); return this; } public Map<Integer, Value> get(String exampleId) { return data.get(exampleId); } public Value get(String exampleId, int alteredTableIndex) { return MapUtils.get(data, exampleId, alteredTableIndex, null); } /** * Get all Turked tables regardless of whether the answer is agreed upon. */ public List<Integer> getAllTurkedTables(String exampleId) { return allTurkedTables.get(exampleId); } /** * Return canonicalized Value. */ private Value toValue(String response) { if (response.isEmpty()) { // TODO: Distinguish empty list from ERROR return ValueCanonicalizer.ERROR; } List<Value> values = new ArrayList<>(); for (String x : response.split("\\|")) values.add(new DescriptionValue(StringNormalizationUtils.unescapeTSV(x))); return TargetValuePreprocessor.getSingleton().preprocess(new ListValue(values)); } }