in opennlp-tools/src/main/java/opennlp/tools/parser/lang/en/HeadRules.java [126:189]
public Parse getHead(Parse[] constituents, String type) {
if (Parser.TOK_NODE.equals(constituents[0].getType())) {
return null;
}
HeadRule hr;
if (type.equals("NP") || type.equals("NX")) {
String[] tags1 = { "NN", "NNP", "NNPS", "NNS", "NX", "JJR", "POS" };
for (int ci = constituents.length - 1; ci >= 0; ci--) {
for (int ti = tags1.length - 1; ti >= 0; ti--) {
if (constituents[ci].getType().equals(tags1[ti])) {
return constituents[ci].getHead();
}
}
}
for (Parse constituent : constituents) {
if (constituent.getType().equals("NP")) {
return constituent.getHead();
}
}
String[] tags2 = { "$", "ADJP", "PRN" };
for (int ci = constituents.length - 1; ci >= 0; ci--) {
for (int ti = tags2.length - 1; ti >= 0; ti--) {
if (constituents[ci].getType().equals(tags2[ti])) {
return constituents[ci].getHead();
}
}
}
String[] tags3 = { "JJ", "JJS", "RB", "QP" };
for (int ci = constituents.length - 1; ci >= 0; ci--) {
for (int ti = tags3.length - 1; ti >= 0; ti--) {
if (constituents[ci].getType().equals(tags3[ti])) {
return constituents[ci].getHead();
}
}
}
return constituents[constituents.length - 1].getHead();
}
else if ((hr = headRules.get(type)) != null) {
String[] tags = hr.tags;
int cl = constituents.length;
int tl = tags.length;
if (hr.leftToRight) {
for (String tag : tags) {
for (Parse constituent : constituents) {
if (constituent.getType().equals(tag)) {
return constituent.getHead();
}
}
}
return constituents[0].getHead();
}
else {
for (String tag : tags) {
for (int ci = cl - 1; ci >= 0; ci--) {
if (constituents[ci].getType().equals(tag)) {
return constituents[ci].getHead();
}
}
}
return constituents[cl - 1].getHead();
}
}
return constituents[constituents.length - 1].getHead();
}