in opennlp-coref/src/main/java/opennlp/tools/coref/mention/PTBHeadFinder.java [60:111]
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.isEmpty()) {
logger.debug("NP {} with no tokens.", child0);
}
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) {
logger.debug("Getting head : {} {} - type {} child {}", p.getSyntacticType(), p, child.getSyntacticType(), child);
if (child.isNounPhrase()) {
return child;
}
}
return null;
}
else {
return null;
}
}