package edu.stanford.nlp.sempre.freebase; import com.google.common.base.Function; import edu.stanford.nlp.sempre.*; import fig.basic.*; import fig.exec.Execution; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Replaces all names (e.g., fb:m.02mjmr) with canonical identifiers (e.g., fb:en.barack_obama) * For creating the dataset. * * @author Percy Liang */ public class CanonicalizeExamples implements Runnable { @Option(required = true, gloss = "File mapping ids to canonical ids") public String canonicalIdMapPath; @Option(required = true, gloss = "Input path to examples to canonicalize (output to same directory) with .canonicalized extension") public List<String> examplePaths; Map<String, String> canonicalIdMap; private String convert(String name) { boolean reverse = false; if (name.startsWith("!")) { name = name.substring(1); reverse = true; } name = MapUtils.get(canonicalIdMap, name, name); if (reverse) name = "!" + name; return name; } public Formula convert(Formula formula) { return formula.map( new Function<Formula, Formula>() { public Formula apply(Formula formula) { String name = Formulas.getNameId(formula); if (name != null) { name = convert(name); return Formulas.newNameFormula(name); } return null; } }); } public void run() { canonicalIdMap = edu.stanford.nlp.sempre.freebase.Utils.readCanonicalIdMap(canonicalIdMapPath); for (String inPath : examplePaths) { String outPath = inPath + ".canonicalized"; LogInfo.logs("Converting %s => %s", inPath, outPath); Iterator<LispTree> it = LispTree.proto.parseFromFile(inPath); PrintWriter out = IOUtils.openOutHard(outPath); while (it.hasNext()) { LispTree tree = it.next(); if (!"example".equals(tree.child(0).value)) throw new RuntimeException("Bad: " + tree); for (int i = 1; i < tree.children.size(); i++) { LispTree subtree = tree.child(i); if ("targetFormula".equals(subtree.child(0).value)) { for (int j = 1; j < subtree.children.size(); j++) { Formula formula = Formulas.fromLispTree(subtree.child(j)); formula = convert(formula); subtree.children.set(j, formula.toLispTree()); // Use converted formula } } } out.println(tree.toStringWrap(100)); } out.close(); } } public static void main(String[] args) { Execution.run(args, new CanonicalizeExamples()); } }