package edu.stanford.nlp.sempre.tables.alter; import java.io.*; import java.util.*; import edu.stanford.nlp.sempre.Value; import edu.stanford.nlp.sempre.Values; /** * Store information about equivalent classes inferred by Turked data for a single Example. * * Fields: * - Example ID * - Number of derivations from dump file * - Number of equivalent classes * - All tables that have been sent to Turk * - All tables with agreed answers in Turked data * - Original table verification * - Target value from dataset (as Value) * - Target value from Turk (as Value, or null if disagreed) * - Whether the target values match * - Matching equivalent classes * - Number of derivations matched * - Number of classes matched * - Tables that can be Turked to distinguish the remaining classes * * @author ppasupat */ public class TurkEquivalentClassInfo { public static final String[] FIELD_NAMES = new String[] { "id", "numDerivs", "numClasses", "allTurkedTables", "agreedTurkedTables", "origTableTarget", "origTableTurkedTarget", "origTableFlag", "numDerivsMatched", "numClassesMatched" }; public static String getHeader() { return String.join("\t", FIELD_NAMES); } public static void dumpHeader(PrintWriter writer) { writer.println(getHeader()); writer.flush(); } public String id; public List<Integer> allTurkedTables, agreedTurkedTables; public Value origTableTarget, origTableTurkedTarget; public String origTableFlag; public int numDerivs, numClasses, numDerivsMatched, numClassesMatched; @Override public String toString() { String[] fields = new String[FIELD_NAMES.length]; fields[0] = id; fields[1] = "" + numDerivs; fields[2] = "" + numClasses; fields[3] = "" + allTurkedTables; fields[4] = "" + agreedTurkedTables; fields[5] = origTableTarget == null ? "null" : origTableTarget.toString(); fields[6] = origTableTurkedTarget == null ? "null" : origTableTurkedTarget.toString(); fields[7] = origTableFlag; fields[8] = "" + numDerivsMatched; fields[9] = "" + numClassesMatched; return String.join("\t", fields); } public void dump(PrintWriter writer) { writer.println(toString()); writer.flush(); } // ============================================================ // Read from String or file // ============================================================ public static TurkEquivalentClassInfo fromString(String line) { TurkEquivalentClassInfo info = new TurkEquivalentClassInfo(); String[] fields = line.split("\t"); info.id = fields[0]; info.numDerivs = Integer.parseInt(fields[1]); info.numClasses = Integer.parseInt(fields[2]); info.allTurkedTables = readIntegerList(fields[3]); info.agreedTurkedTables = readIntegerList(fields[4]); info.origTableTarget = readValue(fields[5]); info.origTableTurkedTarget = readValue(fields[6]); info.origTableFlag = fields[7]; info.numDerivsMatched = Integer.parseInt(fields[8]); info.numClassesMatched = Integer.parseInt(fields[9]); return info; } private static List<Integer> readIntegerList(String x) { x = x.replaceAll("\\[|\\]", "").trim(); List<Integer> answer = new ArrayList<>(); if (!x.isEmpty()) for (String y : x.split(",")) answer.add(Integer.parseInt(y.trim())); Collections.sort(answer); return answer; } private static Value readValue(String x) { if ("null".equals(x)) return null; if ("ERROR".equals(x)) return ValueCanonicalizer.ERROR; return Values.fromString(x); } public static Map<String, TurkEquivalentClassInfo> fromFile(String filename) { Map<String, TurkEquivalentClassInfo> map = new HashMap<>(); try (BufferedReader in = new BufferedReader(new FileReader(filename))) { String line; while ((line = in.readLine()) != null) { if (line.startsWith("id\tnumDerivs")) continue; // Skip header TurkEquivalentClassInfo info = TurkEquivalentClassInfo.fromString(line); map.put(info.id, info); } } catch (IOException e) { throw new RuntimeException(e); } return map; } }