package edu.stanford.nlp.sempre.freebase.utils;
import edu.stanford.nlp.io.IOUtils;
import fig.basic.LogInfo;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
public final class LinkedExtractionFileUtils {
private String extractionFile;
private static final int ARG1_INDEX = 0;
private static final int PREDICATE_INDEX = 1;
private static final int ARG2_INDEX = 2;
private static final int MID_INDEX = 3;
public static final Pattern DELIMITER_PATTERN = Pattern.compile("\t");
public static final String TIME_ARG = "TIME:";
public LinkedExtractionFileUtils(String extractionFileName) {
this.extractionFile = extractionFileName;
}
public Map<String, Set<String>> getIdToExtractionsMap() throws IOException {
LogInfo.log("Uploading id-to-extraction-set map");
Map<String, Set<String>> res = new HashMap<String, Set<String>>();
BufferedReader reader = IOUtils.getBufferedFileReader(extractionFile);
String line;
while ((line = reader.readLine()) != null) {
String[] tokens = DELIMITER_PATTERN.split(line);
Set<String> extractionSet = res.get(tokens[MID_INDEX]);
if (extractionSet == null) {
extractionSet = new HashSet<String>();
res.put(tokens[MID_INDEX], extractionSet);
}
extractionSet.add(tokens[ARG1_INDEX] + DELIMITER_PATTERN + tokens[PREDICATE_INDEX] + DELIMITER_PATTERN + DELIMITER_PATTERN + tokens[ARG2_INDEX]);
}
reader.close();
LogInfo.log("Done uploading id-to-extraction-set map");
return res;
}
public Set<String> getLinkedIdSet() throws IOException {
LogInfo.log("Uploading linked MIDs set");
Set<String> res = new HashSet<String>();
BufferedReader reader = IOUtils.getBufferedFileReader(extractionFile);
String line;
while ((line = reader.readLine()) != null) {
String[] tokens = DELIMITER_PATTERN.split(line);
res.add(tokens[MID_INDEX]);
}
reader.close();
LogInfo.log("Done uploading linked IDs set");
return res;
}
public Map<String, Map<String, List<String>>> getIdToArg2ToPredicateListMap() throws IOException {
LogInfo.begin_track("Uploading id-to-arg-predicate-list-map");
// BinaryNormalizer normalizer = new BinaryNormalizer();
Map<String, Map<String, List<String>>> res = new HashMap<String, Map<String, List<String>>>();
for (String line : IOUtils.readLines(extractionFile)) {
String[] tokens = DELIMITER_PATTERN.split(line);
String id = tokens[MID_INDEX];
String arg2 = tokens[ARG2_INDEX];
String predicate = tokens[PREDICATE_INDEX];
// String predicate = normalizer.normalize(tokens[PREDICATE_INDEX]);
Map<String, List<String>> arg2ToPredicateList = res.get(id);
if (arg2ToPredicateList == null) {
arg2ToPredicateList = new HashMap<String, List<String>>();
arg2ToPredicateList.put(arg2, new LinkedList<String>());
res.put(id, arg2ToPredicateList);
}
List<String> predicateList = arg2ToPredicateList.get(arg2);
if (predicateList == null) {
predicateList = new LinkedList<String>();
arg2ToPredicateList.put(arg2, predicateList);
}
predicateList.add(predicate);
}
LogInfo.end_track();
return res;
}
public static boolean isTimeArg(String str) {
return str.startsWith(TIME_ARG);
}
public static String extractTime(String str) {
if (!isTimeArg(str)) {
throw new RuntimeException("Not a time arg: " + str);
}
return str.substring(TIME_ARG.length());
}
}