You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by cl...@apache.org on 2014/12/24 22:19:14 UTC
svn commit: r1647845 - in
/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal: ae/
ae/feature/ eval/
Author: clin
Date: Wed Dec 24 21:19:14 2014
New Revision: 1647845
URL: http://svn.apache.org/r1647845
Log:
set the evaluation script for ablation test
Added:
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/EmptyFeaturesExtractor.java (with props)
Modified:
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventRelationAnnotator.java
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeSelfRelationAnnotator.java
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventThymeRelations.java
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventRelationAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventRelationAnnotator.java?rev=1647845&r1=1647844&r2=1647845&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventRelationAnnotator.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventRelationAnnotator.java Wed Dec 24 21:19:14 2014
@@ -35,6 +35,8 @@ import org.apache.ctakes.temporal.ae.fea
import org.apache.ctakes.temporal.ae.feature.DependencyPathFeaturesExtractor;
import org.apache.ctakes.temporal.ae.feature.CoordinateFeaturesExtractor;
import org.apache.ctakes.temporal.ae.feature.DependingVerbsFeatureExtractor;
+import org.apache.ctakes.temporal.ae.feature.EmptyFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.MultiTokenFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.EventInBetweenPropertyExtractor;
//import org.apache.ctakes.temporal.ae.feature.EventOutsidePropertyExtractor;
import org.apache.ctakes.temporal.ae.feature.SpecialAnnotationRelationExtractor;
@@ -53,6 +55,7 @@ import org.apache.ctakes.temporal.ae.fea
import org.apache.ctakes.temporal.ae.feature.SectionHeaderRelationExtractor;
//import org.apache.ctakes.temporal.ae.feature.TemporalAttributeFeatureExtractor;
import org.apache.ctakes.temporal.ae.feature.UmlsFeatureExtractor;
+import org.apache.ctakes.temporal.ae.feature.UnexpandedTokenFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.UnexpandedTokenFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.treekernel.TemporalPETExtractor;
import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
@@ -124,32 +127,34 @@ public class EventEventRelationAnnotator
@Override
protected List<RelationFeaturesExtractor> getFeatureExtractors() {
return Lists.newArrayList(
- new TokenFeaturesExtractor()
- // new UnexpandedTokenFeaturesExtractor() //use unexpanded version for i2b2 data
+ new TokenFeaturesExtractor()
, new PartOfSpeechFeaturesExtractor()
- // , new TemporalPETExtractor()
, new EventArgumentPropertyExtractor()
, new NumberOfEventTimeBetweenCandidatesExtractor()
- , new SectionHeaderRelationExtractor()
, new NearbyVerbTenseRelationExtractor()
, new CheckSpecialWordRelationExtractor()
, new UmlsFeatureExtractor()
- , new DependencyPathFeaturesExtractor()
+// , new DependencyPathFeaturesExtractor()
, new CoordinateFeaturesExtractor()
, new OverlappedHeadFeaturesExtractor()
, new SRLRelationFeaturesExtractor()
, new NumberOfEventsInTheSameSentenceExtractor()
- , new EventPositionRelationFeaturesExtractor() //not helpful
- , new TimeXRelationFeaturesExtractor() //not helpful
, new ConjunctionRelationFeaturesExtractor()
- , new DeterminerRelationFeaturesExtractor()
, new EventTimeRelationFeatureExtractor()
- , new TokenPropertyFeaturesExtractor()
- , new DependingVerbsFeatureExtractor()
- , new SpecialAnnotationRelationExtractor() //not helpful
- , new TemporalPETFlatExtractor()
- // , new EventInBetweenPropertyExtractor()
- // , new EventOutsidePropertyExtractor()
+
+// new MultiTokenFeaturesExtractor()
+// new UnexpandedTokenFeaturesExtractor() //use unexpanded version for i2b2 data
+// , new EmptyFeaturesExtractor()
+
+// , new SectionHeaderRelationExtractor()
+// , new EventPositionRelationFeaturesExtractor() //not helpful
+// , new TimeXRelationFeaturesExtractor() //not helpful
+// , new DeterminerRelationFeaturesExtractor()
+// , new TokenPropertyFeaturesExtractor()
+// , new DependingVerbsFeatureExtractor()
+// , new SpecialAnnotationRelationExtractor() //not helpful
+// , new TemporalPETFlatExtractor()
+
);
}
@@ -208,16 +213,16 @@ public class EventEventRelationAnnotator
for(EventMention event2 : coveringMap.get(eventB)){
pairs.add(new IdentifiedAnnotationPair(eventA, event2));
}
- //pairing covered system events:
- for(EventMention event1 : JCasUtil.selectCovered(jCas, EventMention.class, eventA)){
- for(EventMention event2 : JCasUtil.selectCovered(jCas, EventMention.class, eventB)){
- pairs.add(new IdentifiedAnnotationPair(event1, event2));
- }
- pairs.add(new IdentifiedAnnotationPair(event1, eventB));
- }
- for(EventMention event2 : JCasUtil.selectCovered(jCas, EventMention.class, eventB)){
- pairs.add(new IdentifiedAnnotationPair(eventA, event2));
- }
+// //pairing covered system events:
+// for(EventMention event1 : JCasUtil.selectCovered(jCas, EventMention.class, eventA)){
+// for(EventMention event2 : JCasUtil.selectCovered(jCas, EventMention.class, eventB)){
+// pairs.add(new IdentifiedAnnotationPair(event1, event2));
+// }
+// pairs.add(new IdentifiedAnnotationPair(event1, eventB));
+// }
+// for(EventMention event2 : JCasUtil.selectCovered(jCas, EventMention.class, eventB)){
+// pairs.add(new IdentifiedAnnotationPair(eventA, event2));
+// }
}
pairs.add(new IdentifiedAnnotationPair(eventA, eventB));
}
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeSelfRelationAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeSelfRelationAnnotator.java?rev=1647845&r1=1647844&r2=1647845&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeSelfRelationAnnotator.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeSelfRelationAnnotator.java Wed Dec 24 21:19:14 2014
@@ -32,7 +32,9 @@ import org.apache.ctakes.temporal.ae.fea
import org.apache.ctakes.temporal.ae.feature.ConjunctionRelationFeaturesExtractor;
import org.apache.ctakes.temporal.ae.feature.DependencyFeatureExtractor;
import org.apache.ctakes.temporal.ae.feature.DependencyPathFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.EmptyFeaturesExtractor;
import org.apache.ctakes.temporal.ae.feature.EventArgumentPropertyExtractor;
+import org.apache.ctakes.temporal.ae.feature.MultiTokenFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.EventIndexOfSameSentenceRelationFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.EventPositionRelationFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.EventTimeRelationFeatureExtractor;
@@ -47,6 +49,7 @@ import org.apache.ctakes.temporal.ae.fea
//import org.apache.ctakes.temporal.ae.feature.TimeWordTypeRelationExtractor;
import org.apache.ctakes.temporal.ae.feature.TimeXPropertyRelationFeaturesExtractor;
import org.apache.ctakes.temporal.ae.feature.TimeXRelationFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.UnexpandedTokenFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.UnexpandedTokenFeaturesExtractor;
//import org.apache.ctakes.temporal.ae.feature.TemporalAttributeFeatureExtractor;
//import org.apache.ctakes.temporal.ae.feature.treekernel.EventTimeFlatTreeFeatureExtractor;
@@ -121,32 +124,25 @@ public class EventTimeSelfRelationAnnota
@Override
protected List<RelationFeaturesExtractor> getFeatureExtractors() {
return Lists.newArrayList(
- new TokenFeaturesExtractor()
- // new UnexpandedTokenFeaturesExtractor() //use unexpanded version for i2b2 data
+ new TokenFeaturesExtractor()
, new PartOfSpeechFeaturesExtractor()
, new TemporalAttributeFeatureExtractor()
- // , new EventTimeFlatTreeFeatureExtractor()
- // , new TemporalPETExtractor()
- //, new TemporalPathExtractor()
- // , new EventVerbRelationTreeExtractor()
, new NumberOfEventTimeBetweenCandidatesExtractor()
- // , new SectionHeaderRelationExtractor()
, new NearbyVerbTenseRelationExtractor()
, new CheckSpecialWordRelationExtractor()
, new NearestFlagFeatureExtractor()
, new DependencyPathFeaturesExtractor()
, new DependencyFeatureExtractor()
- // , new SRLRelationFeaturesExtractor()// tried, but not helpful
, new EventArgumentPropertyExtractor()
, new OverlappedHeadFeaturesExtractor()
- // , new EventTimeRelationFeatureExtractor()
, new ConjunctionRelationFeaturesExtractor()
- // , new EventPositionRelationFeaturesExtractor() //tried, but not helpful
, new TimeXRelationFeaturesExtractor()
- , new TemporalPETFlatExtractor()
- , new TimeXPropertyRelationFeaturesExtractor()
- // , new TimeWordTypeRelationExtractor() //tried, but not helpful
- // , new EventIndexOfSameSentenceRelationFeaturesExtractor() //tried, but not helpful
+
+// new MultiTokenFeaturesExtractor()
+// new UnexpandedTokenFeaturesExtractor() //use unexpanded version for i2b2 data
+// , new EmptyFeaturesExtractor()
+// , new TemporalPETFlatExtractor()
+// , new TimeXPropertyRelationFeaturesExtractor()
);
}
@@ -166,12 +162,12 @@ public class EventTimeSelfRelationAnnota
for (EventMention event : JCasUtil.selectCovered(jCas, EventMention.class, sentence)) {
boolean eventValid = false;
if (event.getClass().equals(EventMention.class)) {//event is a gold event
- for( EventMention aEve : JCasUtil.selectCovered(jCas, EventMention.class, event)){
- if(!aEve.getClass().equals(EventMention.class)){//this event cover a UMLS semantic type
+// for( EventMention aEve : JCasUtil.selectCovered(jCas, EventMention.class, event)){
+// if(!aEve.getClass().equals(EventMention.class)){//this event cover a UMLS semantic type
eventValid = true;
- break;
- }
- }
+// break;
+// }
+// }
}
if(eventValid){
@@ -183,9 +179,9 @@ public class EventTimeSelfRelationAnnota
pairs.add(new IdentifiedAnnotationPair(covEvent, time));
}
pairs.add(new IdentifiedAnnotationPair(event, time));
- for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, event)){//select covered events
- pairs.add(new IdentifiedAnnotationPair(covedEvent, time));
- }
+// for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, event)){//select covered events
+// pairs.add(new IdentifiedAnnotationPair(covedEvent, time));
+// }
}
}else{//if testing mode, only test on system generated events
for (TimeMention time : JCasUtil.selectCovered(jCas, TimeMention.class, sentence)) {
Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/EmptyFeaturesExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/EmptyFeaturesExtractor.java?rev=1647845&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/EmptyFeaturesExtractor.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/EmptyFeaturesExtractor.java Wed Dec 24 21:19:14 2014
@@ -0,0 +1,19 @@
+package org.apache.ctakes.temporal.ae.feature;
+
+import java.util.List;
+
+import org.apache.ctakes.relationextractor.ae.features.RelationFeaturesExtractor;
+import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.jcas.JCas;
+import org.cleartk.ml.Feature;
+
+public class EmptyFeaturesExtractor implements RelationFeaturesExtractor {
+
+ public List<Feature> extract(JCas jCas, IdentifiedAnnotation arg1,
+ IdentifiedAnnotation arg2) throws AnalysisEngineProcessException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+ //do noting
+}
Propchange: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/EmptyFeaturesExtractor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventThymeRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventThymeRelations.java?rev=1647845&r1=1647844&r2=1647845&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventThymeRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventThymeRelations.java Wed Dec 24 21:19:14 2014
@@ -39,6 +39,7 @@ import org.apache.ctakes.temporal.ae.Eve
//import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
//import org.apache.ctakes.temporal.ae.EventEventRelationAnnotator;
import org.apache.ctakes.temporal.ae.baselines.RecallBaselineEventTimeRelationAnnotator;
+import org.apache.ctakes.temporal.eval.EvaluationOfEventTimeRelations.Overlap2Contains;
import org.apache.ctakes.temporal.eval.EvaluationOfEventTimeRelations.ParameterSettings;
import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveNonContainsRelations.RemoveGoldAttributes;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.WriteI2B2XML;
@@ -285,6 +286,8 @@ EvaluationOfTemporalRelations_ImplBase{
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonContainsRelations.class));
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddFlippedOverlap.class));//add flipped overlap instances to training data
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(Overlap2Contains.class));
+
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(PreserveEventEventRelations.class));
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonUMLSEvents.class));
@@ -329,7 +332,7 @@ EvaluationOfTemporalRelations_ImplBase{
}
// HideOutput hider = new HideOutput();
- JarClassifierBuilder.trainAndPackage(new File(directory,"event-event"),"-w1","0.08","-w3","3","-w4","17","-w5","20","-w6","16","-w7","10","-w8","6", "-w9","45","-w10","30","-c", optArray[1]);//"-c", "0.05");//optArray);
+ JarClassifierBuilder.trainAndPackage(new File(directory,"event-event"),"-w1","0.2","-w3","15","-w4","4","-w5","64","-w6","24","-w7","29","-w9","70","-c", optArray[1]);//"-c", "0.05");//"0.08","-w3","3","-w4","17","-w5","20","-w6","16","-w7","10","-w8","6", "-w9","45","-w10","30","-c", optArray[1]);//"-c", "0.05");//optArray);
// JarClassifierBuilder.trainAndPackage(new File(directory,"event-event"), "-h","0","-c", "1000");
// hider.restoreOutput();
// hider.close();
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java?rev=1647845&r1=1647844&r2=1647845&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java Wed Dec 24 21:19:14 2014
@@ -29,6 +29,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
+import java.util.HashMap;
//import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -131,20 +132,20 @@ EvaluationOfTemporalRelations_ImplBase{
public static void main(String[] args) throws Exception {
TempRelOptions options = CliFactory.parseArguments(TempRelOptions.class, args);
- List<Integer> trainItems = null;
- List<Integer> devItems = null;
- List<Integer> testItems = null;
-
- List<Integer> patientSets = options.getPatients().getList();
- if(options.getXMLFormat() == XMLFormat.I2B2){
- trainItems = I2B2Data.getTrainPatientSets(options.getXMLDirectory());
- devItems = I2B2Data.getDevPatientSets(options.getXMLDirectory());
- testItems = I2B2Data.getTestPatientSets(options.getXMLDirectory());
- }else{
- trainItems = THYMEData.getPatientSets(patientSets, options.getTrainRemainders().getList());
- devItems = THYMEData.getPatientSets(patientSets, options.getDevRemainders().getList());
- testItems = THYMEData.getPatientSets(patientSets, options.getTestRemainders().getList());
- }
+ List<Integer> trainItems = null;
+ List<Integer> devItems = null;
+ List<Integer> testItems = null;
+
+ List<Integer> patientSets = options.getPatients().getList();
+ if(options.getXMLFormat() == XMLFormat.I2B2){
+ trainItems = I2B2Data.getTrainPatientSets(options.getXMLDirectory());
+ devItems = I2B2Data.getDevPatientSets(options.getXMLDirectory());
+ testItems = I2B2Data.getTestPatientSets(options.getXMLDirectory());
+ }else{
+ trainItems = THYMEData.getPatientSets(patientSets, options.getTrainRemainders().getList());
+ devItems = THYMEData.getPatientSets(patientSets, options.getDevRemainders().getList());
+ testItems = THYMEData.getPatientSets(patientSets, options.getTestRemainders().getList());
+ }
ParameterSettings params = allParams;
// possibleParams.add(defaultParams);
@@ -173,7 +174,7 @@ EvaluationOfTemporalRelations_ImplBase{
options.getUseGoldAttributes(),
options.getKernelParams(),
params);
-
+
if(options.getI2B2Output()!=null) evaluation.setI2B2Output(options.getI2B2Output() + "/temporal-relations/event-time");
List<Integer> training = trainItems;
List<Integer> testing = null;
@@ -190,12 +191,12 @@ EvaluationOfTemporalRelations_ImplBase{
}else{
evaluation.prepareXMIsFor(patientSets);
}
-
+
params.stats = evaluation.trainAndTest(training, testing);//training);//
// System.err.println(options.getKernelParams() == null ? params : options.getKernelParams());
System.err.println("No closure on gold::Closure on System::Recall Mode");
System.err.println(params.stats);
-
+
//do closure on gold, but not on system, to calculate precision
evaluation.skipTrain = true;
recallModeEvaluation = false;
@@ -203,7 +204,7 @@ EvaluationOfTemporalRelations_ImplBase{
// System.err.println(options.getKernelParams() == null ? params : options.getKernelParams());
System.err.println("No closure on System::Closure on Gold::Precision Mode");
System.err.println(params.stats);
-
+
//do closure on train, but not on test, to calculate plain results
evaluation.skipTrain = true;
evaluation.useClosure = false;
@@ -211,7 +212,7 @@ EvaluationOfTemporalRelations_ImplBase{
// System.err.println(options.getKernelParams() == null ? params : options.getKernelParams());
System.err.println("Closure on train::No closure on Test::Plain Mode");
System.err.println(params.stats);
-
+
if(options.getUseTmp()){
// won't work because it's not empty. should we be concerned with this or is it responsibility of
// person invoking the tmp flag?
@@ -287,13 +288,15 @@ EvaluationOfTemporalRelations_ImplBase{
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddTransitiveBeforeAndOnRelations.class));
}
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonContainsRelations.class));
-// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddFlippedOverlap.class));//add flipped overlap instances to training data
+ // aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddFlippedOverlap.class));//add flipped overlap instances to training data
+
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(Overlap2Contains.class));
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveEventEventRelations.class));
-
+
//add unlabeled nearby system events as potential links:
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddPotentialRelations.class));
-
+
aggregateBuilder.add(EventTimeSelfRelationAnnotator.createDataWriterDescription(
LibLinearStringOutcomeDataWriter.class,
// LIBSVMStringOutcomeDataWriter.class,
@@ -332,7 +335,7 @@ EvaluationOfTemporalRelations_ImplBase{
}
// HideOutput hider = new HideOutput();
- JarClassifierBuilder.trainAndPackage(new File(directory,"event-time"), "-w3","2","-w4","18","-w5","14","-w6","21","-w7","100","-w8","19","-c", optArray[1]);//"0.05");//"-h","0","-c", "1000");//optArray);
+ JarClassifierBuilder.trainAndPackage(new File(directory,"event-time"), "-w3","2","-w4","19","-w5","13","-w6","22","-w7","96","-w8","18","-c", optArray[1]);//"-w3","2","-w4","19","-w5","13","-w6","22","-w7","96","-w8","18","-c", optArray[1]);//"-w4","18","-w5","14","-w6","21","-w7","100","-w8","19","-c", optArray[1]);//"0.05");//"-h","0","-c", "1000");//optArray);
// JarClassifierBuilder.trainAndPackage(new File(directory,"event-event"), "-h","0","-c", "1000");
// hider.restoreOutput();
// hider.close();
@@ -362,16 +365,16 @@ EvaluationOfTemporalRelations_ImplBase{
AnalysisEngineFactory.createEngineDescription(RemoveEventEventRelations.class),
CAS.NAME_DEFAULT_SOFA,
GOLD_VIEW_NAME);
- aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonUMLSEtEvents.class));
+ // aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonUMLSEtEvents.class));
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveRelations.class));
aggregateBuilder.add(this.baseline ? RecallBaselineEventTimeRelationAnnotator.createAnnotatorDescription(directory) :
EventTimeSelfRelationAnnotator.createEngineDescription(new File(directory,"event-time")));
-
+
if(this.i2b2Output != null){
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(WriteI2B2XML.class, WriteI2B2XML.PARAM_OUTPUT_DIR, this.i2b2Output), "TimexView", CAS.NAME_DEFAULT_SOFA);
}
-
+
File outf = null;
if (recallModeEvaluation && this.useClosure) {//add closure for system output
aggregateBuilder.add(
@@ -392,9 +395,9 @@ EvaluationOfTemporalRelations_ImplBase{
}
PrintWriter outDrop =null;
-
+
outDrop = new PrintWriter(new BufferedWriter(new FileWriter(outf, false)));
-
+
Function<BinaryTextRelation, ?> getSpan = new Function<BinaryTextRelation, HashableArguments>() {
public HashableArguments apply(BinaryTextRelation relation) {
return new HashableArguments(relation);
@@ -418,7 +421,7 @@ EvaluationOfTemporalRelations_ImplBase{
//newly add
// systemRelations = removeNonGoldRelations(systemRelations, goldRelations, getSpan);//for removing non-gold pairs
-// systemRelations = correctArgOrder(systemRelations, goldRelations);//change the argument order of "OVERLAP" relation, if the order is flipped
+ // systemRelations = correctArgOrder(systemRelations, goldRelations);//change the argument order of "OVERLAP" relation, if the order is flipped
//find duplicates in gold relations:
// Collection<BinaryTextRelation> duplicateGoldRelations = getDuplicateRelations(goldRelations, getSpan);
// if(!duplicateGoldRelations.isEmpty()){
@@ -467,7 +470,7 @@ EvaluationOfTemporalRelations_ImplBase{
outDrop.close();
return stats;
}
-
+
public static class RemoveNonUMLSEtEvents extends org.apache.uima.fit.component.JCasAnnotator_ImplBase {
public static final String PARAM_GOLD_VIEW = "GoldView";
@@ -555,31 +558,31 @@ EvaluationOfTemporalRelations_ImplBase{
}
*/
-// private static <SPAN_TYPE> Collection<BinaryTextRelation> removeNonGoldRelations(
-// Collection<BinaryTextRelation> systemRelations,
-// Collection<BinaryTextRelation> goldRelations, Function<BinaryTextRelation, ?> getSpan) {
-// //remove non-gold pairs from system relations:
-// Set<BinaryTextRelation> goodSys = Sets.newHashSet();
-// Set<SPAN_TYPE> goldspans = new HashSet<>();
-//
-// for (BinaryTextRelation relation : goldRelations) {
-// goldspans.add(((SPAN_TYPE) getSpan.apply(relation)));
-// }
-//
-// for (BinaryTextRelation relation : systemRelations) {
-// if (goldspans.contains(((SPAN_TYPE) getSpan.apply(relation)))) {
-// goodSys.add(relation);
-// }
-// }
-//
-// return goodSys;
-// }
-//
-// private static boolean matchSpan(Annotation arg1, Annotation arg2) {
-// boolean result = false;
-// result = arg1.getBegin() == arg2.getBegin() && arg1.getEnd() == arg2.getEnd();
-// return result;
-// }
+ // private static <SPAN_TYPE> Collection<BinaryTextRelation> removeNonGoldRelations(
+ // Collection<BinaryTextRelation> systemRelations,
+ // Collection<BinaryTextRelation> goldRelations, Function<BinaryTextRelation, ?> getSpan) {
+ // //remove non-gold pairs from system relations:
+ // Set<BinaryTextRelation> goodSys = Sets.newHashSet();
+ // Set<SPAN_TYPE> goldspans = new HashSet<>();
+ //
+ // for (BinaryTextRelation relation : goldRelations) {
+ // goldspans.add(((SPAN_TYPE) getSpan.apply(relation)));
+ // }
+ //
+ // for (BinaryTextRelation relation : systemRelations) {
+ // if (goldspans.contains(((SPAN_TYPE) getSpan.apply(relation)))) {
+ // goodSys.add(relation);
+ // }
+ // }
+ //
+ // return goodSys;
+ // }
+ //
+ // private static boolean matchSpan(Annotation arg1, Annotation arg2) {
+ // boolean result = false;
+ // result = arg1.getBegin() == arg2.getBegin() && arg1.getEnd() == arg2.getEnd();
+ // return result;
+ // }
// @SuppressWarnings("unchecked")
// private static <SPAN> Collection<BinaryTextRelation> getDuplicateRelations(
@@ -662,7 +665,7 @@ EvaluationOfTemporalRelations_ImplBase{
}
}
-
+
public static class AddPotentialRelations extends JCasAnnotator_ImplBase {
public static final String PARAM_RELATION_VIEW = "RelationView";
@ConfigurationParameter(name = PARAM_RELATION_VIEW,mandatory=false)
@@ -678,7 +681,7 @@ EvaluationOfTemporalRelations_ImplBase{
}
Map<EventMention, Collection<EventMention>> coveringMap =
- JCasUtil.indexCovering(relationView, EventMention.class, EventMention.class);
+ JCasUtil.indexCovering(relationView, EventMention.class, EventMention.class);
for(TemporalTextRelation relation : Lists.newArrayList(JCasUtil.select(relationView, TemporalTextRelation.class))){
Annotation arg1 = relation.getArg1().getArgument();
Annotation arg2 = relation.getArg2().getArgument();
@@ -725,7 +728,7 @@ EvaluationOfTemporalRelations_ImplBase{
relation.setArg2(relArg2);
relation.setCategory(category);
relation.addToIndexes();
-
+
}
}
@@ -1023,6 +1026,42 @@ EvaluationOfTemporalRelations_ImplBase{
}
}
+ /**
+ * For conflicting temporal relations on the same pair of arguments, if some of the relation types are "overlap", and "contains", remove "overlap" and keep "contains"
+ * @author CH151862
+ *
+ */
+ public static class Overlap2Contains extends JCasAnnotator_ImplBase {
+
+ @Override
+ public void process(JCas jCas) throws AnalysisEngineProcessException {
+ Map<List<Annotation>, BinaryTextRelation> relationLookup;
+ relationLookup = new HashMap<>();
+ for (BinaryTextRelation relation : JCasUtil.select(jCas, BinaryTextRelation.class)) {
+ Annotation arg1 = relation.getArg1().getArgument();
+ Annotation arg2 = relation.getArg2().getArgument();
+ String relationType = relation.getCategory();
+ // The key is a list of args so we can do bi-directional lookup
+ List<Annotation> key = Arrays.asList(arg1, arg2);
+ if(relationLookup.containsKey(key)){
+ BinaryTextRelation storedRel = relationLookup.get(key);
+ String reln = storedRel.getCategory();
+ if(!relationType.equals(reln)){//if there is category conflicts
+ if(relationType.startsWith("OVERLAP") ){
+ //override "OVERLAP"
+ relation.setCategory(reln);
+ }else if( reln.startsWith("OVERLAP") ){
+ //remove duplicate:
+ storedRel.setCategory(relationType);
+ }
+ }
+ }
+ relationLookup.put(key, relation);
+ }
+
+ }
+ }
+
public static class AddClosure extends JCasAnnotator_ImplBase {
@Override
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java?rev=1647845&r1=1647844&r2=1647845&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java Wed Dec 24 21:19:14 2014
@@ -440,14 +440,9 @@ org.cleartk.eval.Evaluation_ImplBase<Int
"DeleteAction",
new String[] { "selector=B" }));
// add UMLS on top of lookup windows
- aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(DefaultJCasTermAnnotator.class,
- AbstractJCasTermAnnotator.PARAM_WINDOW_ANNOT_PRP,
- "org.apache.ctakes.typesystem.type.textspan.Sentence",
- JCasTermAnnotator.DICTIONARY_DESCRIPTOR_KEY,
- ExternalResourceFactory.createExternalResourceDescription(
- FileResourceImpl.class,
- FileLocator.locateFile("org/apache/ctakes/dictionary/lookup/fast/cTakesHsql.xml"))
- ));
+ aggregateBuilder.add(
+ UmlsDictionaryLookupAnnotator.createAnnotatorDescription()
+ );
aggregateBuilder.add(LvgAnnotator.createAnnotatorDescription());