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 2013/08/16 23:04:57 UTC

svn commit: r1514895 - in /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae: EventTimeRelationAnnotator.java feature/DependencyFeatureExtractor.java

Author: clin
Date: Fri Aug 16 21:04:57 2013
New Revision: 1514895

URL: http://svn.apache.org/r1514895
Log:
ctakes-temporal: add dependency features for event-time pairs

Added:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/DependencyFeatureExtractor.java   (with props)
Modified:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeRelationAnnotator.java

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeRelationAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeRelationAnnotator.java?rev=1514895&r1=1514894&r2=1514895&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeRelationAnnotator.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeRelationAnnotator.java Fri Aug 16 21:04:57 2013
@@ -9,6 +9,7 @@ import org.apache.ctakes.relationextract
 import org.apache.ctakes.relationextractor.ae.features.PartOfSpeechFeaturesExtractor;
 import org.apache.ctakes.relationextractor.ae.features.RelationFeaturesExtractor;
 import org.apache.ctakes.relationextractor.ae.features.TokenFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.DependencyFeatureExtractor;
 import org.apache.ctakes.temporal.ae.feature.NearestFlagFeatureExtractor;
 //import org.apache.ctakes.temporal.ae.feature.TemporalAttributeFeatureExtractor;
 import org.apache.ctakes.temporal.ae.feature.treekernel.EventTimeFlatTreeFeatureExtractor;
@@ -35,85 +36,86 @@ import com.google.common.collect.Lists;
 
 public class EventTimeRelationAnnotator extends RelationExtractorAnnotator {
 
-  public static AnalysisEngineDescription createDataWriterDescription(
-      Class<? extends DataWriter<String>> dataWriterClass,
-      File outputDirectory,
-      double probabilityOfKeepingANegativeExample) throws ResourceInitializationException {
-    return AnalysisEngineFactory.createPrimitiveDescription(
-        EventTimeRelationAnnotator.class,
-        CleartkAnnotator.PARAM_IS_TRAINING,
-        true,
-        DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
-        dataWriterClass,
-        DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
-        outputDirectory,
-        RelationExtractorAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
-        // not sure why this has to be cast; something funny going on in uimaFIT maybe?
-        (float) probabilityOfKeepingANegativeExample);
-  }
-
-  public static AnalysisEngineDescription createAnnotatorDescription(File modelDirectory)
-      throws ResourceInitializationException {
-    return AnalysisEngineFactory.createPrimitiveDescription(
-        EventTimeRelationAnnotator.class,
-        CleartkAnnotator.PARAM_IS_TRAINING,
-        false,
-        GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH,
-        new File(modelDirectory, "model.jar"));
-  }
-
-  @Override
-  protected List<RelationFeaturesExtractor> getFeatureExtractors() {
-    return Lists.newArrayList(
-    						  new TokenFeaturesExtractor()
-    						, new PartOfSpeechFeaturesExtractor()
-//    						, new TemporalAttributeFeatureExtractor()
-    						, new EventTimeFlatTreeFeatureExtractor()
-    						, new TemporalPETExtractor()
-    						, new TemporalPathExtractor()
-    						, new NearestFlagFeatureExtractor()
-    						);
-  }
+	public static AnalysisEngineDescription createDataWriterDescription(
+			Class<? extends DataWriter<String>> dataWriterClass,
+					File outputDirectory,
+					double probabilityOfKeepingANegativeExample) throws ResourceInitializationException {
+		return AnalysisEngineFactory.createPrimitiveDescription(
+				EventTimeRelationAnnotator.class,
+				CleartkAnnotator.PARAM_IS_TRAINING,
+				true,
+				DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+				dataWriterClass,
+				DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+				outputDirectory,
+				RelationExtractorAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+				// not sure why this has to be cast; something funny going on in uimaFIT maybe?
+				(float) probabilityOfKeepingANegativeExample);
+	}
+
+	public static AnalysisEngineDescription createAnnotatorDescription(File modelDirectory)
+			throws ResourceInitializationException {
+		return AnalysisEngineFactory.createPrimitiveDescription(
+				EventTimeRelationAnnotator.class,
+				CleartkAnnotator.PARAM_IS_TRAINING,
+				false,
+				GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH,
+				new File(modelDirectory, "model.jar"));
+	}
+
+	@Override
+	protected List<RelationFeaturesExtractor> getFeatureExtractors() {
+		return Lists.newArrayList(
+				new TokenFeaturesExtractor()
+				, new PartOfSpeechFeaturesExtractor()
+				//    						, new TemporalAttributeFeatureExtractor()
+				, new EventTimeFlatTreeFeatureExtractor()
+				, new TemporalPETExtractor()
+				, new TemporalPathExtractor()
+				, new NearestFlagFeatureExtractor()
+				, new DependencyFeatureExtractor()
+				);
+	}
 
-  @Override
+	@Override
 	protected Class<? extends Annotation> getCoveringClass() {
 		return Sentence.class;
 	}
-  
-  @Override
-  public List<IdentifiedAnnotationPair> getCandidateRelationArgumentPairs(
-      JCas jCas,
-      Annotation sentence) {
-    List<IdentifiedAnnotationPair> pairs = Lists.newArrayList();
-    for (EventMention event : JCasUtil.selectCovered(jCas, EventMention.class, sentence)) {
-      // ignore subclasses like Procedure and Disease/Disorder
-      if (event.getClass().equals(EventMention.class)) {
-        for (TimeMention time : JCasUtil.selectCovered(jCas, TimeMention.class, sentence)) {
-          pairs.add(new IdentifiedAnnotationPair(event, time));
-        }
-      }
-    }
-    return pairs;
-  }
-
-  @Override
-  protected String getRelationCategory(
-      Map<List<Annotation>, BinaryTextRelation> relationLookup,
-      IdentifiedAnnotation arg1,
-      IdentifiedAnnotation arg2) {
-    BinaryTextRelation relation = relationLookup.get(Arrays.asList(arg1, arg2));
-    String category = null;
-    if (relation != null) {
-      category = relation.getCategory();
-    } else {
-      relation = relationLookup.get(Arrays.asList(arg2, arg1));
-      if (relation != null) {
-        category = relation.getCategory() + "-1";
-      }
-    }
-    if (category == null && coin.nextDouble() <= this.probabilityOfKeepingANegativeExample) {
-      category = NO_RELATION_CATEGORY;
-    }
-    return category;
-  }
+
+	@Override
+	public List<IdentifiedAnnotationPair> getCandidateRelationArgumentPairs(
+			JCas jCas,
+			Annotation sentence) {
+		List<IdentifiedAnnotationPair> pairs = Lists.newArrayList();
+		for (EventMention event : JCasUtil.selectCovered(jCas, EventMention.class, sentence)) {
+			// ignore subclasses like Procedure and Disease/Disorder
+			if (event.getClass().equals(EventMention.class)) {
+				for (TimeMention time : JCasUtil.selectCovered(jCas, TimeMention.class, sentence)) {
+					pairs.add(new IdentifiedAnnotationPair(event, time));
+				}
+			}
+		}
+		return pairs;
+	}
+
+	@Override
+	protected String getRelationCategory(
+			Map<List<Annotation>, BinaryTextRelation> relationLookup,
+			IdentifiedAnnotation arg1,
+			IdentifiedAnnotation arg2) {
+		BinaryTextRelation relation = relationLookup.get(Arrays.asList(arg1, arg2));
+		String category = null;
+		if (relation != null) {
+			category = relation.getCategory();
+		} else {
+			relation = relationLookup.get(Arrays.asList(arg2, arg1));
+			if (relation != null) {
+				category = relation.getCategory() + "-1";
+			}
+		}
+		if (category == null && coin.nextDouble() <= this.probabilityOfKeepingANegativeExample) {
+			category = NO_RELATION_CATEGORY;
+		}
+		return category;
+	}
 }

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/DependencyFeatureExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/DependencyFeatureExtractor.java?rev=1514895&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/DependencyFeatureExtractor.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/DependencyFeatureExtractor.java Fri Aug 16 21:04:57 2013
@@ -0,0 +1,70 @@
+package org.apache.ctakes.temporal.ae.feature;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ctakes.relationextractor.ae.features.RelationFeaturesExtractor;
+import org.apache.ctakes.typesystem.type.syntax.ConllDependencyNode;
+import org.apache.ctakes.typesystem.type.textsem.EventMention;
+import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
+import org.apache.ctakes.typesystem.type.textsem.TimeMention;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.jcas.JCas;
+import org.cleartk.classifier.Feature;
+import org.uimafit.util.JCasUtil;
+
+public class DependencyFeatureExtractor implements
+RelationFeaturesExtractor {
+
+	@Override
+	public List<Feature> extract(JCas jCas, IdentifiedAnnotation arg1,
+			IdentifiedAnnotation arg2) throws AnalysisEngineProcessException {
+		ArrayList<Feature> feats = new ArrayList<Feature>();
+		EventMention event = null;
+		TimeMention time = null;
+		
+		if(arg1 instanceof EventMention){
+			event = (EventMention) arg1;
+			time = (TimeMention) arg2;
+		}else{
+			time = (TimeMention) arg1;
+			event = (EventMention) arg2;
+		}		
+		//1 get covering ConllDependencyNode:
+		Map<IdentifiedAnnotation, Collection<ConllDependencyNode>> dependencyCoveringMap =
+				JCasUtil.indexCovering(jCas, IdentifiedAnnotation.class, ConllDependencyNode.class);
+		Collection<ConllDependencyNode> eventDNodeList = dependencyCoveringMap.get(event);
+		Collection<ConllDependencyNode> timeDNodeList = dependencyCoveringMap.get(time);
+		
+		//2 get dependency relationship
+		if (timeDNodeList != null && !timeDNodeList.isEmpty() && eventDNodeList != null && !eventDNodeList.isEmpty()){
+			for(ConllDependencyNode timeNode : timeDNodeList) {
+				ConllDependencyNode headOfTime = timeNode.getHead();
+				for (ConllDependencyNode eventNode : eventDNodeList) {
+					if ( timeNode.getPostag() != null && eventNode.getPostag() != null){//make sure the covering nodes are not root sentences
+						while( headOfTime != null ){
+							if (headOfTime.equals(eventNode)) {
+								Feature indicator = new Feature("DependentTo", "DependentTo");
+								feats.add(indicator);
+								return feats;
+//							}else if (headOfTime.getHead() == null){//if one of the node is dependent to the root sentence
+//								Feature indicator = new Feature("OpenDependentTo", "OpenDependentTo");
+//								feats.add(indicator);
+//								return feats;
+							}
+							headOfTime = headOfTime.getHead();
+						}
+					}
+				}
+			}
+
+		}
+
+		Feature indicator = new Feature("NotDependent", "NotDependent");
+		feats.add(indicator);
+		return feats;
+	}
+
+}

Propchange: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/feature/DependencyFeatureExtractor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain