package edu.berkeley.nlp.ling;
import java.io.Serializable;
import edu.berkeley.nlp.syntax.Tree;
import edu.berkeley.nlp.util.Pair;
/**
* An interface for finding the "head" daughter of a phrase structure tree.
* This could potentially be any sense of "head", but has mainly been used
* to find the lexical head for lexicalized PCFG parsing.
*
* @author Christopher Manning
*/
public interface HeadFinder extends Serializable {
/**
* Determine which daughter of the current parse tree is the head.
* It assumes that the daughters already have had their heads
* determined. Another method has to do the tree walking.
*
* @param t The parse tree to examine the daughters of
* @return The parse tree that is the head. The convention has been
* that this returns <code>null</code> if no head is found.
* But maybe it should throw an exception?
*/
public Tree<String> determineHead(Tree<String> t);
public static class Utils {
public static Pair<String, String> getHeadWordAndPartOfSpeechPair(HeadFinder hf, Tree<String> tree) {
String headWord = null;
String headPOS = null;
while (true) {
if (tree.isPreTerminal()) {
headPOS = tree.getLabel();
}
if (tree.isLeaf()) {
headWord = tree.getLabel();
break;
}
tree = hf.determineHead(tree);
}
return Pair.newPair(headWord, headPOS);
}
}
}