You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by tm...@apache.org on 2013/06/14 21:15:56 UTC

svn commit: r1493218 - /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java

Author: tmill
Date: Fri Jun 14 19:15:56 2013
New Revision: 1493218

URL: http://svn.apache.org/r1493218
Log:
Added CRF Time span annotator to time eval.

Modified:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java?rev=1493218&r1=1493217&r2=1493218&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java Fri Jun 14 19:15:56 2013
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 
+import org.apache.ctakes.temporal.ae.CRFTimeAnnotator;
 import org.apache.ctakes.temporal.ae.ConstituencyBasedTimeAnnotator;
 import org.apache.ctakes.temporal.ae.TimeAnnotator;
 import org.apache.ctakes.typesystem.type.textsem.TimeMention;
@@ -33,12 +34,16 @@ import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.tcas.Annotation;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.cleartk.classifier.CleartkAnnotator;
+import org.cleartk.classifier.CleartkSequenceAnnotator;
+import org.cleartk.classifier.crfsuite.CRFSuiteStringOutcomeDataWriter;
 import org.cleartk.classifier.jar.DefaultDataWriterFactory;
+import org.cleartk.classifier.jar.DefaultSequenceDataWriterFactory;
 import org.cleartk.classifier.jar.DirectoryDataWriterFactory;
 import org.cleartk.classifier.jar.GenericJarClassifierFactory;
 import org.cleartk.classifier.jar.JarClassifierBuilder;
 import org.cleartk.classifier.liblinear.LIBLINEARStringOutcomeDataWriter;
 import org.cleartk.eval.AnnotationStatistics;
+import org.uimafit.component.JCasAnnotator_ImplBase;
 import org.uimafit.factory.AnalysisEngineFactory;
 
 import com.google.common.base.Function;
@@ -56,16 +61,18 @@ public class EvaluationOfTimeSpans exten
     List<Integer> devItems = THYMEData.getDevPatientSets(patientSets);
     
     // specify the annotator classes to use
-    List<Class<? extends CleartkAnnotator<String>>> annotatorClasses = Lists.newArrayList();
+    List<Class<? extends JCasAnnotator_ImplBase>> annotatorClasses = Lists.newArrayList();
     annotatorClasses.add(TimeAnnotator.class);
     annotatorClasses.add(ConstituencyBasedTimeAnnotator.class);
-    Map<Class<? extends CleartkAnnotator<String>>, String[]> annotatorTrainingArguments = Maps.newHashMap();
+    annotatorClasses.add(CRFTimeAnnotator.class);
+    Map<Class<? extends JCasAnnotator_ImplBase>, String[]> annotatorTrainingArguments = Maps.newHashMap();
     annotatorTrainingArguments.put(TimeAnnotator.class, new String[]{"-c", "0.1"});
     annotatorTrainingArguments.put(ConstituencyBasedTimeAnnotator.class, new String[]{"-c", "0.1"});
+    annotatorTrainingArguments.put(CRFTimeAnnotator.class, new String[]{});
     
     // run one evaluation per annotator class
     final Map<Class<?>, AnnotationStatistics<?>> annotatorStats = Maps.newHashMap();
-    for (Class<? extends CleartkAnnotator<String>> annotatorClass : annotatorClasses) {
+    for (Class<? extends JCasAnnotator_ImplBase> annotatorClass : annotatorClasses) {
       EvaluationOfTimeSpans evaluation = new EvaluationOfTimeSpans(
           new File("target/eval/time-spans"),
           options.getRawTextDirectory(),
@@ -82,11 +89,11 @@ public class EvaluationOfTimeSpans exten
     }
 
     // allow ordering of models by F1
-    Ordering<Class<? extends CleartkAnnotator<String>>> byF1 = Ordering.natural().onResultOf(
-      new Function<Class<? extends CleartkAnnotator<String>>, Double>() {
+    Ordering<Class<? extends JCasAnnotator_ImplBase>> byF1 = Ordering.natural().onResultOf(
+      new Function<Class<? extends JCasAnnotator_ImplBase>, Double>() {
         @Override
         public Double apply(
-            Class<? extends CleartkAnnotator<String>> annotatorClass) {
+            Class<? extends JCasAnnotator_ImplBase> annotatorClass) {
           return annotatorStats.get(annotatorClass).f1();
         }
       });
@@ -98,7 +105,7 @@ public class EvaluationOfTimeSpans exten
     }
   }
 
-  private Class<? extends CleartkAnnotator<String>> annotatorClass;
+  private Class<? extends JCasAnnotator_ImplBase> annotatorClass;
 
   private String[] trainingArguments;
 
@@ -108,7 +115,7 @@ public class EvaluationOfTimeSpans exten
       File knowtatorXMLDirectory,
       File xmiDirectory,
       File treebankDirectory,
-      Class<? extends CleartkAnnotator<String>> annotatorClass,
+      Class<? extends JCasAnnotator_ImplBase> annotatorClass,
       String[] trainingArguments) {
     super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, treebankDirectory, TimeMention.class);
     this.annotatorClass = annotatorClass;
@@ -118,14 +125,27 @@ public class EvaluationOfTimeSpans exten
   @Override
   protected AnalysisEngineDescription getDataWriterDescription(File directory)
       throws ResourceInitializationException {
-    return AnalysisEngineFactory.createPrimitiveDescription(
-        this.annotatorClass,
-        CleartkAnnotator.PARAM_IS_TRAINING,
-        true,
-        DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
-        LIBLINEARStringOutcomeDataWriter.class,
-        DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
-        this.getModelDirectory(directory));
+    if(CleartkAnnotator.class.isAssignableFrom(this.annotatorClass)){
+      return AnalysisEngineFactory.createPrimitiveDescription(
+          this.annotatorClass,
+          CleartkAnnotator.PARAM_IS_TRAINING,
+          true,
+          DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+          LIBLINEARStringOutcomeDataWriter.class,
+          DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+          this.getModelDirectory(directory));
+    }else if(CleartkSequenceAnnotator.class.isAssignableFrom(this.annotatorClass)){
+      return AnalysisEngineFactory.createPrimitiveDescription(
+          this.annotatorClass,
+          CleartkSequenceAnnotator.PARAM_IS_TRAINING,
+          true,
+          DefaultSequenceDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+          CRFSuiteStringOutcomeDataWriter.class,
+          DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+          this.getModelDirectory(directory));
+    }else{
+      throw new ResourceInitializationException("Annotator class was not recognized as an acceptable class!", new Object[]{});
+    }
   }
 
   @Override