in opennlp-coref/src/main/java/opennlp/tools/coref/mention/PTBHeadFinder.java [55:107]
public Parse getHead(Parse p) {
if (p == null) {
return null;
}
if (p.isNounPhrase()) {
List<Parse> parts = p.getSyntacticChildren();
//shallow parse POS
if (parts.size() > 2) {
Parse child0 = parts.get(0);
Parse child1 = parts.get(1);
Parse child2 = parts.get(2);
if (child1.isToken() && child1.getSyntacticType().equals("POS")
&& child0.isNounPhrase() && child2.isNounPhrase()) {
return child2;
}
}
//full parse POS
if (parts.size() > 1) {
Parse child0 = parts.get(0);
if (child0.isNounPhrase()) {
List<Parse> ctoks = child0.getTokens();
if (ctoks.size() == 0) {
System.err.println("PTBHeadFinder: NP " + child0 + " with no tokens");
}
Parse tok = ctoks.get(ctoks.size() - 1);
if (tok.getSyntacticType().equals("POS")) {
return null;
}
}
}
//coordinated nps are their own entities
if (parts.size() > 1) {
for (int pi = 1; pi < parts.size() - 1; pi++) {
Parse child = parts.get(pi);
if (child.isToken() && child.getSyntacticType().equals("CC")) {
return null;
}
}
}
//all other NPs
for (Parse child : parts) {
//System.err.println("PTBHeadFinder.getHead: "+p.getSyntacticType()+" "+p
// +" child "+pi+"="+child.getSyntacticType()+" "+child);
if (child.isNounPhrase()) {
return child;
}
}
return null;
}
else {
return null;
}
}