You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ctakes.apache.org by "Chen, Pei" <Pe...@childrens.harvard.edu> on 2014/11/10 18:11:20 UTC

Re: svn commit: r1637884 - in /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal: ae/ eval/

Chen,
Does this need to go into this upcoming release or can it wait till the next one?

Sent from my iPhone

> On Nov 10, 2014, at 10:20 AM, "clin@apache.org" <cl...@apache.org> wrote:
> 
> 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));
> 
> 

Re: svn commit: r1637884 - in /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal: ae/ eval/

Posted by "Lin, Chen" <Ch...@childrens.harvard.edu>.
It can wait if the current models work.

Sent from my iPhone

> On Nov 10, 2014, at 12:18 PM, "Chen, Pei" <Pe...@childrens.harvard.edu> wrote:
> 
> Chen,
> Does this need to go into this upcoming release or can it wait till the next one?
> 
> Sent from my iPhone
> 
>> On Nov 10, 2014, at 10:20 AM, "clin@apache.org" <cl...@apache.org> wrote:
>> 
>> 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));
>> 
>>