package edu.stanford.nlp.sempre.freebase.lexicons.normalizers;
import edu.stanford.nlp.util.ArrayUtils;
import java.io.Serializable;
import java.util.Set;
/**
* Normalizes a string by omitting adverbs, determiners, quasi modals, modals
* and "be"
*
* @author jonathanberant
*/
public class BinaryNormalizer implements EntryNormalizer, Serializable {
private static final long serialVersionUID = -4704293835712088190L;
public static Set<String> adverbs = ArrayUtils.asSet(new String[]{"also", "very", "currently", "originally", "really"});
public static Set<String> determiners = ArrayUtils.asSet(new String[]{"the", "a", "an"});
public static Set<String> quasiModals = ArrayUtils.asSet(new String[]{"used to "});
public static Set<String> modals = ArrayUtils.asSet(new String[]{"will "});
public static Set<String> be = ArrayUtils.asSet(new String[]{"'m", "am", "'re", "are", "'s", "is", "was", "were", "be", "being"});
public String normalize(String binary) {
String res = binary.toLowerCase();
res = omitAdverbs(res);
res = omitDeterminers(res);
res = stripQuasiModals(res);
res = stripModals(res);
res = stripBe(res);
if (res.length() == 0)
return binary;
return res;
}
private static String stripBe(String res) {
String[] tokens = res.split("\\s+");
int i;
for (i = 0; i < tokens.length; ++i) {
if (!be.contains(tokens[i]))
break;
}
StringBuilder sb = new StringBuilder();
for (; i < tokens.length; ++i) {
sb.append(tokens[i] + " ");
}
return sb.toString().trim();
}
private static String stripModals(String res) {
for (String modal : modals) {
if (res.startsWith(modal)) {
res = res.substring(modal.length());
return res;
}
}
return res;
}
private static String stripQuasiModals(String res) {
for (String quasiModal : quasiModals) {
if (res.startsWith(quasiModal)) {
res = res.substring(quasiModal.length());
return res;
}
}
return res;
}
private static String omitAdverbs(String res) {
String[] tokens = res.split("\\s+");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tokens.length; ++i) {
if (!adverbs.contains(tokens[i]))
sb.append(tokens[i] + " ");
}
return sb.toString().trim();
}
private static String omitDeterminers(String res) {
String[] tokens = res.split("\\s+");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tokens.length; ++i) {
if (!determiners.contains(tokens[i]))
sb.append(tokens[i] + " ");
}
return sb.toString().trim();
}
}