You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by cl...@apache.org on 2016/04/25 23:00:41 UTC

svn commit: r1740899 - in /ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor: ae/LocationOfRelationExtractorAnnotator.java eval/RelationExtractorEvaluation.java

Author: clin
Date: Mon Apr 25 21:00:41 2016
New Revision: 1740899

URL: http://svn.apache.org/viewvc?rev=1740899&view=rev
Log:
add back event-expansion for training location-of model:
to expand use parameter:
--expand-events

Modified:
    ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/ae/LocationOfRelationExtractorAnnotator.java
    ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/eval/RelationExtractorEvaluation.java

Modified: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/ae/LocationOfRelationExtractorAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/ae/LocationOfRelationExtractorAnnotator.java?rev=1740899&r1=1740898&r2=1740899&view=diff
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/ae/LocationOfRelationExtractorAnnotator.java (original)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/ae/LocationOfRelationExtractorAnnotator.java Mon Apr 25 21:00:41 2016
@@ -19,12 +19,16 @@
 package org.apache.ctakes.relationextractor.ae;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.ctakes.relationextractor.eval.RelationExtractorEvaluation;
 import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
 import org.apache.ctakes.typesystem.type.relation.LocationOfTextRelation;
 import org.apache.ctakes.typesystem.type.relation.RelationArgument;
 import org.apache.ctakes.typesystem.type.textsem.AnatomicalSiteMention;
+import org.apache.ctakes.typesystem.type.textsem.EntityMention;
 import org.apache.ctakes.typesystem.type.textsem.EventMention;
 import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
 import org.apache.ctakes.typesystem.type.textspan.Sentence;
@@ -55,17 +59,63 @@ public class LocationOfRelationExtractor
 
 		List<IdentifiedAnnotationPair> pairs = new ArrayList<>();
 		
-		for (EventMention event : events) {
+		if(RelationExtractorEvaluation.expandEvent){//if expand
+			Map<EventMention, Collection<EventMention>> coveredMap =
+					JCasUtil.indexCovered(identifiedAnnotationView, EventMention.class, EventMention.class);
+			Map<EventMention, Collection<EventMention>> coveringMap =
+					JCasUtil.indexCovering(identifiedAnnotationView, EventMention.class, EventMention.class);
+			Map<AnatomicalSiteMention, Collection<EventMention>> siteEventMap =
+					JCasUtil.indexCovered(identifiedAnnotationView, AnatomicalSiteMention.class, EventMention.class);
+			Map<AnatomicalSiteMention, Collection<EntityMention>> siteEntityMap =
+					JCasUtil.indexCovering(identifiedAnnotationView, AnatomicalSiteMention.class, EntityMention.class);
+			
+			final List<IdentifiedAnnotation> eventList = new ArrayList<>();
+			for (EventMention event : events) {
+				eventList.addAll(coveringMap.get(event));
+				eventList.addAll(coveredMap.get(event));
+				for(IdentifiedAnnotation covEvent : eventList){
+					for (AnatomicalSiteMention site : sites) {
+						if(!hasOverlap(covEvent,site)){
+							pairs.add(new IdentifiedAnnotationPair(covEvent, site));
+						}
+					}
+				}
+				eventList.clear();
 				for (AnatomicalSiteMention site : sites) {
 					pairs.add(new IdentifiedAnnotationPair(event, site));
+					eventList.addAll(siteEventMap.get(site));
+					eventList.addAll(siteEntityMap.get(site));
+					for(IdentifiedAnnotation covSite : eventList){
+						if(!hasOverlap(event,covSite)){
+							pairs.add(new IdentifiedAnnotationPair(event, covSite));
+						}
+					}
+					eventList.clear();
 				}
+				
+			}
+		}else{//id don't expand
+			for (EventMention event : events) {
+				for (AnatomicalSiteMention site : sites) {
+					pairs.add(new IdentifiedAnnotationPair(event, site));
+				}
+			}
 		}
 		
 		
 		return pairs;
 	}
 	
-	
+	private static boolean hasOverlap(Annotation event1, Annotation event2) {
+		if(event1.getEnd()>=event2.getBegin()&&event1.getEnd()<=event2.getEnd()){
+			return true;
+		}
+		if(event2.getEnd()>=event1.getBegin()&&event2.getEnd()<=event1.getEnd()){
+			return true;
+		}
+		return false;
+	}
+
 	@Override
 	protected void createRelation(
 			JCas jCas,

Modified: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/eval/RelationExtractorEvaluation.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/eval/RelationExtractorEvaluation.java?rev=1740899&r1=1740898&r2=1740899&view=diff
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/eval/RelationExtractorEvaluation.java (original)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/eval/RelationExtractorEvaluation.java Mon Apr 25 21:00:41 2016
@@ -50,6 +50,7 @@ import org.apache.ctakes.typesystem.type
 import org.apache.ctakes.typesystem.type.relation.ManagesTreatsTextRelation;
 import org.apache.ctakes.typesystem.type.relation.ManifestationOfTextRelation;
 import org.apache.ctakes.typesystem.type.relation.RelationArgument;
+import org.apache.ctakes.typesystem.type.textsem.AnatomicalSiteMention;
 import org.apache.ctakes.typesystem.type.textsem.EntityMention;
 import org.apache.ctakes.typesystem.type.textsem.EventMention;
 import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
@@ -127,6 +128,11 @@ public class RelationExtractorEvaluation
 				longName = "class-weights",
 				description = "automatically set class-wise weights for inbalanced training data")
 		public boolean getClassWeights();
+		
+		@Option(
+				longName = "expand-events",
+				description = "expand events to their covering or covered events")
+		public boolean getExpandEvents();
 
 	}
 
@@ -227,7 +233,8 @@ public class RelationExtractorEvaluation
 									options.getAllowSmallerSystemArguments(),
 									options.getIgnoreImpossibleGoldRelations(),
 									options.getPrintErrors(),
-									options.getClassWeights());
+									options.getClassWeights(),
+									options.getExpandEvents());
 						}
 					});
 		}
@@ -250,6 +257,8 @@ public class RelationExtractorEvaluation
 	private boolean setClassWeights;
 
 	private static PrintWriter outPrint;
+	
+	public static boolean expandEvent = false;
 
 	/**
 	 * An evaluation of a relation extractor.
@@ -282,7 +291,8 @@ public class RelationExtractorEvaluation
 			boolean allowSmallerSystemArguments,
 			boolean ignoreImpossibleGoldRelations,
 			boolean printErrors,
-			boolean setClassWeights) {
+			boolean setClassWeights,
+			boolean expandEventParameter) {
 		super(baseDirectory);
 		this.relationClass = relationClass;
 		this.classifierAnnotatorClass = classifierAnnotatorClass;
@@ -292,6 +302,7 @@ public class RelationExtractorEvaluation
 		this.ignoreImpossibleGoldRelations = ignoreImpossibleGoldRelations;
 		this.printErrors = printErrors;
 		this.setClassWeights = setClassWeights;
+		expandEvent = expandEventParameter;
 	}
 
 	public RelationExtractorEvaluation(
@@ -308,6 +319,7 @@ public class RelationExtractorEvaluation
 				false,
 				false,
 				false,
+				false,
 				false);
 	}
 
@@ -325,6 +337,10 @@ public class RelationExtractorEvaluation
 		// in the gold relations
 		builder.add(AnalysisEngineFactory.createEngineDescription(RemoveCTakesMentionsAndCopyGoldRelations.class));
 
+		//add potential events for training:
+		if (expandEvent && this.relationClass.getSimpleName().equals("LocationOfTextRelation") )
+			builder.add(AnalysisEngineFactory.createEngineDescription(AddPotentialRelations.class));
+
 		// add the relation extractor, configured for training mode
 		AnalysisEngineDescription classifierAnnotator =
 				AnalysisEngineFactory.createEngineDescription(
@@ -366,6 +382,94 @@ public class RelationExtractorEvaluation
 		}
 	}
 
+	public static class AddPotentialRelations extends JCasAnnotator_ImplBase {
+		@Override
+		public void process(JCas jCas) throws AnalysisEngineProcessException {
+			JCas relationView = jCas;
+
+			Map<EventMention, Collection<EventMention>> coveredMap =
+					JCasUtil.indexCovered(relationView, EventMention.class, EventMention.class);
+			Map<EventMention, Collection<EventMention>> coveringMap =
+					JCasUtil.indexCovering(relationView, EventMention.class, EventMention.class);
+			Map<AnatomicalSiteMention, Collection<EventMention>> siteEventMap =
+					JCasUtil.indexCovered(relationView, AnatomicalSiteMention.class, EventMention.class);
+			Map<AnatomicalSiteMention, Collection<EntityMention>> siteEntityMap =
+					JCasUtil.indexCovering(relationView, AnatomicalSiteMention.class, EntityMention.class);
+			final List<IdentifiedAnnotation> eventList = new ArrayList<>();
+			for(LocationOfTextRelation relation : Lists.newArrayList(JCasUtil.select(relationView, LocationOfTextRelation.class))){
+				Annotation arg1 = relation.getArg1().getArgument();
+				Annotation arg2 = relation.getArg2().getArgument();
+				EventMention event = null;
+				if(arg1 instanceof EventMention && arg2 instanceof AnatomicalSiteMention){
+					event = (EventMention) arg1;
+
+					eventList.addAll(coveringMap.get(event));
+					eventList.addAll(coveredMap.get(event));
+					for(IdentifiedAnnotation covEvent : eventList){
+						if(!covEvent.getClass().equals(EventMention.class) && !hasOverlap(covEvent, arg2)){
+							createRelation(relationView, covEvent, arg2, relation.getCategory());
+						}
+					}
+					eventList.clear();
+					eventList.addAll(siteEventMap.get(arg2));
+					eventList.addAll(siteEntityMap.get(arg2));
+					for(IdentifiedAnnotation covSite : eventList){
+						if(!covSite.getClass().equals(EventMention.class) && !hasOverlap(arg1, covSite)){
+							createRelation(relationView, event, covSite, relation.getCategory());
+						}
+					}
+					eventList.clear();
+				}else if(arg2 instanceof EventMention && arg1 instanceof AnatomicalSiteMention){
+					event = (EventMention) arg2;
+					eventList.addAll(coveringMap.get(event));
+					eventList.addAll(coveredMap.get(event));
+					for(IdentifiedAnnotation covEvent : eventList){
+						if(!covEvent.getClass().equals(EventMention.class)&& !hasOverlap(arg1, covEvent)){
+							createRelation(relationView, arg1, covEvent, relation.getCategory());
+						}
+					}
+					eventList.clear();
+					eventList.addAll(siteEventMap.get(arg1));
+					eventList.addAll(siteEntityMap.get(arg1));
+					for(IdentifiedAnnotation covSite : eventList){
+						if(!covSite.getClass().equals(EventMention.class) && !hasOverlap(covSite, arg2)){
+							createRelation(relationView, covSite, event, relation.getCategory());
+						}
+					}
+					eventList.clear();
+				}
+			}
+
+		}
+
+		private static boolean hasOverlap(Annotation event1, Annotation event2) {
+			if(event1.getEnd()>=event2.getBegin()&&event1.getEnd()<=event2.getEnd()){
+				return true;
+			}
+			if(event2.getEnd()>=event1.getBegin()&&event2.getEnd()<=event1.getEnd()){
+				return true;
+			}
+			return false;
+		}
+
+		private static void createRelation(JCas jCas, Annotation arg1,
+				Annotation arg2, String category) {
+			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();
+			BinaryTextRelation relation = new BinaryTextRelation(jCas);
+			relation.setArg1(relArg1);
+			relation.setArg2(relArg2);
+			relation.setCategory(category);
+			relation.addToIndexes();
+
+		}
+	}
 
 	@Override
 	protected AnnotationStatistics<String> test(CollectionReader collectionReader, File directory)