package edu.stanford.nlp.pipeline;
import edu.stanford.nlp.process.CoreLabelTokenFactory;
import edu.stanford.nlp.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* Function that aggregates several core maps into one
*
* @author Angel Chang
*/
public class CoreMapAggregator implements Function<List<? extends CoreMap>, CoreMap> {
public static final CoreMapAggregator DEFAULT_AGGREGATOR = getAggregator(CoreMapAttributeAggregator.getDefaultAggregators());
public static final CoreMapAggregator DEFAULT_NUMERIC_TOKENS_AGGREGATOR = getAggregator(CoreMapAttributeAggregator.DEFAULT_NUMERIC_TOKENS_AGGREGATORS);
Map<Class, CoreMapAttributeAggregator> aggregators;
Class mergedKey = null; // Keeps chunks that were merged to form this one
CoreLabelTokenFactory tokenFactory = null; // Should we be creating tokens?
public CoreMapAggregator(Map<Class, CoreMapAttributeAggregator> aggregators) {
this.aggregators = aggregators;
}
public CoreMapAggregator(Map<Class, CoreMapAttributeAggregator> aggregators, Class mergedKey, CoreLabelTokenFactory tokenFactory) {
this.aggregators = aggregators;
this.mergedKey = mergedKey;
this.tokenFactory = tokenFactory;
}
public CoreMap merge(List<? extends CoreMap> in, int start, int end)
{
CoreMap merged = ChunkAnnotationUtils.getMergedChunk(in, start, end, aggregators, tokenFactory);
if (mergedKey != null) {
merged.set(mergedKey, new ArrayList<>(in.subList(start, end)));
}
return merged;
}
public CoreMap merge(List<? extends CoreMap> in) {
return merge(in, 0, in.size());
}
public CoreMap apply(List<? extends CoreMap> in) {
return merge(in, 0, in.size());
}
public static CoreMapAggregator getDefaultAggregator()
{
return DEFAULT_AGGREGATOR;
}
public static CoreMapAggregator getAggregator(Map<Class, CoreMapAttributeAggregator> aggregators)
{
return new CoreMapAggregator(aggregators);
}
public static CoreMapAggregator getAggregator(Map<Class, CoreMapAttributeAggregator> aggregators, Class key)
{
return new CoreMapAggregator(aggregators, key, null);
}
public static CoreMapAggregator getAggregator(Map<Class, CoreMapAttributeAggregator> aggregators, Class key, CoreLabelTokenFactory tokenFactory)
{
return new CoreMapAggregator(aggregators, key, tokenFactory);
}
public List<CoreMap> merge(List<? extends CoreMap> list, List<? extends HasInterval<Integer>> matched)
{
return CollectionUtils.mergeList(list, matched, this);
}
public <M> List<CoreMap> merge(List<? extends CoreMap> list, List<M> matched, Function<M, Interval<Integer>> toIntervalFunc)
{
return CollectionUtils.mergeList(list, matched, toIntervalFunc, this);
}
}