ctakes-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From c...@apache.org
Subject svn commit: r1637884 - in /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal: ae/ eval/
Date Mon, 10 Nov 2014 15:19:56 GMT
Author: clin
Date: Mon Nov 10 15:19:55 2014
New Revision: 1637884

URL: http://svn.apache.org/r1637884
Log:
add annotators and update evaluation code for i2b2 data.
add more system-generated events for candidate temporal relations.

Added:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventI2B2RelationAnnotator.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeI2B2RelationAnnotator.java
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/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/EvaluationOfI2B2TemporalRelations.java

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventI2B2RelationAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventI2B2RelationAnnotator.java?rev=1637884&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventI2B2RelationAnnotator.java
(added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventEventI2B2RelationAnnotator.java
Mon Nov 10 15:19:55 2014
@@ -0,0 +1,280 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ctakes.temporal.ae;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator;
+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.CheckSpecialWordRelationExtractor;
+import org.apache.ctakes.temporal.ae.feature.ConjunctionRelationFeaturesExtractor;
+//import org.apache.ctakes.temporal.ae.feature.DependencyParseUtils;
+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.EventInBetweenPropertyExtractor;
+//import org.apache.ctakes.temporal.ae.feature.EventOutsidePropertyExtractor;
+import org.apache.ctakes.temporal.ae.feature.SpecialAnnotationRelationExtractor;
+import org.apache.ctakes.temporal.ae.feature.TemporalPETFlatExtractor;
+import org.apache.ctakes.temporal.ae.feature.TokenPropertyFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.DeterminerRelationFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.EventArgumentPropertyExtractor;
+import org.apache.ctakes.temporal.ae.feature.EventTimeRelationFeatureExtractor;
+import org.apache.ctakes.temporal.ae.feature.EventPositionRelationFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.NumberOfEventsInTheSameSentenceExtractor;
+import org.apache.ctakes.temporal.ae.feature.NearbyVerbTenseRelationExtractor;
+import org.apache.ctakes.temporal.ae.feature.NumberOfEventTimeBetweenCandidatesExtractor;
+import org.apache.ctakes.temporal.ae.feature.OverlappedHeadFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.SRLRelationFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.TimeXRelationFeaturesExtractor;
+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.treekernel.TemporalPETExtractor;
+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.ConllDependencyNode;
+import org.apache.ctakes.typesystem.type.textsem.EventMention;
+import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
+import org.apache.ctakes.typesystem.type.textspan.Sentence;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.fit.util.JCasUtil;
+
+import com.google.common.collect.Lists;
+
+public class EventEventI2B2RelationAnnotator extends RelationExtractorAnnotator {
+
+	public static AnalysisEngineDescription createDataWriterDescription(
+			Class<? extends DataWriter<String>> dataWriterClass,
+					File outputDirectory,
+					double probabilityOfKeepingANegativeExample) throws ResourceInitializationException
{
+		return AnalysisEngineFactory.createEngineDescription(
+				EventEventI2B2RelationAnnotator.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(String modelPath)
+			throws ResourceInitializationException {
+		return AnalysisEngineFactory.createEngineDescription(
+				EventEventI2B2RelationAnnotator.class,
+				CleartkAnnotator.PARAM_IS_TRAINING,
+				false,
+				GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH,
+				modelPath);
+	}
+
+	/**
+	 * @deprecated use String path instead of File.
+	 * ClearTK will automatically Resolve the String to an InputStream.
+	 * This will allow resources to be read within from a jar as well as File.  
+	 */	  
+	@SuppressWarnings("dep-ann")
+	public static AnalysisEngineDescription createAnnotatorDescription(File modelDirectory)
+			throws ResourceInitializationException {
+		return AnalysisEngineFactory.createEngineDescription(
+				EventEventI2B2RelationAnnotator.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 UnexpandedTokenFeaturesExtractor() //use unexpanded version for i2b2 data
+				, new PartOfSpeechFeaturesExtractor()
+				//	    		, new TemporalPETExtractor()
+				, new EventArgumentPropertyExtractor()
+				, new NumberOfEventTimeBetweenCandidatesExtractor()
+				, new SectionHeaderRelationExtractor()
+				, new NearbyVerbTenseRelationExtractor()
+				, new CheckSpecialWordRelationExtractor()
+				, new UmlsFeatureExtractor()
+				, 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()
+				);
+	}
+
+	@Override
+	protected Class<? extends Annotation> getCoveringClass() {
+		return Sentence.class;
+	}
+
+	@Override
+	protected List<IdentifiedAnnotationPair> getCandidateRelationArgumentPairs(
+			JCas jCas, Annotation sentence) {
+
+		Map<EventMention, Collection<EventMention>> coveringMap =
+				JCasUtil.indexCovering(jCas, EventMention.class, EventMention.class);
+
+		List<IdentifiedAnnotationPair> pairs = Lists.newArrayList();
+		List<EventMention> events = new ArrayList<>(JCasUtil.selectCovered(jCas, EventMention.class,
sentence));
+		//filter events:
+		List<EventMention> realEvents = Lists.newArrayList();
+		for( EventMention event : events){
+			if(event.getClass().equals(EventMention.class)){
+				realEvents.add(event);
+			}
+		}
+		events = realEvents;
+
+		int eventNum = events.size();
+
+		for (int i = 0; i < eventNum-1; i++){
+			for(int j = i+1; j < eventNum; j++){
+				EventMention eventA = events.get(j);
+				EventMention eventB = events.get(i);
+
+				if(this.isTraining()){
+					//pairing covering system events:
+					for (EventMention event1 : coveringMap.get(eventA)){
+						for(EventMention event2 : coveringMap.get(eventB)){
+							pairs.add(new IdentifiedAnnotationPair(event1, event2));							
+						}
+						pairs.add(new IdentifiedAnnotationPair(event1, eventB));
+					}
+					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));
+					}
+				}
+				pairs.add(new IdentifiedAnnotationPair(eventA, eventB));
+
+			}
+		}
+
+
+		//		if(eventNum >= 2){
+		//			for ( int i = 0; i< eventNum -1 ; i ++){
+		//				EventMention evI = events.get(i);
+		//				for(int j = i+1; j< eventNum; j++){
+		//					EventMention evJ = events.get(j);
+		//					if(j-i==1 || j-i==eventNum-1){//if two events are consecutive, or major events
+		//						pairs.add(new IdentifiedAnnotationPair(evJ, evI));
+		//					}else if(ifDependent(jCas, evI, evJ)){//if the event pairs are dependent// eventNum
< 7 && 
+		//						pairs.add(new IdentifiedAnnotationPair(evJ, evI));
+		//					}else{// if the 
+		//						continue;
+		//					}
+		//				}
+		//			}
+		//		}
+
+		return pairs;
+	}
+
+	@Override
+	protected void createRelation(JCas jCas, IdentifiedAnnotation arg1,
+			IdentifiedAnnotation arg2, String predictedCategory) {
+		RelationArgument relArg1 = new RelationArgument(jCas);
+		relArg1.setArgument(arg1);
+		relArg1.setRole("Arg1");
+		relArg1.addToIndexes();
+		RelationArgument relArg2 = new RelationArgument(jCas);
+		relArg2.setArgument(arg2);
+		relArg2.setRole("Arg2");
+		relArg2.addToIndexes();
+		TemporalTextRelation relation = new TemporalTextRelation(jCas);
+		relation.setArg1(relArg1);
+		relation.setArg2(relArg2);
+		relation.setCategory(predictedCategory);
+		relation.addToIndexes();
+	}
+
+	@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 && relation instanceof TemporalTextRelation) {
+			category = relation.getCategory();
+		} else {
+			relation = relationLookup.get(Arrays.asList(arg2, arg1));
+			if (relation != null && relation instanceof TemporalTextRelation) {
+				if(relation.getCategory().equals("OVERLAP")){
+					category = relation.getCategory();
+					//				}else if (relation.getCategory().equals("BEFORE")){
+					//					category = "AFTER";
+					//				}else if (relation.getCategory().equals("AFTER")){
+					//					category = "BEFORE";
+					//				}
+				}else{
+					category = relation.getCategory() + "-1";
+				}
+			}
+		}
+		if (category == null && coin.nextDouble() <= this.probabilityOfKeepingANegativeExample)
{
+			category = NO_RELATION_CATEGORY;
+		}
+		return category;
+	}
+}

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=1637884&r1=1637883&r2=1637884&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
Mon Nov 10 15:19:55 2014
@@ -198,15 +198,25 @@ public class EventEventRelationAnnotator
 				}
 				if(eventAValid && eventBValid){
 					if(this.isTraining()){
+						//pairing covering system events:
 						for (EventMention event1 : coveringMap.get(eventA)){
 							for(EventMention event2 : coveringMap.get(eventB)){
 								pairs.add(new IdentifiedAnnotationPair(event1, event2));
 							}
+							pairs.add(new IdentifiedAnnotationPair(event1, eventB));
 						}
+						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));
 						}
 					}
 					pairs.add(new IdentifiedAnnotationPair(eventA, eventB));

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeI2B2RelationAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeI2B2RelationAnnotator.java?rev=1637884&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeI2B2RelationAnnotator.java
(added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventTimeI2B2RelationAnnotator.java
Mon Nov 10 15:19:55 2014
@@ -0,0 +1,253 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ctakes.temporal.ae;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator;
+import org.apache.ctakes.relationextractor.ae.features.PartOfSpeechFeaturesExtractor;
+import org.apache.ctakes.relationextractor.ae.features.RelationFeaturesExtractor;
+import org.apache.ctakes.temporal.ae.feature.CheckSpecialWordRelationExtractor;
+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.EventArgumentPropertyExtractor;
+//import org.apache.ctakes.temporal.ae.feature.EventIndexOfSameSentenceRelationFeaturesExtractor;
+//import org.apache.ctakes.temporal.ae.feature.EventPositionRelationFeaturesExtractor;
+//import org.apache.ctakes.temporal.ae.feature.EventTimeRelationFeatureExtractor;
+import org.apache.ctakes.temporal.ae.feature.NearbyVerbTenseRelationExtractor;
+import org.apache.ctakes.temporal.ae.feature.NearestFlagFeatureExtractor;
+import org.apache.ctakes.temporal.ae.feature.NumberOfEventTimeBetweenCandidatesExtractor;
+import org.apache.ctakes.temporal.ae.feature.OverlappedHeadFeaturesExtractor;
+//import org.apache.ctakes.temporal.ae.feature.SRLRelationFeaturesExtractor;
+//import org.apache.ctakes.temporal.ae.feature.SectionHeaderRelationExtractor;
+import org.apache.ctakes.temporal.ae.feature.TemporalAttributeFeatureExtractor;
+import org.apache.ctakes.temporal.ae.feature.TemporalPETFlatExtractor;
+//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.TemporalAttributeFeatureExtractor;
+//import org.apache.ctakes.temporal.ae.feature.treekernel.EventTimeFlatTreeFeatureExtractor;
+//import org.apache.ctakes.temporal.ae.feature.treekernel.EventVerbRelationTreeExtractor;
+//import org.apache.ctakes.temporal.ae.feature.treekernel.TemporalPETExtractor;
+//import org.apache.ctakes.temporal.ae.feature.treekernel.TemporalPathExtractor;
+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.textsem.EventMention;
+import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
+import org.apache.ctakes.typesystem.type.textsem.TimeMention;
+import org.apache.ctakes.typesystem.type.textspan.Sentence;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.fit.util.JCasUtil;
+
+import com.google.common.collect.Lists;
+
+public class EventTimeI2B2RelationAnnotator extends RelationExtractorAnnotator {
+
+	public static AnalysisEngineDescription createDataWriterDescription(
+			Class<? extends DataWriter<String>> dataWriterClass,
+					File outputDirectory,
+					double probabilityOfKeepingANegativeExample) throws ResourceInitializationException
{
+		return AnalysisEngineFactory.createEngineDescription(
+				EventTimeI2B2RelationAnnotator.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 createEngineDescription(String modelPath)
+			throws ResourceInitializationException {
+		return AnalysisEngineFactory.createEngineDescription(
+				EventTimeI2B2RelationAnnotator.class,
+				CleartkAnnotator.PARAM_IS_TRAINING,
+				false,
+				GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH,
+				modelPath);
+	}
+	/**
+	 * @deprecated use String path instead of File.
+	 * ClearTK will automatically Resolve the String to an InputStream.
+	 * This will allow resources to be read within from a jar as well as File.  
+	 */	 
+	@Deprecated
+	public static AnalysisEngineDescription createEngineDescription(File modelDirectory)
+			throws ResourceInitializationException {
+		return AnalysisEngineFactory.createEngineDescription(
+				EventTimeI2B2RelationAnnotator.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 UnexpandedTokenFeaturesExtractor() //use unexpanded version for i2b2 data
+				, 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
+				);
+	}
+
+	@Override
+	protected Class<? extends Annotation> getCoveringClass() {
+		return Sentence.class;
+	}
+
+	@Override
+	public List<IdentifiedAnnotationPair> getCandidateRelationArgumentPairs(
+			JCas jCas,
+			Annotation sentence) {
+		Map<EventMention, Collection<EventMention>> coveringMap =
+				JCasUtil.indexCovering(jCas, EventMention.class, EventMention.class);
+
+		List<IdentifiedAnnotationPair> pairs = Lists.newArrayList();
+		for (EventMention event : JCasUtil.selectCovered(jCas, EventMention.class, sentence)) {
+			boolean eventValid = false;
+			if (event.getClass().equals(EventMention.class)) {//event is a gold event
+				eventValid = true;
+			}
+
+			if(eventValid){
+				// ignore subclasses like Procedure and Disease/Disorder
+				if(this.isTraining()){//if training mode, train on both gold event and span-overlapping
system events
+					for (TimeMention time : JCasUtil.selectCovered(jCas, TimeMention.class, sentence)) {
+						Collection<EventMention> eventList = coveringMap.get(event);
+						for(EventMention covEvent : eventList){
+							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));
+						}
+					}
+				}else{//if testing mode, only test on system generated events
+					for (TimeMention time : JCasUtil.selectCovered(jCas, TimeMention.class, sentence)) {
+						pairs.add(new IdentifiedAnnotationPair(event, time));
+					}
+				}
+			}
+		}
+
+		return pairs;
+	}
+
+	@Override
+	protected void createRelation(JCas jCas, IdentifiedAnnotation arg1,
+			IdentifiedAnnotation arg2, String predictedCategory) {
+		RelationArgument relArg1 = new RelationArgument(jCas);
+		relArg1.setArgument(arg1);
+		relArg1.setRole("Arg1");
+		relArg1.addToIndexes();
+		RelationArgument relArg2 = new RelationArgument(jCas);
+		relArg2.setArgument(arg2);
+		relArg2.setRole("Arg2");
+		relArg2.addToIndexes();
+		TemporalTextRelation relation = new TemporalTextRelation(jCas);
+		relation.setArg1(relArg1);
+		relation.setArg2(relArg2);
+		relation.setCategory(predictedCategory);
+		relation.addToIndexes();
+	}
+
+
+	@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) {
+				if(relation.getCategory().equals("OVERLAP")){
+					category = relation.getCategory();
+					//				}else if (relation.getCategory().equals("BEFORE")){
+					//					category = "AFTER";
+					//				}else if (relation.getCategory().equals("AFTER")){
+					//					category = "BEFORE";
+					//				}
+				}else{
+					category = relation.getCategory() + "-1";
+				}
+			}
+		}
+
+		if(category!=null){
+			if(!((EventMention)arg1).getClass().equals(EventMention.class)){
+				System.out.println("find system-event relations: "+ arg1.getCoveredText() + " -"+category+"-
" + arg2.getCoveredText());
+			}else{
+				System.out.println("find gold-event relations: "+ arg1.getCoveredText() + " -"+category+"-
" + arg2.getCoveredText());
+			}
+		}
+
+		if (category == null && coin.nextDouble() <= this.probabilityOfKeepingANegativeExample)
{
+			category = NO_RELATION_CATEGORY;
+		}
+
+		return category;
+	}
+}

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=1637884&r1=1637883&r2=1637884&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
Mon Nov 10 15:19:55 2014
@@ -329,7 +329,7 @@ EvaluationOfTemporalRelations_ImplBase{
 		}
 
 		//    HideOutput hider = new HideOutput();
-		JarClassifierBuilder.trainAndPackage(new File(directory,"event-event"),"-c", optArray[1]);//"-w1","0.09","-w2","4","-w3","9","-w5","2","-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.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();
@@ -529,6 +529,20 @@ EvaluationOfTemporalRelations_ImplBase{
 						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());
 					}
 				}
 			}

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=1637884&r1=1637883&r2=1637884&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
Mon Nov 10 15:19:55 2014
@@ -34,6 +34,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator.IdentifiedAnnotationPair;
 import org.apache.ctakes.relationextractor.eval.RelationExtractorEvaluation.HashableArguments;
 import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
 import org.apache.ctakes.temporal.ae.EventTimeSelfRelationAnnotator;
@@ -693,6 +694,9 @@ EvaluationOfTemporalRelations_ImplBase{
 							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);
@@ -701,6 +705,9 @@ EvaluationOfTemporalRelations_ImplBase{
 							createRelation(relationView, arg1, covEvent, relation.getCategory());
 						}
 					}
+					for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, event)){//select
covered events
+						createRelation(relationView, arg1, covedEvent, relation.getCategory());
+					}
 				}
 			}
 

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=1637884&r1=1637883&r2=1637884&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
Mon Nov 10 15:19:55 2014
@@ -38,14 +38,15 @@ import org.apache.ctakes.core.ae.CDASegm
 import org.apache.ctakes.relationextractor.eval.RelationExtractorEvaluation.HashableArguments;
 import org.apache.ctakes.temporal.ae.ConsecutiveSentencesEventEventRelationAnnotator;
 import org.apache.ctakes.temporal.ae.ConsecutiveSentencesEventTimeRelationAnnotator;
-import org.apache.ctakes.temporal.ae.EventTimeSelfRelationAnnotator;
 import org.apache.ctakes.temporal.ae.TemporalRelationRuleAnnotator;
 import org.apache.ctakes.temporal.ae.DocTimeRelAnnotator;
 import org.apache.ctakes.temporal.ae.EventAdmissionTimeAnnotator;
 import org.apache.ctakes.temporal.ae.EventDischargeTimeAnnotator;
-import org.apache.ctakes.temporal.ae.EventEventRelationAnnotator;
-import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
+import org.apache.ctakes.temporal.ae.EventEventI2B2RelationAnnotator;
+import org.apache.ctakes.temporal.ae.EventTimeI2B2RelationAnnotator;
 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.ParameterSettings;
 import org.apache.ctakes.temporal.eval.EvaluationOfTemporalRelations_ImplBase.RemoveNonContainsRelations.RemoveGoldAttributes;
 import org.apache.ctakes.temporal.utils.AnnotationIdCollection;
@@ -66,7 +67,6 @@ import org.apache.uima.fit.component.JCa
 import org.apache.uima.fit.descriptor.ConfigurationParameter;
 import org.apache.uima.fit.factory.AggregateBuilder;
 import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.fit.pipeline.JCasIterator;
 import org.apache.uima.fit.pipeline.SimplePipeline;
 import org.apache.uima.fit.util.JCasUtil;
 import org.apache.uima.jcas.JCas;
@@ -75,7 +75,7 @@ import org.apache.uima.resource.Resource
 import org.apache.uima.util.FileUtils;
 import org.cleartk.eval.AnnotationStatistics;
 import org.cleartk.ml.jar.JarClassifierBuilder;
-//import org.cleartk.ml.libsvm.LibSvmStringOutcomeDataWriter;
+import org.cleartk.ml.libsvm.LibSvmStringOutcomeDataWriter;
 import org.cleartk.ml.liblinear.LibLinearStringOutcomeDataWriter;
 //import org.cleartk.classifier.tksvmlight.TKSVMlightStringOutcomeDataWriter;
 import org.cleartk.ml.tksvmlight.model.CompositeKernel.ComboOperator;
@@ -292,13 +292,18 @@ EvaluationOfTemporalRelations_ImplBase{
 		//				CAS.NAME_DEFAULT_SOFA,
 		//				GOLD_VIEW_NAME);
 		//		aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveNonContainsRelations.class));
-		aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddFlippedOverlap.class));//add
flipped overlap instances to training data
+//		aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddFlippedOverlap.class));//add
flipped overlap instances to training data
 
 		//		aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(RemoveEventEventRelations.class));
 		//test rules:
 		//		aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(TemporalRelationRuleAnnotator.class));
+		
+		//add unlabeled nearby system events as potential event-time links: 
+		aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddPotentialRelations.class));
+		//add unlabeled nearby system events as potential event-event links: 
+		aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(AddEEPotentialRelations.class));
 
-		aggregateBuilder.add(EventTimeSelfRelationAnnotator.createDataWriterDescription(
+		aggregateBuilder.add(EventTimeI2B2RelationAnnotator.createDataWriterDescription(
 				//				LibSvmStringOutcomeDataWriter.class,
 				LibLinearStringOutcomeDataWriter.class,
 				// TKSVMlightStringOutcomeDataWriter.class,
@@ -306,27 +311,27 @@ EvaluationOfTemporalRelations_ImplBase{
 				//        SVMlightStringOutcomeDataWriter.class,        
 				new File(directory,EVENT_TIME),
 				params.probabilityOfKeepingANegativeExample));
-		aggregateBuilder.add(EventEventRelationAnnotator.createDataWriterDescription(
+		aggregateBuilder.add(EventEventI2B2RelationAnnotator.createDataWriterDescription(
 				LibLinearStringOutcomeDataWriter.class,//TKSVMlightStringOutcomeDataWriter.class,//
 				//				LIBLINEARStringOutcomeDataWriter.class,
 				new File(directory,EVENT_EVENT), 
 				params.probabilityOfKeepingANegativeExample));
 		aggregateBuilder.add(EventDischargeTimeAnnotator.createDataWriterDescription(
-				//				LibSvmStringOutcomeDataWriter.class,
-				LibLinearStringOutcomeDataWriter.class,
+				LibSvmStringOutcomeDataWriter.class,
+//				LibLinearStringOutcomeDataWriter.class,
 				new File(directory,EVENT_DISCHARGE)));
 		aggregateBuilder.add(EventAdmissionTimeAnnotator.createDataWriterDescription(
-				//				LibSvmStringOutcomeDataWriter.class,
-				LibLinearStringOutcomeDataWriter.class,
+				LibSvmStringOutcomeDataWriter.class,
+//				LibLinearStringOutcomeDataWriter.class,
 				new File(directory,EVENT_ADMISSION)));
 		aggregateBuilder.add(ConsecutiveSentencesEventEventRelationAnnotator.createDataWriterDescription(
-				//				LibSvmStringOutcomeDataWriter.class,
-				LibLinearStringOutcomeDataWriter.class,
+				LibSvmStringOutcomeDataWriter.class,
+//				LibLinearStringOutcomeDataWriter.class,
 				new File(directory,TEMP_CROSSSENT), 
 				params.probabilityOfKeepingANegativeExample));
 		aggregateBuilder.add(ConsecutiveSentencesEventTimeRelationAnnotator.createDataWriterDescription(
-				//				LibSvmStringOutcomeDataWriter.class,
-				LibLinearStringOutcomeDataWriter.class,
+				LibSvmStringOutcomeDataWriter.class,
+//				LibLinearStringOutcomeDataWriter.class,
 				new File(directory,TEMPET_CROSSSENT), 
 				params.probabilityOfKeepingANegativeExample));
 		SimplePipeline.runPipeline(collectionReader, aggregateBuilder.createAggregate());
@@ -355,14 +360,14 @@ EvaluationOfTemporalRelations_ImplBase{
 		}
 
 		//    HideOutput hider = new HideOutput();
-		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_TIME), "-c", "0.001");//"-h","0","-c",
"1000");//optArray);//"-c", "0.05");//
-		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_EVENT), "-c", "0.001");
-		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_DISCHARGE), "-c", "0.001");
-		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_ADMISSION), "-c", "0.001");
+		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_TIME), "-c", "0.0002", "-w2","0.2","-w3","7","-w4","7","-w5","13");//"-h","0","-c",
"1000");//optArray);//"-c", "0.05");//
+		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_EVENT), "-c", "0.0002","-w1","0.07","-w2","14","-w3","5","-w4","10","-w6","20");
+		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_DISCHARGE), "-h","0","-c",
"1000");
+		JarClassifierBuilder.trainAndPackage(new File(directory,EVENT_ADMISSION), "-h","0","-c",
"1000");
 		//		JarClassifierBuilder.trainAndPackage(new File(directory,TIME_ADMISSION), "-h","0","-c",
"1000");
 		//		JarClassifierBuilder.trainAndPackage(new File(directory,TIME_DISCHARGE), "-h","0","-c",
"1000");
-		JarClassifierBuilder.trainAndPackage(new File(directory,TEMP_CROSSSENT), "-c", "0.001");
-		JarClassifierBuilder.trainAndPackage(new File(directory,TEMPET_CROSSSENT), "-c", "0.001");
+		JarClassifierBuilder.trainAndPackage(new File(directory,TEMP_CROSSSENT), "-h","0","-c",
"1000");
+		JarClassifierBuilder.trainAndPackage(new File(directory,TEMPET_CROSSSENT), "-h","0","-c",
"1000");
 		//    hider.restoreOutput();
 		//    hider.close();
 	}
@@ -419,8 +424,8 @@ EvaluationOfTemporalRelations_ImplBase{
 		//		aggregateBuilder.add(TimexDischargeTimeAnnotator.createAnnotatorDescription(new File(directory,TIME_DISCHARGE)));
 
 		aggregateBuilder.add(this.baseline ? RecallBaselineEventTimeRelationAnnotator.createAnnotatorDescription(directory)
:
-			EventTimeSelfRelationAnnotator.createEngineDescription(new File(directory,EVENT_TIME)));
-		aggregateBuilder.add(EventEventRelationAnnotator.createAnnotatorDescription(new File(directory,EVENT_EVENT)));
+			EventTimeI2B2RelationAnnotator.createEngineDescription(new File(directory,EVENT_TIME)));
+		aggregateBuilder.add(EventEventI2B2RelationAnnotator.createAnnotatorDescription(new File(directory,EVENT_EVENT)));
 		aggregateBuilder.add(ConsecutiveSentencesEventEventRelationAnnotator.createAnnotatorDescription(new
File(directory,TEMP_CROSSSENT)));
 		aggregateBuilder.add(ConsecutiveSentencesEventTimeRelationAnnotator.createAnnotatorDescription(new
File(directory,TEMPET_CROSSSENT)));
 		aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(TemporalRelationRuleAnnotator.class));



Mime
View raw message