//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.annotators.relations.helpers;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Stream;
import org.apache.uima.fit.util.JCasUtil;
import org.apache.uima.jcas.JCas;
import uk.gov.dstl.baleen.types.language.Interaction;
import uk.gov.dstl.baleen.types.language.Sentence;
import uk.gov.dstl.baleen.types.semantic.Entity;
import uk.gov.dstl.baleen.types.semantic.Relation;
/**
* A base class for building relationship extractors which work at a sentence level.
*
* <p>
* Override the {@link #extract(JCas) extract} method which provide interactions and entities
* per-sentence.
*
* <p>
* See {@link AbstractInteractionBasedRelationshipAnnotator} for further information on options.
*/
public abstract class AbstractInteractionBasedSentenceRelationshipAnnotator
extends AbstractInteractionBasedRelationshipAnnotator {
@Override
protected final void extract(JCas jCas) {
final Map<Sentence, Collection<Interaction>> sentenceToInteraction = JCasUtil.indexCovered(jCas, Sentence.class,
Interaction.class);
final Map<Sentence, Collection<Entity>> sentenceToEntities = JCasUtil.indexCovered(jCas, Sentence.class,
Entity.class);
for (final Sentence sentence : JCasUtil.select(jCas, Sentence.class)) {
final Collection<Interaction> interactions = sentenceToInteraction.get(sentence);
final Collection<Entity> entities = sentenceToEntities.get(sentence);
// Check we have enough in the sentence to warrant further work
if (!interactions.isEmpty() && entities.size() >= 2) {
final Stream<Relation> relations = extract(jCas, sentence, interactions, entities);
addRelationsToIndex(relations);
}
}
}
/**
* Extract the relations from this sentence.
*
* @param jCas
* the j cas
* @param sentence
* the sentence
* @param interactions
* the interactions in the sentence
* @param entities
* the entities in the sentence
* @return the stream of relations (return null or empty for none)
*/
protected abstract Stream<Relation> extract(JCas jCas, Sentence sentence, Collection<Interaction> interactions,
Collection<Entity> entities);
}