package edu.stanford.nlp.ie.qe; import edu.stanford.nlp.io.IOUtils; import edu.stanford.nlp.ling.tokensregex.Env; import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; /** * Potential prefix that goes in front of a quantifiable unit * * @author Angel Chang */ public class UnitPrefix { public String name; public String symbol; // What does this prefix do to the unit? public Double scale; public String system; public UnitPrefix(String name, String symbol, Double scale, String system) { this.name = name; this.symbol = symbol; this.scale = scale; this.system = system; } private Unit convert(Unit u) { return new Unit( name + u.getName(), symbol + u.getSymbol(), u.getType(), u, scale ); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSymbol() { return symbol; } public void setSymbol(String symbol) { this.symbol = symbol; } public Double getScale() { return scale; } public void setScale(Double scale) { this.scale = scale; } public void setScale(Number scale) { this.scale = scale.doubleValue(); } public static void registerPrefixes(Env env, String filename) throws IOException { List<UnitPrefix> prefixes = loadPrefixes(filename); registerPrefixes(env, prefixes); } public static void registerPrefixes(Env env, List<UnitPrefix> prefixes) { for (UnitPrefix prefix: prefixes) { registerPrefix(env, prefix); } } public static void registerPrefix(Env env, UnitPrefix prefix) { env.bind(prefix.getName().toUpperCase(), prefix); } public static List<UnitPrefix> loadPrefixes(String filename) throws IOException { Pattern commaPattern = Pattern.compile("\\s*,\\s*"); BufferedReader br = IOUtils.getBufferedFileReader(filename); String headerString = br.readLine(); String[] header = commaPattern.split(headerString); Map<String,Integer> headerIndex = new HashMap<>(); for (int i = 0; i < header.length; i++) { headerIndex.put(header[i], i); } int iName = headerIndex.get("name"); int iPrefix = headerIndex.get("prefix"); int iBase = headerIndex.get("base"); int iExp = headerIndex.get("exp"); int iSystem = headerIndex.get("system"); String line; List<UnitPrefix> list = new ArrayList<>(); while ((line = br.readLine()) != null) { String[] fields = commaPattern.split(line); double base = Double.parseDouble(fields[iBase]); double exp = Double.parseDouble(fields[iExp]); double scale = Math.pow(base, exp); UnitPrefix unitPrefix = new UnitPrefix(fields[iName], fields[iPrefix], scale, fields[iSystem]); list.add(unitPrefix); } br.close(); return list; } }