
resources.jape.single.jape Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tagger-measurements Show documentation
Show all versions of tagger-measurements Show documentation
Processing resources for annotating and normalising both Arabic and Roman numbers
The newest version!
/*
* Copyright (c) 2009-2011, The University of Sheffield.
*
* This file is part of GATE (see http://gate.ac.uk/), and is free software,
* Licensed under the GNU Library General Public License, Version 3, June 2007
* (in the distribution as file licence.html, and also available at
* http://gate.ac.uk/gate/licence.html).
*/
Imports: {
import gate.creole.measurements.*;
}
Phase: Single
Input: Number Token Measurement CannotBeAMeasurement PossibleMeasurement
Options: control = appelt
Rule:Ignore
Priority: 1000
(
{CannotBeAMeasurement}
)
-->
{}
Rule: SkipMeasurements
Priority: 1000
/*
* If we have already annotated something as a measurement that we probably
* don't need to do so a second time
*/
(
{Measurement}
)
-->
{}
Rule: PlusMinusIntervals
Priority: 500
(
({Number}):number1
{Token.string == "±"}
({PossibleMeasurement}):number2
)
-->
{
Annotation possible = bindings.get("number2").iterator().next();
Annotation number1 = bindings.get("number1").iterator().next();
Annotation number2 = (Annotation)possible.getFeatures().get("number");
try {
Double startNumber = (Double)number1.getFeatures().get("value") - (Double)number2.getFeatures().get("value");
Double endNumber = (Double)number1.getFeatures().get("value") + (Double)number2.getFeatures().get("value");
MeasurementsParser parser = (MeasurementsParser)getActionContext().getPRFeatures().get("measurementsParser");
boolean consumeNumberAnnotations = (Boolean)getActionContext().getPRFeatures().get("consumeNumberAnnotations");
boolean ignoreDimensionlessUnits = (Boolean)getActionContext().getPRFeatures().get("ignoreDimensionlessUnits");
Measurement startValue = parser.parse(startNumber,doc,(List)possible.getFeatures().get("unitTokens"),inputAS.getName(), ignoreDimensionlessUnits);
if (startValue == null) return;
Measurement endValue = parser.parse(endNumber,doc,(List)possible.getFeatures().get("unitTokens"),inputAS.getName(), ignoreDimensionlessUnits);
if (endValue == null) return;
FeatureMap features = Factory.newFeatureMap();
features.put("type","interval");
features.put("rule","plusMinusIntervals");
features.put("normalizedUnit", startValue.getNormalizedUnit());
//TODO this assumes that the first measurement is less than the second
features.put("normalizedMinValue",startValue.getNormalizedValue());
features.put("normalizedMaxValue",endValue.getNormalizedValue());
String dimension = startValue.getDimension();
if (dimension != null) features.put("dimension",dimension);
outputAS.add(number1.getStartNode().getOffset(),number2.getEndNode().getOffset()+endValue.getParsedText().length(),"Measurement", features);
if (consumeNumberAnnotations) {
inputAS.remove(number1);
inputAS.remove(number2);
}
}
catch (Exception e) {
throw new NonFatalJapeException(e);
}
}
Rule: Temperatures
(
({Number}):number
({Token.string == "°"}|{Token.string == "degrees"})
({Token.string =~ "[CFK]"}):unit
)
-->
{
Annotation number = ((AnnotationSet)bindings.get("number")).iterator().next();
Annotation unit = ((AnnotationSet)bindings.get("unit")).iterator().next();
String unitText = "°"+unit.getFeatures().get("string");
try {
MeasurementsParser parser = (MeasurementsParser)getActionContext().getPRFeatures().get("measurementsParser");
boolean consumeNumberAnnotations = (Boolean)getActionContext().getPRFeatures().get("consumeNumberAnnotations");
Measurement value = parser.parse((Double)number.getFeatures().get("value"),unitText);
if (value == null) return;
FeatureMap features = Factory.newFeatureMap();
features.put("type","scalar");
features.put("value", value.getValue());
features.put("rule", "temperatures");
features.put("unit", unitText);
features.put("normalized", value.toString());
features.put("normalizedUnit", value.getNormalizedUnit());
features.put("normalizedValue", value.getNormalizedValue());
String dimension = value.getDimension();
if (dimension != null) features.put("dimension",dimension);
outputAS.add(number.getStartNode().getOffset(),unit.getEndNode().getOffset(),"Measurement", features);
if (consumeNumberAnnotations) inputAS.remove(number);
}
catch (Exception e) {
throw new NonFatalJapeException(e);
}
}
Rule: Measurement
(
{PossibleMeasurement}
):number
-->
{
Annotation possible = bindings.get("number").iterator().next();
Annotation number = (Annotation)possible.getFeatures().get("number");
try {
List unitTokens = (List)possible.getFeatures().get("unitTokens");
MeasurementsParser parser = (MeasurementsParser)getActionContext().getPRFeatures().get("measurementsParser");
boolean consumeNumberAnnotations = (Boolean)getActionContext().getPRFeatures().get("consumeNumberAnnotations");
boolean ignoreDimensionlessUnits = (Boolean)getActionContext().getPRFeatures().get("ignoreDimensionlessUnits");
Measurement value = parser.parse((Double)number.getFeatures().get("value"),doc, unitTokens, inputAS.getName(), ignoreDimensionlessUnits);
if (value == null) return;
FeatureMap features = Factory.newFeatureMap();
features.put("type","scalar");
features.put("rule","measurement");
features.put("value", value.getValue());
features.put("unit", value.getUnit());
features.put("normalized", value.toString());
features.put("normalizedUnit", value.getNormalizedUnit());
features.put("normalizedValue", value.getNormalizedValue());
String dimension = value.getDimension();
if (dimension != null) features.put("dimension",dimension);
outputAS.add(number.getStartNode().getOffset(),unitTokens.get(0).getStartNode().getOffset()+value.getParsedText().length(),"Measurement", features);
if (consumeNumberAnnotations) inputAS.remove(number);
}
catch (Exception e) {
e.printStackTrace();
//throw new NonFatalJapeException(e);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy