in ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventDischargeTimeAnnotator.java [137:248]
public void process(JCas jCas) throws AnalysisEngineProcessException {
//get discharge Time id: T1:
TimeMention dischargeTime = null;
//TODO
//may need better way to identify Discharge Time other than relative span information:
for(TimeMention time: JCasUtil.selectCovered(jCas, TimeMention.class, 40, 60)){
if(time.getTimeClass().equals("DATE")){
dischargeTime = time;
break;
}
}
//2. identify the Hospital Course section:
List<Segment> courses = Lists.newArrayList();
Collection<Segment> segments = JCasUtil.select(jCas, Segment.class);
for(Segment seg: segments){
if (seg.getId().equals("course")){//find the right segment
if(JCasUtil.selectCovered(jCas,Sentence.class,seg).size()>0){//ignore empty section
courses.add(seg);
}
}
}
//get event-time1 relations:
Map<List<Annotation>, TemporalTextRelation> dischargeTimeRelationLookup;
dischargeTimeRelationLookup = new HashMap<>();
if (this.isTraining()) {
dischargeTimeRelationLookup = new HashMap<>();
for (TemporalTextRelation relation : JCasUtil.select(jCas, TemporalTextRelation.class)) {
Annotation arg1 = relation.getArg1().getArgument();
Annotation arg2 = relation.getArg2().getArgument();
// The key is a list of args so we can do bi-directional lookup
if(arg1 instanceof TimeMention && arg2!=null && arg2 instanceof EventMention ){
if( arg1==dischargeTime){
dischargeTimeRelationLookup.put(Arrays.asList(arg1, arg2), relation);
continue;
}
}else if(arg1 instanceof EventMention && ( arg2 == null || arg2 instanceof TimeMention)){
if( arg2==dischargeTime ){
dischargeTimeRelationLookup.put(Arrays.asList(arg1, arg2), relation);
continue;
}
}
}
}
Map<EventMention, List<EventMention>> coveringMap =
JCasUtil.indexCovering(jCas, EventMention.class, EventMention.class);
for(Segment course: courses){
for (EventMention eventMention : JCasUtil.selectCovered(jCas, EventMention.class, course)) {
if (eventMention.getClass().equals(EventMention.class)) {//for every gold event
List<Feature> features = extractFeatures(jCas,eventMention);
if (this.isTraining()) {
TemporalTextRelation relation = dischargeTimeRelationLookup.get(Arrays.asList(eventMention, dischargeTime));
String category = null;
if (relation != null) {
category = relation.getCategory();
} else {
relation = dischargeTimeRelationLookup.get(Arrays.asList(dischargeTime, eventMention));
if (relation != null) {
if(relation.getCategory().equals("OVERLAP")){
category = relation.getCategory();
}else if (relation.getCategory().equals("BEFORE")){
category = "AFTER";
}else if (relation.getCategory().equals("AFTER")){
category = "BEFORE";
}
}
}
if(category!=null){
this.dataWriter.write(new Instance<>(category, features));
//add nearby system-generated events as additional instances
// Collection<EventMention> eventList = coveringMap.get(eventMention);
// for(EventMention covEvent : eventList){
// if(!covEvent.getClass().equals(EventMention.class)){
// List<Feature> covEvfeatures = extractFeatures(jCas,covEvent);
// this.dataWriter.write(new Instance<>(category, covEvfeatures));
// }
// }
// for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, eventMention)){//select covered events
// List<Feature> covedEvfeatures = extractFeatures(jCas,covedEvent);
// this.dataWriter.write(new Instance<>(category, covedEvfeatures));
// }
}
} else {
String outcome = this.classifier.classify(features);
if(outcome!=null){
// add the relation to the CAS
RelationArgument relArg1 = new RelationArgument(jCas);
relArg1.setArgument(eventMention);
relArg1.setRole("Argument");
relArg1.addToIndexes();
RelationArgument relArg2 = new RelationArgument(jCas);
relArg2.setArgument(dischargeTime);
relArg2.setRole("Related_to");
relArg2.addToIndexes();
TemporalTextRelation relation = new TemporalTextRelation(jCas);
relation.setArg1(relArg1);
relation.setArg2(relArg2);
relation.setCategory(outcome);
relation.addToIndexes();
}else{
if (dischargeTime!=null)
System.out.println("cannot classify "+ eventMention.getCoveredText()+" and " + dischargeTime.getCoveredText());
}
}
}
}
}
}