package edu.stanford.nlp.sempre.freebase; import fig.basic.IOUtils; import fig.basic.LogInfo; import fig.basic.MapUtils; import fig.basic.Option; import fig.exec.Execution; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; /** * Input: raw RDF Freebase dump (ttl format) downloaded from the Freebase * website. Input: canonical id map file output by BuildCanonicalIdMap. * <p/> * Output: Freebase dump with all mids and ids standardized. * * @author Percy Liang */ public class CanonicalizeIds implements Runnable { @Option public int maxInputLines = Integer.MAX_VALUE; @Option(required = true) public String canonicalIdMapPath; @Option(required = true, gloss = "Raw Freebase triples") public String rawPath; @Option(required = true, gloss = "Canonicalized Freebase triples") public String canonicalizedPath; public void run() { Map<String, String> canonicalIdMap = Utils.readCanonicalIdMap(canonicalIdMapPath, maxInputLines); // Do conversion LogInfo.begin_track("Convert"); PrintWriter out = IOUtils.openOutHard(canonicalizedPath); out.println(Utils.ttlPrefix); try { BufferedReader in = IOUtils.openIn(rawPath); String line; int numInputLines = 0; while (numInputLines < maxInputLines && (line = in.readLine()) != null) { numInputLines++; if (numInputLines % 10000000 == 0) LogInfo.logs("Read %s lines", numInputLines); String[] tokens = Utils.parseTriple(line); if (tokens == null) continue; String arg1 = tokens[0]; String property = tokens[1]; String arg2 = tokens[2]; // Do some simple filtering if (!property.startsWith("fb:")) continue; if (property.contains("..")) continue; // Freebase dumps started containing paths through CVTs, which we don't need if (property.equals("fb:type.type.instance")) continue; // Already have type.object.type, don't need reverse map explicitly if (arg2.startsWith("\"") && !(arg2.endsWith("@en") || arg2.contains("^^xsd:"))) continue; // Strings must be in English or xsd values (boolean, int, float, datetime) arg2 = Utils.quoteValues(arg2); // Fix numerical values // Convert everything to use canonical ids. arg1 = MapUtils.get(canonicalIdMap, arg1, arg1); property = MapUtils.get(canonicalIdMap, property, property); arg2 = MapUtils.get(canonicalIdMap, arg2, arg2); Utils.writeTriple(out, arg1, property, arg2); } in.close(); } catch (IOException e) { throw new RuntimeException(e); } out.close(); LogInfo.end_track(); } public static void main(String[] args) { Execution.run(args, new CanonicalizeIds()); } }