package edu.stanford.nlp.quoteattribution.Sieves.QMSieves;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.QuoteAttributionAnnotator;
import edu.stanford.nlp.quoteattribution.*;
import edu.stanford.nlp.util.CoreMap;
import edu.stanford.nlp.util.Pair;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by mjfang on 7/7/16.
*/
public class ClosestMentionSieve extends QMSieve {
public ClosestMentionSieve(Annotation doc, Map<String, List<Person>> characterMap, Map<Integer, String> pronounCorefMap, Set<String> animacySet) {
super(doc, characterMap, pronounCorefMap, animacySet, "closestBaseline");
}
public MentionData getClosestMention(CoreMap quote) {
MentionData closestBackward = findClosestMentionInSpanBackward(new Pair<>(0, quote.get(CoreAnnotations.TokenBeginAnnotation.class) - 1));
MentionData closestForward = findClosestMentionInSpanForward(new Pair<>(quote.get(CoreAnnotations.TokenEndAnnotation.class), doc.get(CoreAnnotations.TokensAnnotation.class).size() - 1));
int backDistance = quote.get(CoreAnnotations.TokenBeginAnnotation.class) - closestBackward.end;
int forwardDistance = closestForward.begin - quote.get(CoreAnnotations.TokenEndAnnotation.class) + 1;
if(backDistance < forwardDistance) {
return closestBackward;
} else {
return closestForward;
}
}
public void doQuoteToMention(Annotation doc) {
List<CoreMap> quotes = doc.get(CoreAnnotations.QuotationsAnnotation.class);
for(CoreMap quote : quotes) {
if(quote.get(QuoteAttributionAnnotator.MentionAnnotation.class) != null) {
MentionData md = getClosestMention(quote);
fillInMention(quote, md, sieveName);
}
}
}
}