in opennlp-tools/src/main/java/opennlp/tools/parser/lang/es/AncoraSpanishHeadRules.java [141:205]
public Parse getHead(Parse[] constituents, String type) {
if (Parser.TOK_NODE.equals(constituents[0].getType())) {
return null;
}
HeadRule hr;
if (type.equals("SN") || type.equals("GRUP.NOM")) {
String[] tags1 = {"AQA.*","AQC.*","GRUP\\.A","S\\.A","NC.*S.*", "NP.*","NC.*P.*", "GRUP\\.NOM"};
for (Parse constituent : constituents) {
for (int t = tags1.length - 1; t >= 0; t--) {
if (constituent.getType().matches(tags1[t])) {
return constituent;
}
}
}
for (Parse constituent : constituents) {
if (constituent.getType().equals("SN") || constituent.getType().equals("GRUP.NOM")) {
return constituent;
}
}
String[] tags2 = {"\\$","GRUP\\.A","SA"};
for (int ci = constituents.length - 1; ci >= 0; ci--) {
for (int ti = tags2.length - 1; ti >= 0; ti--) {
if (constituents[ci].getType().matches(tags2[ti])) {
return constituents[ci];
}
}
}
String[] tags3 = {"AQ0.*", "AQ[AC].*","AO.*","GRUP\\.A","S\\.A","RG","RN","GRUP\\.NOM"};
for (int ci = constituents.length - 1; ci >= 0; ci--) {
for (int ti = tags3.length - 1; ti >= 0; ti--) {
if (constituents[ci].getType().matches(tags3[ti])) {
return constituents[ci];
}
}
}
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().matches(tag)) {
return constituent;
}
}
}
return constituents[0].getHead();
}
else {
for (String tag : tags) {
for (int ci = cl - 1; ci >= 0; ci--) {
if (constituents[ci].getType().matches(tag)) {
return constituents[ci];
}
}
}
return constituents[cl - 1].getHead();
}
}
return constituents[constituents.length - 1].getHead();
}