in ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/SpecialAnnotationRelationExtractor.java [37:137]
public List<Feature> extract(JCas jcas, IdentifiedAnnotation arg1,
IdentifiedAnnotation arg2) throws AnalysisEngineProcessException {
List<Feature> feats = new ArrayList<>();
EventMention eventA = null;
EventMention eventB = null;
//find event
if(arg1 instanceof EventMention){
eventA = (EventMention) arg1;
}else if(arg2 instanceof EventMention){
eventB = (EventMention) arg2;
}else{
return feats;
}
//1 get covering sentence:
Map<EventMention, List<Sentence>> coveringMap =
JCasUtil.indexCovering(jcas, EventMention.class, Sentence.class);
Sentence sentenceA = getCoveringSentence(eventA, coveringMap);
Sentence sentenceB = getCoveringSentence(eventB, coveringMap);
//get all special annotation that is in sentence A
List<RangeAnnotation> rangeInA = new ArrayList<>();
List<FractionAnnotation> fracInA = new ArrayList<>();
List<RomanNumeralAnnotation> romanInA = new ArrayList<>();
List<MeasurementAnnotation> measureInA = new ArrayList<>();
if(sentenceA != null){
rangeInA.addAll(JCasUtil.selectCovered(jcas, RangeAnnotation.class, sentenceA));
if(!rangeInA.isEmpty()) feats.add(new Feature("arg1_has_nearby_", "RangeAnnotation"));
fracInA.addAll(JCasUtil.selectCovered(jcas, FractionAnnotation.class, sentenceA));
if(!fracInA.isEmpty()) feats.add(new Feature("arg1_has_nearby_", "FractionAnnotation"));
romanInA.addAll(JCasUtil.selectCovered(jcas, RomanNumeralAnnotation.class, sentenceA));
if(!romanInA.isEmpty()) feats.add(new Feature("arg1_has_nearby_", "RomanNumeralAnnotation"));
measureInA.addAll(JCasUtil.selectCovered(jcas, MeasurementAnnotation.class, sentenceA));
if(!measureInA.isEmpty()) feats.add(new Feature("arg1_has_nearby_", "MeasurementAnnotation"));
}
//get all special annotation that is in sentence B
List<RangeAnnotation> rangeInB = new ArrayList<>();
List<FractionAnnotation> fracInB = new ArrayList<>();
List<RomanNumeralAnnotation> romanInB = new ArrayList<>();
List<MeasurementAnnotation> measureInB = new ArrayList<>();
if(sentenceB != null){
rangeInB.addAll(JCasUtil.selectCovered(jcas, RangeAnnotation.class, sentenceB));
if(!rangeInB.isEmpty()) feats.add(new Feature("arg2_has_nearby_", "RangeAnnotation"));
fracInB.addAll(JCasUtil.selectCovered(jcas, FractionAnnotation.class, sentenceB));
if(!fracInB.isEmpty()) feats.add(new Feature("arg2_has_nearby_", "FractionAnnotation"));
romanInB.addAll(JCasUtil.selectCovered(jcas, RomanNumeralAnnotation.class, sentenceB));
if(!romanInB.isEmpty()) feats.add(new Feature("arg2_has_nearby_", "RomanNumeralAnnotation"));
measureInB.addAll(JCasUtil.selectCovered(jcas, MeasurementAnnotation.class, sentenceB));
if(!measureInB.isEmpty()) feats.add(new Feature("arg2_has_nearby_", "MeasurementAnnotation"));
}
//check if annotation matches
if(sentenceA != null && sentenceB != null && sentenceA != sentenceB){
range:
for(RangeAnnotation rangeA: rangeInA){
for(RangeAnnotation rangeB: rangeInB){
if(rangeA.getCoveredText().equalsIgnoreCase(rangeB.getCoveredText())){
feats.add(new Feature("shareCommonRange_", rangeB.getCoveredText().toLowerCase()));
break range;
}
}
}
fraction:
for(FractionAnnotation fracA: fracInA){
for(FractionAnnotation fracB: fracInB){
if(fracA.getCoveredText().equalsIgnoreCase(fracB.getCoveredText())){
feats.add(new Feature("shareCommonFraction_", fracB.getCoveredText().toLowerCase()));
break fraction;
}
}
}
number:
for(RomanNumeralAnnotation numA: romanInA){
for(RomanNumeralAnnotation numB: romanInB){
if(numA.getCoveredText().equalsIgnoreCase(numB.getCoveredText())){
feats.add(new Feature("shareCommonFraction_", numB.getCoveredText().toLowerCase()));
break number;
}
}
}
measure:
for(MeasurementAnnotation meaA: measureInA){
for(MeasurementAnnotation meaB: measureInB){
if(meaA.getCoveredText().equalsIgnoreCase(meaB.getCoveredText())){
feats.add(new Feature("shareCommonFraction_", meaB.getCoveredText().toLowerCase()));
break measure;
}
}
}
}
return feats;
}