You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by tm...@apache.org on 2017/09/26 18:02:17 UTC

svn commit: r1809768 - in /ctakes/trunk: ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/ ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/pairing/cluster/ ctakes-coreference/src/main/java/org/apache/ctakes/coreferenc...

Author: tmill
Date: Tue Sep 26 18:02:17 2017
New Revision: 1809768

URL: http://svn.apache.org/viewvc?rev=1809768&view=rev
Log:
Update to allow actual linking across documents in thyme coref.

Added:
    ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/pairing/cluster/PreviousDocumentPairer.java
Modified:
    ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/CoreferenceChainScoringOutput.java
    ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/MentionClusterCoreferenceAnnotator.java
    ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/eval/EvaluationOfEventCoreference.java
    ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/util/ClusterUtils.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/ThymePatientViewAnnotator.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/utils/PatientViewsUtil.java

Modified: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/CoreferenceChainScoringOutput.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/CoreferenceChainScoringOutput.java?rev=1809768&r1=1809767&r2=1809768&view=diff
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/CoreferenceChainScoringOutput.java (original)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/CoreferenceChainScoringOutput.java Tue Sep 26 18:02:17 2017
@@ -86,6 +86,7 @@ public class CoreferenceChainScoringOutp
   
   @Override
   public void process(JCas jCas) throws AnalysisEngineProcessException {
+    String myView = jCas.getViewName();
     File filename = new File(ViewUriUtil.getURI(jCas));
     JCas chainsCas = null;
     try {
@@ -132,6 +133,9 @@ public class CoreferenceChainScoringOutp
         members = ((NonEmptyFSList)members).getTail();
         System.out.print("Mention: " + mention.getCoveredText().replace("\n", "<CR>"));
         System.out.print(" (" + mention.getBegin() + ", " + mention.getEnd() + ")");
+        if(!isGold && !mention.getView().getViewName().equals(myView)){
+          System.out.print("[DOC:" + mention.getView().getViewName() + "]");
+        }
         System.out.print("  ----->    ");
       }
       System.out.println();

Modified: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/MentionClusterCoreferenceAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/MentionClusterCoreferenceAnnotator.java?rev=1809768&r1=1809767&r2=1809768&view=diff
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/MentionClusterCoreferenceAnnotator.java (original)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/MentionClusterCoreferenceAnnotator.java Tue Sep 26 18:02:17 2017
@@ -98,7 +98,9 @@ public class MentionClusterCoreferenceAn
         DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
         dataWriterClass,
         DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
-        outputDirectory);
+        outputDirectory,
+        MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT,
+        false);
   }
 
   public static AnalysisEngineDescription createAnnotatorDescription(
@@ -111,6 +113,18 @@ public class MentionClusterCoreferenceAn
         modelPath);
   }
 
+  public static AnalysisEngineDescription createMultidocAnnotatorDescription(
+          String modelPath) throws ResourceInitializationException {
+    return AnalysisEngineFactory.createEngineDescription(
+            MentionClusterCoreferenceAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH,
+            modelPath,
+            MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT,
+            false);
+  }
+
   private List<RelationFeaturesExtractor<CollectionTextRelation,IdentifiedAnnotation>> relationExtractors = this.getFeatureExtractors();
   private List<FeatureExtractor1<Markable>> mentionExtractors = this.getMentionExtractors();
   private List<ClusterMentionPairer_ImplBase> pairExtractors = this.getPairExtractors();
@@ -168,6 +182,7 @@ public class MentionClusterCoreferenceAn
     pairers.add(new SectionHeaderPairer(sentDist));
     pairers.add(new ClusterPairer(Integer.MAX_VALUE));
     pairers.add(new HeadwordPairer());
+    pairers.add(new PreviousDocumentPairer());
     return pairers;
   }
   

Added: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/pairing/cluster/PreviousDocumentPairer.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/pairing/cluster/PreviousDocumentPairer.java?rev=1809768&view=auto
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/pairing/cluster/PreviousDocumentPairer.java (added)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/ae/pairing/cluster/PreviousDocumentPairer.java Tue Sep 26 18:02:17 2017
@@ -0,0 +1,49 @@
+/*
+ * 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.coreference.ae.pairing.cluster;
+
+import org.apache.ctakes.coreference.util.ClusterMentionFetcher;
+import org.apache.ctakes.temporal.utils.PatientViewsUtil;
+import org.apache.ctakes.typesystem.type.relation.CollectionTextRelation;
+import org.apache.ctakes.typesystem.type.textsem.Markable;
+import org.apache.uima.fit.util.JCasUtil;
+import org.apache.uima.jcas.JCas;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by tmill on 9/21/17.
+ */
+public class PreviousDocumentPairer extends ClusterMentionPairer_ImplBase {
+    @Override
+    public List<ClusterMentionFetcher.CollectionTextRelationIdentifiedAnnotationPair> getPairs(JCas jcas, Markable m) {
+        List<ClusterMentionFetcher.CollectionTextRelationIdentifiedAnnotationPair> clusters = new ArrayList<>();
+        JCas prevCas = PatientViewsUtil.getPreviousDocumentCas(jcas);
+        if(prevCas == null) return clusters;
+
+        for(CollectionTextRelation chain : JCasUtil.select(prevCas, CollectionTextRelation.class)){
+            int numElements = JCasUtil.select(chain.getMembers(), Markable.class).size();
+            if(numElements > 1) {
+                clusters.add(new ClusterMentionFetcher.CollectionTextRelationIdentifiedAnnotationPair(chain, m));
+            }
+        }
+        return clusters;
+    }
+}

Modified: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/eval/EvaluationOfEventCoreference.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/eval/EvaluationOfEventCoreference.java?rev=1809768&r1=1809767&r2=1809768&view=diff
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/eval/EvaluationOfEventCoreference.java (original)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/eval/EvaluationOfEventCoreference.java Tue Sep 26 18:02:17 2017
@@ -63,6 +63,7 @@ import org.apache.ctakes.typesystem.type
 import org.apache.ctakes.typesystem.type.textsem.ProcedureMention;
 import org.apache.ctakes.typesystem.type.textsem.SignSymptomMention;
 import org.apache.ctakes.typesystem.type.textspan.Paragraph;
+import org.apache.ctakes.typesystem.type.textspan.Segment;
 import org.apache.ctakes.utils.distsem.WordEmbeddings;
 import org.apache.ctakes.utils.distsem.WordVector;
 import org.apache.ctakes.utils.distsem.WordVectorReader;
@@ -308,6 +309,9 @@ public class EvaluationOfEventCoreferenc
         aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(MarkableHeadTreeCreator.class), CAS.NAME_DEFAULT_SOFA, viewName);
         aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(CopyCoreferenceRelations.class, CopyCoreferenceRelations.PARAM_GOLD_VIEW, goldViewName),
             CAS.NAME_DEFAULT_SOFA, viewName);
+        // the coreference module uses segments to index markables, but we don't have them in the gold standard.
+        aggregateBuilder.add(CopyFromSystem.getDescription(Segment.class), CAS.NAME_DEFAULT_SOFA, viewName, GOLD_VIEW_NAME, goldViewName);
+
         aggregateBuilder.add(MarkableSalienceAnnotator.createAnnotatorDescription("/org/apache/ctakes/temporal/ae/salience/model.jar"), CAS.NAME_DEFAULT_SOFA, viewName);
         if(this.evalType == EVAL_SYSTEM.MENTION_PAIR){
           aggregateBuilder.add(EventCoreferenceAnnotator.createDataWriterDescription(
@@ -343,7 +347,9 @@ public class EvaluationOfEventCoreferenc
             DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
             FlushingDataWriter.class,
             DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
-            directory);        
+            directory,
+            MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT,
+            false);
         aggregateBuilder.add(aed);
         // TODO - this never helped, so not sure it's worth keeping around, but now it is broken by document-aware stuff, so uncommenting for now. 
 //        for(int i = 0; i < NUM_SAMPLES; i++){
@@ -364,7 +370,9 @@ public class EvaluationOfEventCoreferenc
 //              DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
 //              FlushingDataWriter.class,
 //              DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
-//              directory);
+//              directory,
+//              MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT,
+//              false);
 //
 //          aggregateBuilder.add(aed);
 //        }
@@ -472,7 +480,7 @@ public class EvaluationOfEventCoreferenc
     }
     aggregateBuilder.add(AnalysisEngineFactory.createEngineDescription(EndDocsSentinelAnnotator.class));
     
-    aggregateBuilder.add(MentionClusterCoreferenceAnnotator.createAnnotatorDescription(directory.getAbsolutePath() + File.separator + "model.jar"));
+    aggregateBuilder.add(MentionClusterCoreferenceAnnotator.createMultidocAnnotatorDescription(directory.getAbsolutePath() + File.separator + "model.jar"));
 
     for(int viewNum = 0; viewNum < MAX_DOC_VIEWS; viewNum++){
       String viewName = PatientViewsUtil.getViewName(viewNum);
@@ -1028,6 +1036,8 @@ public class EvaluationOfEventCoreferenc
   
   public static class FlushingDataWriter extends LibLinearStringOutcomeDataWriter {
 
+    int numChains = 0;
+
     public FlushingDataWriter(File outputDirectory)
         throws FileNotFoundException {
       super(outputDirectory);

Modified: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/util/ClusterUtils.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/util/ClusterUtils.java?rev=1809768&r1=1809767&r2=1809768&view=diff
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/util/ClusterUtils.java (original)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/util/ClusterUtils.java Tue Sep 26 18:02:17 2017
@@ -1,5 +1,6 @@
 package org.apache.ctakes.coreference.util;
 
+import org.apache.ctakes.temporal.utils.PatientViewsUtil;
 import org.apache.uima.jcas.cas.NonEmptyFSList;
 import org.apache.uima.jcas.tcas.Annotation;
 
@@ -9,7 +10,7 @@ public class ClusterUtils {
     Annotation annot = (Annotation) cur.getHead();
     
     // check if the focus annotation is before any of the list elements
-    if(annot.getEnd() > focus.getEnd()) return null;
+    if(PatientViewsUtil.isSameDocument(annot, focus) && annot.getEnd() > focus.getEnd()) return null;
     
     while(cur.getTail() instanceof NonEmptyFSList){
       cur = (NonEmptyFSList) cur.getTail();

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/ThymePatientViewAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/ThymePatientViewAnnotator.java?rev=1809768&r1=1809767&r2=1809768&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/ThymePatientViewAnnotator.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/ThymePatientViewAnnotator.java Tue Sep 26 18:02:17 2017
@@ -4,8 +4,10 @@ import java.io.File;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
+import com.google.common.collect.Ordering;
 import org.apache.ctakes.temporal.eval.Evaluation_ImplBase;
 import org.apache.ctakes.temporal.utils.PatientViewsUtil;
 import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
@@ -33,7 +35,7 @@ public class ThymePatientViewAnnotator e
       // Create views for each document: One that has the document URI, one for system-created annotations, and 
       // a third for gold-standard annotations.
       List<File> subdirs = Arrays.asList(uriFile.listFiles());
-      Collections.sort(subdirs);
+      Collections.sort(subdirs, new ThymeFileSorter());
       for(int i = 0; i < subdirs.size(); i++){          
         String uriViewName = PatientViewsUtil.getUriViewName(i);
         ViewCreatorAnnotator.createViewSafely(jCas, uriViewName);
@@ -64,3 +66,22 @@ public class ThymePatientViewAnnotator e
     }
   }
 }
+
+class ThymeFileSorter implements Comparator<File> {
+  Comparator<String> fileComparator = Comparator.<String>naturalOrder();
+
+  @Override
+  public int compare(File f1, File f2) {
+    if(f1.getName().startsWith("ID")){
+      // Colon cancer:
+      String docId1 = f1.getName().substring(f1.getName().lastIndexOf("_")+1);
+      String docId2 =  f2.getName().substring(f2.getName().lastIndexOf("_")+1);
+      return fileComparator.compare(docId1, docId2);
+
+      //return id1 - id2;
+    }else{
+      // brain cancer -- normal sorting will be correct
+      return fileComparator.compare(f1.getName(), f2.getName());
+    }
+  }
+}
\ No newline at end of file

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/utils/PatientViewsUtil.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/utils/PatientViewsUtil.java?rev=1809768&r1=1809767&r2=1809768&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/utils/PatientViewsUtil.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/utils/PatientViewsUtil.java Tue Sep 26 18:02:17 2017
@@ -1,8 +1,28 @@
+/*
+ * 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.utils;
 
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.cas.CASException;
 import org.apache.uima.fit.factory.AggregateBuilder;
 import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.tcas.Annotation;
 import org.apache.uima.resource.ResourceInitializationException;
 
 public class PatientViewsUtil {
@@ -31,7 +51,26 @@ public class PatientViewsUtil {
   public static boolean isGoldView(JCas jcas){
     return jcas.getViewName().startsWith(GOLD_PREFIX);
   }
-  
+
+  public static boolean isSameDocument(Annotation a1, Annotation a2){
+    return a1.getView().equals(a2.getView());
+  }
+
+  public static JCas getPreviousDocumentCas(JCas jcas){
+    String name = jcas.getViewName();
+    if(name.startsWith(VIEW_PREFIX)){
+      int docNum = Integer.parseInt(name.split("_")[1]);
+      if(docNum == 0) return null;
+      try {
+        return jcas.getView(getViewName(docNum-1));
+      } catch (CASException e) {
+        e.printStackTrace();
+        System.err.println("Error: Could not find CAS for previous document for document number: " + docNum);
+        return null;
+      }
+    }
+    return null;
+  }
   public static String getAnnotatorName(String rawName, int viewNum){
     return String.join("_", rawName, "DocumentIndex", String.valueOf(viewNum));
   }