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 2014/10/14 21:45:17 UTC

svn commit: r1631855 - /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/pipelines/FullTemporalExtractionPipeline.java

Author: tmill
Date: Tue Oct 14 19:45:16 2014
New Revision: 1631855

URL: http://svn.apache.org/r1631855
Log:
CTAKES-82: Added additional pipelines to full temporal pipeline.

Modified:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/pipelines/FullTemporalExtractionPipeline.java

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/pipelines/FullTemporalExtractionPipeline.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/pipelines/FullTemporalExtractionPipeline.java?rev=1631855&r1=1631854&r2=1631855&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/pipelines/FullTemporalExtractionPipeline.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/pipelines/FullTemporalExtractionPipeline.java Tue Oct 14 19:45:16 2014
@@ -19,17 +19,27 @@
 package org.apache.ctakes.temporal.pipelines;
 
 import java.io.File;
+import java.util.List;
 
 import org.apache.ctakes.core.cr.FilesInDirectoryCollectionReader;
 import org.apache.ctakes.temporal.ae.BackwardsTimeAnnotator;
+import org.apache.ctakes.temporal.ae.CoreferenceChainAnnotator;
+import org.apache.ctakes.temporal.ae.DocTimeRelAnnotator;
 import org.apache.ctakes.temporal.ae.EventAnnotator;
+import org.apache.ctakes.temporal.ae.EventCoreferenceAnnotator;
 import org.apache.ctakes.temporal.ae.EventEventRelationAnnotator;
 import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
+import org.apache.ctakes.typesystem.type.textsem.EventMention;
 import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
 import org.apache.uima.collection.CollectionReader;
+import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
 import org.apache.uima.fit.factory.AggregateBuilder;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
 import org.apache.uima.fit.factory.CollectionReaderFactory;
 import org.apache.uima.fit.pipeline.SimplePipeline;
+import org.apache.uima.fit.util.JCasUtil;
+import org.apache.uima.jcas.JCas;
 
 import com.lexicalscope.jewel.cli.CliFactory;
 import com.lexicalscope.jewel.cli.Option;
@@ -41,16 +51,22 @@ public class FullTemporalExtractionPipel
     @Option(
         shortName = "e",
         description = "specify the path to the directory where the trained event model is located",
-        defaultValue="target/eval/event-spans/train_and_test/")
+        defaultValue="org/apache/ctakes/temporal/ae/eventannotator/")
     public String getEventModelDirectory();
     
     @Option(
         shortName = "t",
         description = "specify the path to the directory where the trained event model is located",
-        defaultValue="target/eval/time-spans/train_and_test/BackwardsTimeAnnotator/")
+        defaultValue="/org/apache/ctakes/temporal/ae/timeannotator/")
     public String getTimeModelDirectory();
     
     @Option(
+        shortName = "d",
+        description = "specify the path to the directory where the trained event-doctime relation model is located",
+        defaultValue="/org/apache/ctakes/temporal/ae/doctimerel")
+    public String getDoctimerelModelDirectory();
+    
+    @Option(
         shortName = "r",
         description = "Specify the path to the directory where the trained event-time relation model is located",
         defaultValue="target/eval/temporal-relations/event-time/train_and_test/")
@@ -61,6 +77,12 @@ public class FullTemporalExtractionPipel
         description = "Specify the path to the directory where the trained event-event relation model is located",
         defaultToNull=true) // add in default value once we have a satisfying trained model
     public String getEventEventRelationModelDirectory();  
+    
+    @Option(
+        shortName = "c",
+        description = "Specify the path to the directory where the trained coreference model is located",
+        defaultToNull=true)
+    public String getCoreferenceModelDirectory();
   }
 
   /**
@@ -75,13 +97,19 @@ public class FullTemporalExtractionPipel
         FilesInDirectoryCollectionReader.PARAM_INPUTDIR,
         options.getInputDirectory());
 
-    AggregateBuilder aggregateBuilder = getLightweightPreprocessorAggregateBuilder();
-    aggregateBuilder.add(EventAnnotator.createAnnotatorDescription(new File(options.getEventModelDirectory())));
-    aggregateBuilder.add(BackwardsTimeAnnotator.createAnnotatorDescription(options.getTimeModelDirectory() + File.pathSeparator + "model.jar"));
+    AggregateBuilder aggregateBuilder = getPreprocessorAggregateBuilder();
+    aggregateBuilder.add(EventAnnotator.createAnnotatorDescription());
+    aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(CopyPropertiesToTemporalEventAnnotator.class));
+    aggregateBuilder.add(DocTimeRelAnnotator.createAnnotatorDescription(options.getDoctimerelModelDirectory() + File.separator + "model.jar"));
+    aggregateBuilder.add(BackwardsTimeAnnotator.createAnnotatorDescription(options.getTimeModelDirectory() + File.separator + "model.jar"));
     aggregateBuilder.add(EventTimeRelationAnnotator.createAnnotatorDescription(options.getEventTimeRelationModelDirectory() + File.separator + "model.jar"));
     if(options.getEventEventRelationModelDirectory()!=null){
       aggregateBuilder.add(EventEventRelationAnnotator.createAnnotatorDescription(options.getEventEventRelationModelDirectory() + File.separator + "model.jar"));
     }
+    if(options.getCoreferenceModelDirectory()!=null){
+      aggregateBuilder.add(EventCoreferenceAnnotator.createAnnotatorDescription(options.getCoreferenceModelDirectory() + File.separator + "model.jar"));
+      aggregateBuilder.add(CoreferenceChainAnnotator.createAnnotatorDescription());
+    }
     
     //aggregateBuilder.createEngineDescription().toXML(new FileWriter("desc/analysis_engine/TemporalAggregateUMLSPipeline.xml"));
     AnalysisEngine xWriter = getXMIWriter(options.getOutputDirectory());
@@ -92,4 +120,36 @@ public class FullTemporalExtractionPipel
         xWriter);
   }
 
+  public static class CopyPropertiesToTemporalEventAnnotator extends JCasAnnotator_ImplBase {
+
+    @Override
+    public void process(JCas jcas) throws AnalysisEngineProcessException {
+      for(EventMention mention : JCasUtil.select(jcas, EventMention.class)){
+        // get temporal event mentions and not dictinoary-derived subclasses
+        // find either an exact matching span, or an end-matching span with the smallest overlap
+        if(mention.getClass().equals(EventMention.class)){
+          EventMention bestCovering = null;
+          int smallestSpan = Integer.MAX_VALUE;
+          for(EventMention covering : JCasUtil.selectCovering(EventMention.class, mention)){
+            if(covering.getClass().equals(EventMention.class)) continue;
+            if(covering.getBegin() == mention.getBegin() && covering.getEnd() == mention.getEnd()){
+              bestCovering = covering;
+              break;
+            }else if(covering.getEnd() == mention.getEnd()){
+              int span = covering.getEnd() - covering.getBegin();
+              if(span < smallestSpan){
+                span = smallestSpan;
+                bestCovering = covering;
+              }
+            }
+          }
+          if(bestCovering != null){
+            mention.setPolarity(bestCovering.getPolarity());
+//            mention.getEvent().getProperties().setPolarity(bestCovering.getPolarity());
+            mention.setUncertainty(bestCovering.getUncertainty());
+          }
+        }
+      }
+    }
+  }
 }