/*
* Copyright (c) 1998-2005, The University of Sheffield.
*
* This file is part of GATE (see http://gate.ac.uk/), and is free
* software, licenced under the GNU Library General Public License,
* Version 2, June 1991 (in the distribution as file licence.html,
* and also available at http://gate.ac.uk/gate/licence.html).
*
* Valentin Tablan 19/11/2002
* semantic type added by Mike Dowman 31-03-2004
* Weightings added by Mike Dowman 24-5-2004
*
*
* $Id: Attribute.java 6974 2005-10-18 11:52:16 +0000 (Tue, 18 Oct 2005) nirajaswani $
*
*/
package gate.learning;
import gate.util.GateException;
import java.util.ArrayList;
import org.jdom.Element;
/**
* Desribe and read the ATTRIBUTE, one type of features in the dataset
* definition.
*/
public class Attribute {
// These constants are used only for returning values from
// semanticType
public static final int NOMINAL = 1;
public static final int NUMERIC = 2;
public static final int BOOLEAN = 3;
boolean isClass = false;
String name;
String type;
String feature;
int position;
// Create a feature on an annotation generated
// by an UniEngine with the confidence as value
String confidence_feature;
int semantic_type = Attribute.NOMINAL;
// The SVMLightWrapper allows weighting for attributes to be specified
// in
// the configuration file, and those weightings are stored in this
// member.
// Weightings are (at time of writing) ignored by the Weka and Maxent
// wrappers.
double weighting;
/**
* Constuctor Create an Attribute object from an xml element.
*/
public Attribute(Element jdomElement) throws GateException {
// find the name
Element anElement = jdomElement.getChild("NAME");
if(anElement == null)
throw new GateException(
"Required element \"NAME\" not present in attribute:\n"
+ jdomElement.toString() + "!");
else name = anElement.getTextTrim();
// find the semantic type
anElement = jdomElement.getChild("SEMTYPE");
if(anElement == null)
throw new GateException(
"Required element \"SEMTYPE\" not present in attribute:\n"
+ jdomElement.toString() + "!");
else {
if(anElement.getTextTrim().equalsIgnoreCase("NOMINAL"))
this.semantic_type = Attribute.NOMINAL;
else if(anElement.getTextTrim().equalsIgnoreCase("NUMERIC"))
this.semantic_type = Attribute.NUMERIC;
else if(anElement.getTextTrim().equalsIgnoreCase("BOOLEAN"))
this.semantic_type = Attribute.BOOLEAN;
}
// find the type
anElement = jdomElement.getChild("TYPE");
if(anElement == null)
throw new GateException(
"Required element \"TYPE\" not present in attribute:\n"
+ jdomElement.toString() + "!");
else type = anElement.getTextTrim();
// find the feature if present
anElement = jdomElement.getChild("FEATURE");
if(anElement != null) feature = anElement.getTextTrim();
// find the position if present
anElement = jdomElement.getChild("POSITION");
if(anElement == null)
position = 0;
else position = Integer.parseInt(anElement.getTextTrim());
// find the weighting if present
anElement = jdomElement.getChild("WEIGHTING");
if(anElement == null)
weighting = 1.0;
else weighting = Double.parseDouble(anElement.getTextTrim());
//Replace the possible character "_" which was used as separator
name = name.replaceAll(ConstantParameters.SEPARAPERINFeaturesName,
ConstantParameters.SEPFeatureNamesREPLACEMENT);
// find the class if present
// confidence_feature
anElement = jdomElement.getChild("CLASS");
isClass = anElement != null;
}
public Attribute() {
name = null;
type = null;
feature = null;
isClass = false;
position = 0;
weighting = 1.0;
confidence_feature = null;
}
public String toString() {
StringBuffer res = new StringBuffer();
res.append("Name: " + name + "\n");
res.append("SemType: " + this.semantic_type + "\n");
res.append("Type: " + type + "\n");
res.append("Feature: " + feature + "\n");
res.append("Weighting: " + weighting + "\n");
if(isClass) res.append("Class");
return res.toString();
}
public boolean isClass() {
return isClass;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setType(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setFeature(String feature) {
this.feature = feature;
}
public String getFeature() {
return feature;
}
public void setWeighting(double weighting) {
this.weighting = weighting;
}
public double getWeighting() {
return weighting;
}
public int getPosition() {
return position;
}
public void setClass(boolean isClass) {
this.isClass = isClass;
}
public void setPosition(int position) {
this.position = position;
}
public void setSemanticType(int type) {
this.semantic_type = type;
}
public String getConfidence_feature() {
return confidence_feature;
}
public void setConfidence_feature(String confidence_feature) {
this.confidence_feature = confidence_feature;
}
public int getSemantic_type() {
return semantic_type;
}
public void setSemantic_type(int semantic_type) {
this.semantic_type = semantic_type;
}
/**
* This method reports whether the attribute is nominal, numeric or boolean.
*
* @return Attribute.NOMINAL, Attribute.NUMERIC or Attribute.BOOLEAN
*/
public int semanticType() {
return this.semantic_type;
}
public String toXML() {
StringBuffer sb = new StringBuffer();
sb.append(" ").append("<ATTRIBUTE>\n");
sb.append(" ").append("<NAME>").append(this.name).append("</NAME>\n");
sb.append(" ").append("<SEMTYPE>");
if(this.semantic_type == Attribute.NOMINAL)
sb.append("NOMINAL");
else if(this.semantic_type == Attribute.BOOLEAN)
sb.append("BOOLEAN");
else sb.append("NUMERIC");
sb.append("</SEMTYPE>\n");
sb.append(" ").append("<TYPE>").append(this.type).append("</TYPE>\n");
if(feature != null) {
sb.append(" ").append("<FEATURE>").append(this.feature).append(
"</FEATURE>\n");
}
sb.append(" ").append("<POSITION>").append(this.position).append(
"</POSITION>\n");
if(isClass) sb.append(" ").append("<CLASS/>\n");
sb.append(" ").append("</ATTRIBUTE>\n");
return sb.toString();
}
/**
* This method is a clone of gate.creole.mi.Attribute.parseSerie method with
* minor changes to make it compatible with ML API. It basically given an
* attribute element first locates all required variable and creates multiple
* attributes for the given RANGE.
*/
public static java.util.List<Attribute> parseSerie(Element jdomElement)
throws GateException {
// find the name
Element anElement = jdomElement.getChild("NAME");
if(anElement == null)
throw new GateException(
"Required element \"NAME\" not present in attribute:\n"
+ jdomElement.toString() + "!");
String name = anElement.getTextTrim();
// find the semantic type
anElement = jdomElement.getChild("SEMTYPE");
if(anElement == null)
throw new GateException(
"Required element \"SEMTYPE\" not present in attribute:\n"
+ jdomElement.toString() + "!");
int semantic_type = Attribute.NOMINAL;
if(anElement.getTextTrim().equalsIgnoreCase("NUMERIC"))
semantic_type = Attribute.NUMERIC;
else if(anElement.getTextTrim().equalsIgnoreCase("BOOLEAN"))
semantic_type = Attribute.BOOLEAN;
// find the type
anElement = jdomElement.getChild("TYPE");
if(anElement == null)
throw new GateException(
"Required element \"TYPE\" not present in attribute:\n"
+ jdomElement.toString() + "!");
String type = anElement.getTextTrim();
String feature = null;
// find the feature if present
anElement = jdomElement.getChild("FEATURE");
if(anElement != null) feature = anElement.getTextTrim();
int minpos = 0;
int maxpos = 0;
// find the range of this element (e.g. from - to)
anElement = jdomElement.getChild("RANGE");
try {
minpos = Integer.parseInt(anElement.getAttributeValue("from").trim());
maxpos = Integer.parseInt(anElement.getAttributeValue("to").trim());
} catch(Exception e) {
throw new GateException("Range element is uncorrect:\n"
+ jdomElement.toString() + "!");
}
double weighting = 1.0;
// find the weighting if present
anElement = jdomElement.getChild("WEIGHTING");
if(anElement != null)
weighting = Double.parseDouble(anElement.getTextTrim());
// Replace the possible character "_" which was used as separator
name = name.replaceAll(ConstantParameters.SEPARAPERINFeaturesName,
ConstantParameters.SEPFeatureNamesREPLACEMENT);
// find the class if present
boolean isClass = jdomElement.getChild("CLASS") != null;
if(isClass) { throw new GateException(
"Cannot define the class in a serie:\n" + jdomElement.toString() + "!"); }
// Create a list of Attributes
ArrayList<Attribute>attributes = new ArrayList<Attribute>();
for(int position = minpos; position < maxpos + 1; position++) {
Attribute attribute = new Attribute();
attribute.setClass(false);
attribute.setFeature(feature);
attribute.setName(name);
attribute.setPosition(position);
attribute.setSemanticType(semantic_type);
attribute.setType(type);
attribute.setWeighting(weighting);
attributes.add(attribute);
}
return attributes;
}
}