package edu.stanford.nlp.quoteattribution.Sieves.MSSieves;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.quoteattribution.Person;
import edu.stanford.nlp.pipeline.QuoteAttributionAnnotator;
import edu.stanford.nlp.util.CoreMap;
import edu.stanford.nlp.util.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by mjfang on 7/8/16.
*/
public class LooseConversationalSpeakerSieve extends MSSieve {
public LooseConversationalSpeakerSieve(Annotation doc, Map<String, List<Person>> characterMap, Map<Integer, String> pronounCorefMap, Set<String> animacySet) {
super(doc, characterMap, pronounCorefMap, animacySet);
}
public void doMentionToSpeaker(Annotation doc) {
List<CoreMap> quotes = doc.get(CoreAnnotations.QuotationsAnnotation.class);
List<List<Pair<Integer, Integer>>> skipChains = new ArrayList<>();
List<Pair<Integer, Integer>> currChain = new ArrayList<>(); //Pairs are (pred_idx, paragraph_idx)
for(int quote_idx = 0; quote_idx < quotes.size(); quote_idx++) {
CoreMap quote = quotes.get(quote_idx);
if(quote.get(QuoteAttributionAnnotator.SpeakerAnnotation.class) != null) {
int para_idx = getQuoteParagraph(quote);
if (currChain.size() == 0) {
currChain.add(new Pair<>(quote_idx, para_idx));
} else {
if (currChain.get(currChain.size() - 1).second == para_idx - 2) {
currChain.add(new Pair<>(quote_idx, para_idx));
} else {
skipChains.add(currChain);
currChain = new ArrayList<>();
currChain.add(new Pair<>(quote_idx, para_idx));
}
}
}
}
if(currChain.size() != 0) {
skipChains.add(currChain);
}
for(List<Pair<Integer, Integer>> skipChain : skipChains) {
Pair<Integer, Integer> firstPair = skipChain.get(0);
int firstParagraph = firstPair.second;
//look for conversational chain candidate
for(int prev_idx = firstPair.first - 1; prev_idx >= 0; prev_idx--) {
CoreMap quote = quotes.get(prev_idx + 1);
CoreMap prevQuote = quotes.get(prev_idx);
if(getQuoteParagraph(prevQuote) == firstParagraph - 2) {
quote.set(QuoteAttributionAnnotator.SpeakerAnnotation.class, prevQuote.get(QuoteAttributionAnnotator.SpeakerAnnotation.class));
quote.set(QuoteAttributionAnnotator.SpeakerSieveAnnotation.class, "Loose Conversational Speaker");
}
}
}
}
}