package edu.stanford.nlp.sempre.tables.features;
import edu.stanford.nlp.sempre.*;
/**
* Information about the headword of the utterance.
*
* Examples:
* - Which person is the fastest? ==> (which, person)
* - Who is the fastest person? ==> (who, person)
* - How many cars are red? ==> (how many, red)
* - Who is the fastest? ==> [skipped]
*
* Currently a simple heuristic is used to find the headword.
* @author ppasupat
*
*/
public class HeadwordInfo {
public final String questionWord;
public final String headword;
public HeadwordInfo(String questionWord, String headword) {
this.questionWord = questionWord;
this.headword = headword;
}
public String toString() {
return "(" + questionWord + "," + headword + ")";
}
public String questionWordTuple() {
return "(" + questionWord + ",*)";
}
public String headwordTuple() {
return "(*," + headword + ")";
}
// Heuristics: find the first N* after the first W*
// Example: tell me [who] is the first [person] ... --> person
public static HeadwordInfo analyze(LanguageInfo langInfo) {
String questionWord = null;
for (int i = 0; i < langInfo.numTokens(); i++) {
String posTag = langInfo.posTags.get(i);
if (posTag.startsWith("W")) {
questionWord = langInfo.lemmaTokens.get(i);
if (questionWord.equals("how")) {
// Possibly "how many", "how much", ...
if (i + 1 < langInfo.numTokens() && langInfo.posTags.get(i + 1).startsWith("J"))
questionWord += " " + langInfo.lemmaTokens.get(i + 1);
}
} else if (posTag.startsWith("N") && questionWord != null) {
return new HeadwordInfo(questionWord, langInfo.lemmaTokens.get(i));
}
}
return null;
}
}