if (parserNode.srlInfo.isPredicate()) {
int headId = i;
if (!headIdToPredicate.containsKey(headId)) {
// We have not encountered this predicate yet, so create it
Predicate pred = this.createPredicate(jCas, parserNode.srlInfo.rolesetId, token);
headIdToPredicate.put(headId, pred);
pred.setRelations(new EmptyFSList(jCas));
}
} else {
for (SRLHead head : parserNode.srlInfo.heads) {
Predicate predicate;
// Determine which predicate this argument belongs to
if (!headIdToPredicate.containsKey(head.headId)) {
// The predicate hasn't been encountered, so create it
BaseToken headToken = tokens.get(head.headId - 1);
predicate = this.createPredicate(jCas, parserNode.srlInfo.rolesetId, headToken);
headIdToPredicate.put(head.headId, predicate);
} else {
predicate = headIdToPredicate.get(head.headId);
}
// Append this argument to the predicate's list of arguments
if (!predicateArguments.containsKey(predicate)) {
predicateArguments.put(predicate, new ArrayList<SemanticArgument>());
}
List<SemanticArgument> argumentList = predicateArguments.get(predicate);
// Create the semantic argument and store for later link creation
SemanticArgument argument = createArgument(jCas, head, token);
argumentList.add(argument);
}
}
}
// Create relations between predicates and arguments
for (Map.Entry<Predicate, List<SemanticArgument>> entry : predicateArguments.entrySet()) {
Predicate predicate = entry.getKey();
List<SemanticRoleRelation> relations = new ArrayList<SemanticRoleRelation>();
for (SemanticArgument argument : entry.getValue()) {
SemanticRoleRelation relation = new SemanticRoleRelation(jCas);
relation.setArgument(argument);
relation.setPredicate(predicate);
relation.setCategory(argument.getLabel());
relation.addToIndexes();
relations.add(relation);
argument.setRelation(relation);
}
FSList relationsList = ListFactory.buildList(jCas, relations.toArray(new TOP[relations.size()]));
predicate.setRelations(relationsList);
}
}