package edu.stanford.nlp.sempre.freebase.utils; import com.google.common.base.Joiner; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import edu.stanford.nlp.io.IOUtils; import edu.stanford.nlp.objectbank.ObjectBank; import edu.stanford.nlp.sempre.DateValue; import edu.stanford.nlp.sempre.DescriptionValue; import edu.stanford.nlp.sempre.Json; import edu.stanford.nlp.sempre.NameValue; import edu.stanford.nlp.stats.ClassicCounter; import edu.stanford.nlp.stats.Counter; import edu.stanford.nlp.util.StringUtils; import fig.basic.LispTree; import fig.basic.LogInfo; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.*; /** * Utilities for files * @author jonathanberant */ public final class FileUtils { private FileUtils() { } /** * Upload a set of string where each line is an element * * @throws IOException */ public static Set<String> loadSet(String file) throws IOException { Set<String> res = new TreeSet<String>(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; while ((line = reader.readLine()) != null) { res.add(line); } reader.close(); return res; } public static Map<String, String> loadStringToStringMap(String file) throws IOException { Map<String, String> res = new HashMap<String, String>(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; int i = 0; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); res.put(tokens[0], tokens[1]); i++; if (i % 1000000 == 0) LogInfo.logs("Uploaing line %s: %s", i, line); } reader.close(); return res; } public static Map<Integer, Double> loadIntToDoubleMap(String file) throws IOException { Map<Integer, Double> res = new HashMap<Integer, Double>(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); res.put(Integer.parseInt(tokens[0]), Double.parseDouble(tokens[1])); } reader.close(); return res; } public static Map<String, String> loadStringToStringMap(String file, int keyColumn, int valueColumn) throws IOException { Map<String, String> res = new HashMap<String, String>(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; int i = 0; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); res.put(tokens[keyColumn], tokens[valueColumn]); i++; if (i % 1000000 == 0) LogInfo.log("Number of lines uploaded: " + i); } reader.close(); return res; } public static BiMap<String, String> loadStringToStringBiMap(String file, int from, int to) throws IOException { BiMap<String, String> res = HashBiMap.create(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); if (res.containsKey(tokens[from])) throw new RuntimeException("Map already contains key: " + tokens[from]); if (res.inverse().containsKey(tokens[to])) throw new RuntimeException("Map already contains value: " + tokens[to]); res.put(tokens[from], tokens[to]); } reader.close(); return res; } public static Set<String> loadSetFromTabDelimitedFile(String file, int column) throws IOException { Set<String> res = new HashSet<String>(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; int i = 0; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); res.add(tokens[column]); i++; if (i % 1000000 == 0) { LogInfo.log("Number of lines: " + i); } } reader.readLine(); return res; } public static BiMap<String, Integer> loadString2IntegerBiMap(String file, String delimiter) throws IOException { BiMap<String, Integer> res = HashBiMap.create(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split(delimiter); res.put(tokens[0], Integer.parseInt(tokens[1])); } reader.close(); return res; } public static BiMap<Integer, Integer> loadIntegerToIntegerBiMap(String file) throws IOException { BiMap<Integer, Integer> res = HashBiMap.create(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); res.put(Integer.parseInt(tokens[0]), Integer.parseInt(tokens[1])); } reader.close(); return res; } public static Map<String, Integer> loadString2IntegerMap(String file) throws IOException { Map<String, Integer> res = new HashMap<String, Integer>(); BufferedReader reader = IOUtils.getBufferedFileReader(file); String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split("\t"); res.put(tokens[0], Integer.parseInt(tokens[1])); } reader.close(); return res; } public static BiMap<String, Integer> loadString2IntegerBiMap(String file) throws IOException { return loadString2IntegerBiMap(file, "\t"); } public static Counter<String> loadStringCounter(String filename) { Counter<String> res = new ClassicCounter<String>(); for (String line : ObjectBank.getLineIterator(filename)) { String[] tokens = line.split("\t"); res.incrementCount(tokens[0], Double.parseDouble(tokens[1])); } return res; } public static void ridDuplicates(String inFile, String outFile) throws IOException { Set<String> inSet = loadSet(inFile); PrintWriter writer = IOUtils.getPrintWriter(outFile); for (String str : inSet) { writer.println(str); } writer.close(); } public static String omitPunct(String str) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); ++i) { if (!StringUtils.isPunct((new Character(str.charAt(i))).toString())) { sb.append(str.charAt(i)); } } return sb.toString(); } //input: tab separated file with |utterance| |gold| |predicted| //output: prediction file for codalab public static void generatePredictionFile(String inFile, String outFile) throws IOException { PrintWriter writer = IOUtils.getPrintWriter(outFile); for (String line : IOUtils.readLines(inFile)) { String[] tokens = line.split("\\t"); if (tokens.length == 0) continue; if (tokens.length < 2) throw new RuntimeException("Illegal line: " + line); String utterance = tokens[0]; // get gold List<String> goldDescriptions = new ArrayList<>(); LispTree goldTree = LispTree.proto.parseFromString(tokens[1]); for (int i = 1; i < goldTree.children.size(); ++i) { DescriptionValue dValue = (DescriptionValue) DescriptionValue.fromString(goldTree.child(i).toString()); goldDescriptions.add(dValue.value); } // get predicted List<String> predictedDescriptions = new ArrayList<>(); if (tokens.length > 2) { LispTree predictedTree = LispTree.proto.parseFromString(tokens[2]); for (int i = 1; i < predictedTree.children.size(); ++i) { if (predictedTree.child(i).child(0).value.equals("name")) { NameValue nValue = (NameValue) NameValue.fromString(predictedTree.child(i).toString()); predictedDescriptions.add(nValue.description); } else if (predictedTree.child(i).child(0).value.equals("date")) { DateValue dateValue = (DateValue) DateValue.fromString(predictedTree.child(i).toString()); predictedDescriptions.add(dateValue.toString()); } else throw new RuntimeException("Can not support this value: " + line); } } writer.println(Joiner.on('\t').join(utterance, Json.writeValueAsStringHard(goldDescriptions), Json.writeValueAsStringHard(predictedDescriptions))); } writer.close(); } public static void main(String[] args) { try { generatePredictionFile(args[0], args[1]); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } }