package edu.stanford.nlp.time;
import edu.stanford.nlp.ling.CoreAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.tokensregex.Env;
import edu.stanford.nlp.ling.tokensregex.MatchedExpression;
import edu.stanford.nlp.ling.tokensregex.types.Expressions;
import edu.stanford.nlp.pipeline.CoreMapAggregator;
import edu.stanford.nlp.util.CoreMap;
import edu.stanford.nlp.util.ErasureUtils;
import edu.stanford.nlp.util.Interval;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
/**
* Time Expression.
*
* @author Angel Chang
*/
public class TimeExpression extends MatchedExpression {
/**
* The CoreMap key for storing a SUTime.TimeIndex (for looking up Timex Id).
*/
public static class TimeIndexAnnotation implements CoreAnnotation<SUTime.TimeIndex> {
@Override
public Class<SUTime.TimeIndex> getType() {
return SUTime.TimeIndex.class;
}
}
// todo [cdm 2016]: Rename this class!
/**
* The CoreMap key for storing a TimeExpression annotation.
*/
public static class Annotation implements CoreAnnotation<TimeExpression> {
@Override
public Class<TimeExpression> getType() {
return TimeExpression.class;
}
}
/**
* The CoreMap key for storing a nested annotations.
*/
public static class ChildrenAnnotation implements CoreAnnotation<List<? extends CoreMap>> {
@Override
public Class<List<? extends CoreMap>> getType() {
return ErasureUtils.<Class<List<? extends CoreMap>>> uncheckedCast(List.class);
}
}
//int tid; // Time ID
SUTime.Temporal origTemporal; // todo [2013]: never read. Can delete? (Set in TimeExpressionExtractorImpl)
//int anchorTimeId = -1;
public TimeExpression(MatchedExpression expr)
{
super(expr);
}
public TimeExpression(Interval<Integer> charOffsets, Interval<Integer> tokenOffsets,
Function<CoreMap, SUTime.Temporal> temporalFunc, double priority, double weight)
{
super(charOffsets, tokenOffsets, getSingleAnnotationExtractor(temporalFunc), priority, weight);
}
protected static final Function<MatchedExpression, TimeExpression> TimeExpressionConverter = in -> {
if (in == null) return null;
if (in instanceof TimeExpression) return (TimeExpression) in;
TimeExpression newExpr = new TimeExpression(in);
if (newExpr.getAnnotation().get(Annotation.class) == in) {
newExpr.getAnnotation().set(Annotation.class, newExpr);
}
return newExpr;
};
private static SingleAnnotationExtractor getSingleAnnotationExtractor(final Function<CoreMap, SUTime.Temporal> temporalFunc)
{
SingleAnnotationExtractor extractFunc = new SingleAnnotationExtractor();
extractFunc.valueExtractor = in -> {
SUTime.Temporal t = temporalFunc.apply(in);
return new Expressions.PrimitiveValue<>("Temporal", t);
};
extractFunc.tokensAnnotationField = CoreAnnotations.NumerizedTokensAnnotation.class;
extractFunc.resultAnnotationField = Collections.singletonList((Class) TimeExpression.Annotation.class);
extractFunc.resultNestedAnnotationField = TimeExpression.ChildrenAnnotation.class;
extractFunc.resultAnnotationExtractor = TimeExpressionConverter;
extractFunc.tokensAggregator = CoreMapAggregator.DEFAULT_NUMERIC_TOKENS_AGGREGATOR;
return extractFunc;
}
public boolean addMod()
{
SUTime.Temporal t = getTemporal();
if (t != null) {
if (t != SUTime.TIME_NONE_OK) {
setTemporal(t);
return true;
} else {
return false;
}
} else {
return true;
}
}
@Override
public boolean extractAnnotation(Env env, CoreMap sourceAnnotation)
{
boolean okay = super.extractAnnotation(env, sourceAnnotation);
//super.extractAnnotation(sourceAnnotation, CoreAnnotations.NumerizedTokensAnnotation.class,
//CoreMapAttributeAggregator.DEFAULT_NUMERIC_TOKENS_AGGREGATORS,
//TimeExpression.Annotation.class, TimeExpression.ChildrenAnnotation.class);
if (okay) {
return addMod();
} else {
return false;
}
}
@Override
public boolean extractAnnotation(Env env, List<? extends CoreMap> source)
{
boolean okay = super.extractAnnotation(env, source);
//super.extractAnnotation(source, CoreMapAttributeAggregator.getDefaultAggregators(),
//TimeExpression.Annotation.class, TimeExpression.ChildrenAnnotation.class);
if (okay) {
return addMod();
} else {
return false;
}
}
/* public int getTid() {
return tid;
}*/
public SUTime.Temporal getTemporal() {
if (value != null && value.get() instanceof SUTime.Temporal) {
return (SUTime.Temporal) value.get();
}
return null;
}
public void setTemporal(SUTime.Temporal temporal) {
this.value = new Expressions.PrimitiveValue<>("Temporal", temporal);
}
/* public String toString()
{
return text;
} */
/* public Timex getTimex(SUTime.TimeIndex timeIndex) {
Timex timex = temporal.getTimex(timeIndex);
timex.text = text;
timex.xml = timex
assert(timex.tid == tid);
} */
}