package edu.stanford.nlp.sempre.overnight; import fig.basic.IOUtils; import fig.basic.LogInfo; import fig.basic.MapUtils; import fig.basic.Option; import edu.stanford.nlp.sempre.*; import java.util.HashMap; import java.util.Map; /** * PPDBModel extracts and scores paraphrasing featues from derivations. * This model is intended to be used with FloatingParser * * @author Yushi Wang */ public final class PPDBModel { public static class Options { @Option(gloss = "Path to file with alignment table") public String ppdbModelPath = "regex/regex-ppdb.txt"; @Option(gloss = "Using ppdb format") public boolean ppdb = true; } public static Options opts = new Options(); public static PPDBModel model; Map<String, Map<String, Double>> table; // We should only have one paraphrase model public static PPDBModel getSingleton() { if (model == null) { model = new PPDBModel(); } return model; } private PPDBModel() { table = loadPPDBModel(opts.ppdbModelPath); } /** * Loading ppdb model from file */ private Map<String, Map<String, Double>> loadPPDBModel(String path) { LogInfo.begin_track("Loading ppdb model"); Map<String, Map<String, Double>> res = new HashMap<>(); for (String line: IOUtils.readLinesHard(path)) { if (opts.ppdb) { String[] tokens = line.split("\\|\\|\\|"); String first = tokens[1].trim(); String second = tokens[2].trim(); String stemmedFirst = LanguageInfo.LanguageUtils.stem(first); String stemmedSecond = LanguageInfo.LanguageUtils.stem(second); putParaphraseEntry(res, first, second); if ((!stemmedFirst.equals(first) || !stemmedSecond.equals(second)) && !stemmedFirst.equals(stemmedSecond)) putParaphraseEntry(res, stemmedFirst, stemmedSecond); } else { String[] tokens = line.split("\t"); MapUtils.putIfAbsent(res, tokens[0], new HashMap<>()); for (String token : tokens) LogInfo.logs("%s", token); res.get(tokens[0]).put(tokens[1], 1.0); } } LogInfo.logs("ParaphraseUtils.loadPhraseTable: number of entries=%s", res.size()); LogInfo.end_track(); return res; } private void putParaphraseEntry(Map<String, Map<String, Double>> res, String first, String second) { MapUtils.putIfAbsent(res, first, new HashMap<>()); res.get(first).put(second, 1.0); } public boolean containsKey(String key) { return table.containsKey(key); } public Double get(String key, String token) { if (!table.containsKey(key) || !table.get(key).containsKey(token)) return 0.0; return table.get(key).get(token); } }