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));
}