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 2015/05/01 20:30:30 UTC
svn commit: r1677203 -
/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/
Author: clin
Date: Fri May 1 18:30:30 2015
New Revision: 1677203
URL: http://svn.apache.org/r1677203
Log:
current temporal relation evaluation code.
both event-event and event-time use event expansion.
closure was not applied to evaluation (i.e. testing, but still applied to training) since standard evaluation would take care closure.
Modified:
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfBothEEAndETRelations.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/EvaluationOfEventProperties.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/EvaluationOfI2B2TemporalRelations.java
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfSelfEventTimeRelations.java
ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfBothEEAndETRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfBothEEAndETRelations.java?rev=1677203&r1=1677202&r2=1677203&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfBothEEAndETRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfBothEEAndETRelations.java Fri May 1 18:30:30 2015
@@ -40,9 +40,12 @@ 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.EvaluationOfEventEventThymeRelations.AddEEPotentialRelations;
+import org.apache.ctakes.temporal.eval.EvaluationOfEventTimeRelations.AddPotentialRelations;
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.EvaluationOfTemporalRelations_ImplBase.RemoveGoldAttributes;
+import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveNonContainsRelations;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.WriteI2B2XML;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.XMLFormat;
import org.apache.ctakes.temporal.utils.AnnotationIdCollection;
@@ -174,7 +177,7 @@ EvaluationOfTemporalRelations_ImplBase{
options.getKernelParams(),
params);
// evaluation.prepareXMIsFor(patientSets);
- if(options.getI2B2Output()!=null) evaluation.setI2B2Output(options.getI2B2Output() + "/temporal-relations/event-event");
+ if(options.getI2B2Output()!=null) evaluation.setI2B2Output(options.getI2B2Output() + "/temporal-relations/both");
List<Integer> training = trainItems;
List<Integer> testing = null;
if(options.getTest()){
@@ -192,25 +195,25 @@ EvaluationOfTemporalRelations_ImplBase{
}
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("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;
- params.stats = evaluation.trainAndTest(training, testing);//training);//
- // 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;
- // evaluation.printErrors = false;
- params.stats = evaluation.trainAndTest(training, testing);//training);//
- // 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);
+// evaluation.skipTrain = true;
+// recallModeEvaluation = false;
+// params.stats = evaluation.trainAndTest(training, testing);//training);//
+// // 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;
+// // evaluation.printErrors = false;
+// params.stats = evaluation.trainAndTest(training, testing);//training);//
+// // 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
@@ -288,7 +291,7 @@ EvaluationOfTemporalRelations_ImplBase{
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddContain2Overlap.class));
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddTransitiveBeforeAndOnRelations.class));
}
- // aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonContainsRelations.class));
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonContainsRelations.class));
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddFlippedOverlap.class));//add flipped overlap instances to training data
aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonTLINKRelations.class));//remove non tlink relations, such as alinks
@@ -299,8 +302,8 @@ EvaluationOfTemporalRelations_ImplBase{
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonUMLSEvents.class));
//add unlabeled nearby system events as potential links:
- aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddEEPotentialRelations.class));
- aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddPotentialRelations.class));
+// aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddEEPotentialRelations.class));
+// aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddPotentialRelations.class));
aggregateBuilder.add(EventEventRelationAnnotator.createDataWriterDescription(
LibLinearStringOutcomeDataWriter.class,
@@ -338,8 +341,8 @@ EvaluationOfTemporalRelations_ImplBase{
}
// HideOutput hider = new HideOutput();
- 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-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"),"-w2","10","-w3","86","-c", "0.003");//"-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-time"), "-w3","2","-w4","19","-w5","13","-w6","22","-w7","96","-w8","18","-c", "0.0007"); //"-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();
@@ -349,6 +352,7 @@ EvaluationOfTemporalRelations_ImplBase{
@Override
protected AnnotationStatistics<String> test(CollectionReader collectionReader, File directory)
throws Exception {
+ this.useClosure=false;
AggregateBuilder aggregateBuilder = this.getPreprocessorAggregateBuilder();
aggregateBuilder.add(CopyFromGold.getDescription(EventMention.class, TimeMention.class));
@@ -379,6 +383,10 @@ EvaluationOfTemporalRelations_ImplBase{
CAS.NAME_DEFAULT_SOFA,
GOLD_VIEW_NAME);
}
+
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonContainsRelations.class),
+ CAS.NAME_DEFAULT_SOFA,
+ GOLD_VIEW_NAME);
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveRelations.class));
aggregateBuilder.add(this.baseline ? RecallBaselineEventTimeRelationAnnotator.createAnnotatorDescription(directory) :
@@ -523,100 +531,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)
- private String relationViewName = CAS.NAME_DEFAULT_SOFA;
-
- @Override
- public void process(JCas jCas) throws AnalysisEngineProcessException {
- JCas relationView;
- try {
- relationView = jCas.getView(this.relationViewName);
- } catch (CASException e) {
- throw new AnalysisEngineProcessException(e);
- }
-
- Map<EventMention, Collection<EventMention>> coveringMap =
- 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();
- EventMention event = null;
- if(arg1 instanceof EventMention && arg2 instanceof TimeMention){
- event = (EventMention) arg1;
- Collection<EventMention> eventList = coveringMap.get(event);
- for(EventMention covEvent : eventList){
- if(!covEvent.getClass().equals(EventMention.class)){
- createRelation(relationView, covEvent, arg2, relation.getCategory());
- }
- }
- for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, event)){//select covered events
- createRelation(relationView, covedEvent, arg2, relation.getCategory());
- }
- }else if(arg2 instanceof EventMention && arg1 instanceof TimeMention){
- event = (EventMention) arg2;
- Collection<EventMention> eventList = coveringMap.get(event);
- for(EventMention covEvent : eventList){
- if(!covEvent.getClass().equals(EventMention.class)){
- createRelation(relationView, arg1, covEvent, relation.getCategory());
- }
- }
- for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, event)){//select covered events
- createRelation(relationView, arg1, covedEvent, relation.getCategory());
- }
- }
- }
-
- }
- }
- public static class AddEEPotentialRelations extends org.apache.uima.fit.component.JCasAnnotator_ImplBase {
- public static final String PARAM_RELATION_VIEW = "RelationView";
- @ConfigurationParameter(name = PARAM_RELATION_VIEW,mandatory=false)
- private String relationViewName = CAS.NAME_DEFAULT_SOFA;
-
- @Override
- public void process(JCas jCas) throws AnalysisEngineProcessException {
- JCas relationView;
- try {
- relationView = jCas.getView(this.relationViewName);
- } catch (CASException e) {
- throw new AnalysisEngineProcessException(e);
- }
-
- Map<EventMention, Collection<EventMention>> coveringMap =
- 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();
- if(arg1 instanceof EventMention && arg2 instanceof EventMention){
- EventMention event1 = (EventMention) arg1;
- EventMention event2 = (EventMention) arg2;
- for(EventMention covEventA : coveringMap.get(event1)){
- for(EventMention covEventB : coveringMap.get(event2)){
- createRelation(relationView, covEventA, covEventB, relation.getCategory());
- }
- createRelation(relationView, covEventA, event2, relation.getCategory());
- }
- for(EventMention covEventB : coveringMap.get(event2)){
- createRelation(relationView, event1, covEventB, relation.getCategory());
- }
- //get covered system events:
- for(EventMention covedEventA : JCasUtil.selectCovered(jCas, EventMention.class, event1)){//select covered events
- for(EventMention covedEventB : JCasUtil.selectCovered(jCas, EventMention.class, event2)){
- createRelation(relationView, covedEventA, covedEventB, relation.getCategory());
- }
- createRelation(relationView, covedEventA, event2, relation.getCategory());
- }
- for(EventMention covedEventB : JCasUtil.selectCovered(jCas, EventMention.class, event2)){
- createRelation(relationView, event1, covedEventB, relation.getCategory());
- }
- }
- }
-
- }
- }
-
+
static void createRelation(JCas jCas, Annotation arg1,
Annotation arg2, String category) {
RelationArgument relArg1 = new RelationArgument(jCas);
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=1677203&r1=1677202&r2=1677203&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 Fri May 1 18:30:30 2015
@@ -29,6 +29,8 @@ 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;
import java.util.Set;
@@ -41,7 +43,7 @@ import org.apache.ctakes.temporal.ae.Eve
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.EvaluationOfTemporalRelations_ImplBase.RemoveGoldAttributes;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.WriteI2B2XML;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.XMLFormat;
import org.apache.ctakes.temporal.utils.AnnotationIdCollection;
@@ -49,6 +51,7 @@ import org.apache.ctakes.temporal.utils.
import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
import org.apache.ctakes.typesystem.type.relation.RelationArgument;
import org.apache.ctakes.typesystem.type.relation.TemporalTextRelation;
+import org.apache.ctakes.typesystem.type.syntax.WordToken;
import org.apache.ctakes.typesystem.type.textsem.EventMention;
import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
import org.apache.ctakes.typesystem.type.textsem.TimeMention;
@@ -125,8 +128,18 @@ EvaluationOfTemporalRelations_ImplBase{
protected static ParameterSettings ftParams = new ParameterSettings(DEFAULT_BOTH_DIRECTIONS, DEFAULT_DOWNSAMPLE, "tk",
1.0, 0.1, "radial basis function", ComboOperator.SUM, 0.5, 0.5);
private static Boolean recallModeEvaluation = true;
+
+ static int sysRelationCount;
+ static int closeRelationCount;
+ static int goldRelationCount;
+ static int closeGoldRelationCount;
public static void main(String[] args) throws Exception {
+ sysRelationCount = 0;
+ closeRelationCount = 0;
+ goldRelationCount = 0;
+ closeGoldRelationCount = 0;
+
TempRelOptions options = CliFactory.parseArguments(TempRelOptions.class, args);
List<Integer> trainItems = null;
List<Integer> devItems = null;
@@ -181,6 +194,9 @@ EvaluationOfTemporalRelations_ImplBase{
}else{
testing = devItems;
}
+
+ evaluation.printErrors = false;
+
//do closure on system, but not on gold, to calculate recall
evaluation.skipTrain = options.getSkipTrain();
if(evaluation.skipTrain && options.getTest()){
@@ -188,27 +204,32 @@ EvaluationOfTemporalRelations_ImplBase{
}else{
evaluation.prepareXMIsFor(patientSets);
}
+ evaluation.printErrors=true;
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("No closure on gold::Closure on System::Recall Mode");
System.err.println(params.stats);
+
+ System.err.println("System predict relations #: "+ sysRelationCount);
+ System.err.println("# of system relations whose arguments are close: "+ closeRelationCount);
+ System.err.println("Gold relations #: "+ goldRelationCount);
+ System.err.println("# of gold relations whose arguments are close: "+ closeGoldRelationCount);
//do closure on gold, but not on system, to calculate precision
- evaluation.skipTrain = true;
- recallModeEvaluation = false;
- params.stats = evaluation.trainAndTest(training, testing);//training);//
- // 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;
-// evaluation.printErrors = false;
- params.stats = evaluation.trainAndTest(training, testing);//training);//
- // 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);
+// evaluation.skipTrain = true;
+// recallModeEvaluation = false;
+// params.stats = evaluation.trainAndTest(training, testing);//training);//
+// // 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;
+// params.stats = evaluation.trainAndTest(training, testing);//training);//
+// // 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
@@ -281,17 +302,20 @@ EvaluationOfTemporalRelations_ImplBase{
if(!this.useGoldAttributes){
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveGoldAttributes.class));
}
+
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(PreserveEventEventRelations.class));
+
if (this.useClosure) {
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddClosure.class));//aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddTransitiveContainsRelations.class));
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddContain2Overlap.class));
// aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(AddTransitiveBeforeAndOnRelations.class));
}
- // aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonContainsRelations.class));
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(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));
//add unlabeled nearby system events as potential links:
@@ -335,7 +359,7 @@ EvaluationOfTemporalRelations_ImplBase{
}
// HideOutput hider = new HideOutput();
- 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"),"-w2","13","-w3","86","-c", optArray[1]);//"-w2","12","-w3","102",//"-w1","29","-w3","12","-w4","80","-w5","228","-w6","79","-w7","49","-w8","157","-w9","553","-w10","384",//"-w1","29","-w3","12","-w4","79","-w5","255","-w6","75","-w7","50","-w8","144","-w9","544","-w10","384",//"-w1","25","-w3","9","-w4","79","-w5","267","-w6","89","-w7","60","-w8","152","-w9","615","-w10","404",//"-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();
@@ -344,6 +368,7 @@ EvaluationOfTemporalRelations_ImplBase{
@Override
protected AnnotationStatistics<String> test(CollectionReader collectionReader, File directory)
throws Exception {
+ this.useClosure=false;
AggregateBuilder aggregateBuilder = this.getPreprocessorAggregateBuilder();
aggregateBuilder.add(CopyFromGold.getDescription(EventMention.class, TimeMention.class));
@@ -353,12 +378,11 @@ EvaluationOfTemporalRelations_ImplBase{
CAS.NAME_DEFAULT_SOFA,
RemoveCrossSentenceRelations.PARAM_RELATION_VIEW,
GOLD_VIEW_NAME));
-
+
aggregateBuilder.add(
AnalysisEngineFactory.createEngineDescription(PreserveEventEventRelations.class),
CAS.NAME_DEFAULT_SOFA,
GOLD_VIEW_NAME);
- aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonUMLSEvents.class));
if (!recallModeEvaluation && this.useClosure) { //closure for gold
aggregateBuilder.add(
@@ -366,10 +390,19 @@ EvaluationOfTemporalRelations_ImplBase{
CAS.NAME_DEFAULT_SOFA,
GOLD_VIEW_NAME);
}
+
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonContainsRelations.class),
+ CAS.NAME_DEFAULT_SOFA,
+ GOLD_VIEW_NAME);
+
+// aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveNonUMLSEvents.class));
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveRelations.class));
aggregateBuilder.add(this.baseline ? RecallBaselineEventTimeRelationAnnotator.createAnnotatorDescription(directory) :
EventEventRelationAnnotator.createAnnotatorDescription(new File(directory,"event-event")));
+
+ //count how many system predicted relations, their arguments are close to each other, without any other event in between
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(CountCloseRelation.class));
if(this.i2b2Output != null){
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(WriteI2B2XML.class, WriteI2B2XML.PARAM_OUTPUT_DIR, this.i2b2Output), "TimexView", CAS.NAME_DEFAULT_SOFA);
@@ -464,6 +497,66 @@ EvaluationOfTemporalRelations_ImplBase{
outDrop.close();
return stats;
}
+
+ public static class CountCloseRelation extends JCasAnnotator_ImplBase {
+
+ private String systemViewName = CAS.NAME_DEFAULT_SOFA;
+
+ @Override
+ public void process(JCas jCas) throws AnalysisEngineProcessException {
+ JCas systemView, goldView;
+ int sizeLimit = 6;
+ try {
+ systemView = jCas.getView(this.systemViewName);
+ goldView = jCas.getView(GOLD_VIEW_NAME);
+ } catch (CASException e) {
+ throw new AnalysisEngineProcessException(e);
+ }
+
+ //count how many sentences have timex, and how many sentences have only one timex
+ for (TemporalTextRelation relation : JCasUtil.select(systemView, TemporalTextRelation.class)) {
+ sysRelationCount ++;
+ Annotation arg1 = relation.getArg1().getArgument();
+ Annotation arg2 = relation.getArg2().getArgument();
+ if( arg1.getBegin()> arg2.getBegin()){
+ Annotation temp = arg1;
+ arg1 = arg2;
+ arg2 = temp;
+ }
+ List<WordToken> words = JCasUtil.selectBetween(systemView, WordToken.class, arg1, arg2);
+ if(words.size()<sizeLimit){
+ closeRelationCount++;
+ }
+ }
+
+ Map<List<Annotation>, TemporalTextRelation> relationLookup = new HashMap<>();
+ for (TemporalTextRelation relation : Lists.newArrayList(JCasUtil.select(goldView, 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
+ List<Annotation> key = Arrays.asList(arg1, arg2);
+ if(!relationLookup.containsKey(key)){
+ relationLookup.put(key, relation);
+ }
+ }
+
+ //count how many sentences have timex, and how many sentences have only one timex
+ for (TemporalTextRelation relation : relationLookup.values()) {
+ goldRelationCount ++;
+ Annotation arg1 = relation.getArg1().getArgument();
+ Annotation arg2 = relation.getArg2().getArgument();
+ if( arg1.getBegin()> arg2.getBegin()){
+ Annotation temp = arg1;
+ arg1 = arg2;
+ arg2 = temp;
+ }
+ List<WordToken> words = JCasUtil.selectBetween(systemView, WordToken.class, arg1, arg2);
+ if(words.size()<sizeLimit){
+ closeGoldRelationCount++;
+ }
+ }
+ }
+ }
public static class RemoveNonUMLSEvents extends org.apache.uima.fit.component.JCasAnnotator_ImplBase {
public static final String PARAM_GOLD_VIEW = "GoldView";
@@ -523,6 +616,8 @@ EvaluationOfTemporalRelations_ImplBase{
throw new AnalysisEngineProcessException(e);
}
+ Set<List<EventMention>> relationLookup = new HashSet<>();
+
Map<EventMention, Collection<EventMention>> coveringMap =
JCasUtil.indexCovering(relationView, EventMention.class, EventMention.class);
for(TemporalTextRelation relation : Lists.newArrayList(JCasUtil.select(relationView, TemporalTextRelation.class))){
@@ -532,19 +627,42 @@ EvaluationOfTemporalRelations_ImplBase{
EventMention event1 = (EventMention) arg1;
EventMention event2 = (EventMention) arg2;
for(EventMention covEventA : coveringMap.get(event1)){
+ List<EventMention> key = Arrays.asList(covEventA, event2);
+ if(!relationLookup.contains(key) && !hasOverlap(covEventA,event2)){
+ relationLookup.add(key);
+ createRelation(relationView, covEventA, event2, relation.getCategory());
+ }
for(EventMention covEventB : coveringMap.get(event2)){
- createRelation(relationView, covEventA, covEventB, relation.getCategory());
+ key = Arrays.asList(covEventA, covEventB);
+ if(!relationLookup.contains(key) && !hasOverlap(covEventA,covEventB)){
+ relationLookup.add(key);
+ createRelation(relationView, covEventA, covEventB, relation.getCategory());
+ }
}
- createRelation(relationView, covEventA, event2, relation.getCategory());
}
for(EventMention covEventB : coveringMap.get(event2)){
- createRelation(relationView, event1, covEventB, relation.getCategory());
+ List<EventMention> key = Arrays.asList(event1, covEventB);
+ if(!relationLookup.contains(key) && !hasOverlap(event1,covEventB)){
+ relationLookup.add(key);
+ createRelation(relationView, event1, covEventB, relation.getCategory());
+ }
}
}
}
}
+
+ private static boolean hasOverlap(Annotation event1, Annotation event2) {
+ if(event1.getEnd()>=event2.getBegin()&&event1.getEnd()<=event2.getEnd()){
+ return true;
+ }
+ if(event2.getEnd()>=event1.getBegin()&&event2.getEnd()<=event1.getEnd()){
+ return true;
+ }
+ return false;
+ }
+
private static void createRelation(JCas jCas, Annotation arg1,
Annotation arg2, String category) {
RelationArgument relArg1 = new RelationArgument(jCas);
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java?rev=1677203&r1=1677202&r2=1677203&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java Fri May 1 18:30:30 2015
@@ -218,8 +218,8 @@ Evaluation_ImplBase<Map<String, Annotati
EventMention event = goldEvents.get(i);
int begin = event.getBegin();
int end = event.getEnd();
- int windowBegin = Math.max(0, begin - 50);
- int windowEnd = Math.min(text.length(), end + 50);
+ int windowBegin = Math.max(0, begin - 100);
+ int windowEnd = Math.min(text.length(), end + 100);
if (!goldOutcome.equals(systemOutcome)) {
this.loggers.get(name).fine(String.format(
"%s was %s but should be %s, in ...%s[!%s!:%d-%d]%s...",
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=1677203&r1=1677202&r2=1677203&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 Fri May 1 18:30:30 2015
@@ -41,7 +41,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.EvaluationOfTemporalRelations_ImplBase.RemoveNonContainsRelations.RemoveGoldAttributes;
+import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveGoldAttributes;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.WriteI2B2XML;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.XMLFormat;
import org.apache.ctakes.temporal.utils.AnnotationIdCollection;
@@ -49,6 +49,7 @@ import org.apache.ctakes.temporal.utils.
import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
import org.apache.ctakes.typesystem.type.relation.RelationArgument;
import org.apache.ctakes.typesystem.type.relation.TemporalTextRelation;
+import org.apache.ctakes.typesystem.type.syntax.WordToken;
//import org.apache.ctakes.typesystem.type.relation.TemporalTextRelation;
import org.apache.ctakes.typesystem.type.textsem.EventMention;
import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
@@ -127,8 +128,18 @@ EvaluationOfTemporalRelations_ImplBase{
protected static ParameterSettings ftParams = new ParameterSettings(DEFAULT_BOTH_DIRECTIONS, DEFAULT_DOWNSAMPLE, "tk",
1.0, 0.1, "radial basis function", ComboOperator.SUM, 0.5, 0.5);
private static Boolean recallModeEvaluation = true;
+
+ static int sysRelationCount;
+ static int closeRelationCount;
+ static int goldRelationCount;
+ static int closeGoldRelationCount;
public static void main(String[] args) throws Exception {
+ sysRelationCount = 0;
+ closeRelationCount = 0;
+ goldRelationCount = 0;
+ closeGoldRelationCount = 0;
+
TempRelOptions options = CliFactory.parseArguments(TempRelOptions.class, args);
List<Integer> trainItems = null;
List<Integer> devItems = null;
@@ -191,26 +202,31 @@ EvaluationOfTemporalRelations_ImplBase{
evaluation.prepareXMIsFor(patientSets);
}
+ evaluation.printErrors = true;
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("No closure on gold::Closure on System::Recall Mode");
System.err.println(params.stats);
+ System.err.println("System predict relations #: "+ sysRelationCount);
+ System.err.println("# of system relations whose arguments are close: "+ closeRelationCount);
+ System.err.println("Gold relations #: "+ goldRelationCount);
+ System.err.println("# of gold relations whose arguments are close: "+ closeGoldRelationCount);
//do closure on gold, but not on system, to calculate precision
- evaluation.skipTrain = true;
- recallModeEvaluation = false;
- params.stats = evaluation.trainAndTest(training, testing);//training);//
- // 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;
- params.stats = evaluation.trainAndTest(training, testing);//training);//
- // 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);
+// evaluation.skipTrain = true;
+// recallModeEvaluation = false;
+// params.stats = evaluation.trainAndTest(training, testing);//training);//
+// // 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;
+// params.stats = evaluation.trainAndTest(training, testing);//training);//
+// // 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
@@ -294,6 +310,9 @@ EvaluationOfTemporalRelations_ImplBase{
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(Overlap2Contains.class));
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(RemoveEventEventRelations.class));
+
+ //count how many sentences have timex, and how many sentences have only one timex
+ //aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(CountSentenceContainsTimes.class));
//add unlabeled nearby system events as potential links:
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddPotentialRelations.class));
@@ -345,6 +364,7 @@ EvaluationOfTemporalRelations_ImplBase{
@Override
protected AnnotationStatistics<String> test(CollectionReader collectionReader, File directory)
throws Exception {
+ this.useClosure=false;//don't do closure for test
AggregateBuilder aggregateBuilder = this.getPreprocessorAggregateBuilder();
aggregateBuilder.add(CopyFromGold.getDescription(EventMention.class, TimeMention.class));
@@ -367,10 +387,13 @@ EvaluationOfTemporalRelations_ImplBase{
CAS.NAME_DEFAULT_SOFA,
GOLD_VIEW_NAME);
// 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")));
+
+ //count how many system predicted relations, their arguments are close to each other, without any other event in between
+ aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(CountCloseRelation.class));
if(this.i2b2Output != null){
aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(WriteI2B2XML.class, WriteI2B2XML.PARAM_OUTPUT_DIR, this.i2b2Output), "TimexView", CAS.NAME_DEFAULT_SOFA);
@@ -791,7 +814,102 @@ EvaluationOfTemporalRelations_ImplBase{
}
}
}
+ /**
+ public static class CountSentenceContainsTimes extends JCasAnnotator_ImplBase {
+
+ public static final String PARAM_SENTENCE_VIEW = "SentenceView";
+
+ @ConfigurationParameter(name = PARAM_SENTENCE_VIEW,mandatory=false)
+ private String sentenceViewName = CAS.NAME_DEFAULT_SOFA;
+
+ public static final String PARAM_RELATION_VIEW = "RelationView";
+
+ @ConfigurationParameter(name = PARAM_RELATION_VIEW,mandatory=false)
+ private String relationViewName = CAS.NAME_DEFAULT_SOFA;
+
+ @Override
+ public void process(JCas jCas) throws AnalysisEngineProcessException {
+ JCas sentenceView, relationView;
+ try {
+ sentenceView = jCas.getView(this.sentenceViewName);
+ relationView = jCas.getView(this.relationViewName);
+ } catch (CASException e) {
+ throw new AnalysisEngineProcessException(e);
+ }
+
+ //count how many sentences have timex, and how many sentences have only one timex
+ for (Sentence sentence : JCasUtil.select(sentenceView, Sentence.class)) {
+ List<TimeMention> tmentions = JCasUtil.selectCovered(relationView, TimeMention.class, sentence);
+ int timeCount = tmentions==null? 0: tmentions.size();
+ if(timeCount > 0){
+ sentHasTimeCount ++;
+ if(timeCount == 1){
+ sentHasOneTimeCount ++;
+ }
+ }
+ }
+ }
+ }*/
+
+ public static class CountCloseRelation extends JCasAnnotator_ImplBase {
+
+ private String systemViewName = CAS.NAME_DEFAULT_SOFA;
+
+ @Override
+ public void process(JCas jCas) throws AnalysisEngineProcessException {
+ JCas systemView, goldView;
+ int sizeLimit = 6;
+ try {
+ systemView = jCas.getView(this.systemViewName);
+ goldView = jCas.getView(GOLD_VIEW_NAME);
+ } catch (CASException e) {
+ throw new AnalysisEngineProcessException(e);
+ }
+
+ //count how many sentences have timex, and how many sentences have only one timex
+ for (TemporalTextRelation relation : JCasUtil.select(systemView, TemporalTextRelation.class)) {
+ sysRelationCount ++;
+ Annotation arg1 = relation.getArg1().getArgument();
+ Annotation arg2 = relation.getArg2().getArgument();
+ if( arg1.getBegin()> arg2.getBegin()){
+ Annotation temp = arg1;
+ arg1 = arg2;
+ arg2 = temp;
+ }
+ List<WordToken> words = JCasUtil.selectBetween(systemView, WordToken.class, arg1, arg2);
+ if(words.size()<sizeLimit){
+ closeRelationCount++;
+ }
+ }
+
+ Map<List<Annotation>, TemporalTextRelation> relationLookup = new HashMap<>();
+ for (TemporalTextRelation relation : Lists.newArrayList(JCasUtil.select(goldView, 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
+ List<Annotation> key = Arrays.asList(arg1, arg2);
+ if(!relationLookup.containsKey(key)){
+ relationLookup.put(key, relation);
+ }
+ }
+ //count how many sentences have timex, and how many sentences have only one timex
+ for (TemporalTextRelation relation : relationLookup.values()) {
+ goldRelationCount ++;
+ Annotation arg1 = relation.getArg1().getArgument();
+ Annotation arg2 = relation.getArg2().getArgument();
+ if( arg1.getBegin()> arg2.getBegin()){
+ Annotation temp = arg1;
+ arg1 = arg2;
+ arg2 = temp;
+ }
+ List<WordToken> words = JCasUtil.selectBetween(systemView, WordToken.class, arg1, arg2);
+ if(words.size()<sizeLimit){
+ closeGoldRelationCount++;
+ }
+ }
+ }
+ }
public static class RemoveRelations extends JCasAnnotator_ImplBase {
@Override
@@ -1027,12 +1145,23 @@ EvaluationOfTemporalRelations_ImplBase{
*
*/
public static class Overlap2Contains extends JCasAnnotator_ImplBase {
+
+ public static final String PARAM_RELATION_VIEW = "RelationView";
+
+ @ConfigurationParameter(name = PARAM_RELATION_VIEW,mandatory=false)
+ private String relationViewName = CAS.NAME_DEFAULT_SOFA;
@Override
public void process(JCas jCas) throws AnalysisEngineProcessException {
+ JCas relationView;
+ try {
+ relationView = jCas.getView(this.relationViewName);
+ } catch (CASException e) {
+ throw new AnalysisEngineProcessException(e);
+ }
Map<List<Annotation>, BinaryTextRelation> relationLookup;
relationLookup = new HashMap<>();
- for (BinaryTextRelation relation : JCasUtil.select(jCas, BinaryTextRelation.class)) {
+ for (BinaryTextRelation relation : Lists.newArrayList(JCasUtil.select(relationView, BinaryTextRelation.class))) {
Annotation arg1 = relation.getArg1().getArgument();
Annotation arg2 = relation.getArg2().getArgument();
String relationType = relation.getCategory();
@@ -1042,16 +1171,39 @@ EvaluationOfTemporalRelations_ImplBase{
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") ){
+ if(relationType.startsWith("OVERLAP") ){//current relation is too general, remove it
+ relation.getArg1().removeFromIndexes();
+ relation.getArg2().removeFromIndexes();
+ relation.removeFromIndexes();
+ }else if( reln.startsWith("OVERLAP") ){//stored relation is too general, remove it
//remove duplicate:
- storedRel.setCategory(relationType);
+ storedRel.getArg1().removeFromIndexes();
+ storedRel.getArg2().removeFromIndexes();
+ storedRel.removeFromIndexes();
+ relationLookup.put(key, relation);
+ }else if(relationType.startsWith("CONTAINS")){//contain is dominant
+ storedRel.getArg1().removeFromIndexes();
+ storedRel.getArg2().removeFromIndexes();
+ storedRel.removeFromIndexes(jCas);
+ relationLookup.put(key, relation);
+ }else if(reln.startsWith("CONTAINS")){
+ relation.getArg1().removeFromIndexes();
+ relation.getArg2().removeFromIndexes();
+ relation.removeFromIndexes(jCas);
+ }else{
+ relation.getArg1().removeFromIndexes();
+ relation.getArg2().removeFromIndexes();
+ relation.removeFromIndexes();
}
+ }else{//if there is no conflicting, remove duplicating relations
+ relation.getArg1().removeFromIndexes();
+ relation.getArg2().removeFromIndexes();
+ relation.removeFromIndexes(jCas);
}
+ }else{//if the relation is new, then added it to lookup
+ relationLookup.put(key, relation);
}
- relationLookup.put(key, relation);
+
}
}
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfI2B2TemporalRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfI2B2TemporalRelations.java?rev=1677203&r1=1677202&r2=1677203&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfI2B2TemporalRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfI2B2TemporalRelations.java Fri May 1 18:30:30 2015
@@ -46,7 +46,7 @@ import org.apache.ctakes.temporal.ae.bas
import org.apache.ctakes.temporal.eval.EvaluationOfEventEventThymeRelations.AddEEPotentialRelations;
import org.apache.ctakes.temporal.eval.EvaluationOfEventTimeRelations.AddPotentialRelations;
import org.apache.ctakes.temporal.eval.EvaluationOfEventTimeRelations.ParameterSettings;
-import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveNonContainsRelations.RemoveGoldAttributes;
+import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveGoldAttributes;
import org.apache.ctakes.temporal.utils.AnnotationIdCollection;
import org.apache.ctakes.temporal.utils.TLinkTypeArray2;
import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfSelfEventTimeRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfSelfEventTimeRelations.java?rev=1677203&r1=1677202&r2=1677203&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfSelfEventTimeRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfSelfEventTimeRelations.java Fri May 1 18:30:30 2015
@@ -43,7 +43,7 @@ import org.apache.ctakes.temporal.ae.Eve
//import org.apache.ctakes.temporal.ae.EventEventRelationAnnotator;
import org.apache.ctakes.temporal.ae.baselines.RecallBaselineEventTimeRelationAnnotator;
import org.apache.ctakes.temporal.eval.EvaluationOfEventTimeRelations.ParameterSettings;
-import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveNonContainsRelations.RemoveGoldAttributes;
+import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveGoldAttributes;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.WriteI2B2XML;
//import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.XMLFormat;
import org.apache.ctakes.temporal.utils.AnnotationIdCollection;
Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java?rev=1677203&r1=1677202&r2=1677203&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java Fri May 1 18:30:30 2015
@@ -128,30 +128,32 @@ Evaluation_ImplBase<AnnotationStatistics
for (BinaryTextRelation relation : Lists.newArrayList(JCasUtil.select(
relationView,
BinaryTextRelation.class))) {
- if (!relation.getCategory().startsWith("CONTAINS")) {
+ RelationArgument arg1 = relation.getArg1();
+ RelationArgument arg2 = relation.getArg2();
+ if (arg1.getArgument()instanceof EventMention && arg2.getArgument()instanceof EventMention && !relation.getCategory().startsWith("CONTAINS")) {
relation.getArg1().removeFromIndexes();
relation.getArg2().removeFromIndexes();
relation.removeFromIndexes();
}
}
}
-
- public static class RemoveGoldAttributes extends JCasAnnotator_ImplBase {
- @Override
- public void process(JCas jCas) throws AnalysisEngineProcessException {
- for(EventMention event : JCasUtil.select(jCas, EventMention.class)){
- if(event.getEvent() != null && event.getEvent().getProperties() != null){
- event.getEvent().getProperties().setContextualAspect("UNK");
- event.getEvent().getProperties().setContextualModality("UNK");
- }
- }
- for(TimeMention timex : JCasUtil.select(jCas, TimeMention.class)){
- timex.setTimeClass("UNK");
+ }
+ public static class RemoveGoldAttributes extends JCasAnnotator_ImplBase {
+ @Override
+ public void process(JCas jCas) throws AnalysisEngineProcessException {
+ for(EventMention event : JCasUtil.select(jCas, EventMention.class)){
+ if(event.getEvent() != null && event.getEvent().getProperties() != null){
+ event.getEvent().getProperties().setContextualAspect("UNK");
+ event.getEvent().getProperties().setContextualModality("UNK");
}
}
+ for(TimeMention timex : JCasUtil.select(jCas, TimeMention.class)){
+ timex.setTimeClass("UNK");
+ }
}
}
+
protected static Collection<BinaryTextRelation> correctArgOrder(
Collection<BinaryTextRelation> systemRelations,
Collection<BinaryTextRelation> goldRelations) {