package edu.stanford.nlp.trees.international.negra;
import edu.stanford.nlp.ling.Label;
import edu.stanford.nlp.ling.LabelFactory;
import edu.stanford.nlp.ling.StringLabel;
import edu.stanford.nlp.util.Generics;
import java.util.Map;
/* An object for edge labels as implemented in the Negra treebank.
* Negra labels need a CATEGORY, an EDGE LABEL, and a MORPHOLOGICAL
* INFORMATION value. There is a different object for lexicalized
* Negra labels.
*
* @author Roger Levy
*/
public class NegraLabel extends StringLabel {
/**
*
*/
private static final long serialVersionUID = 2847331882765391095L;
public static final String FEATURE_SEP = "#";
private String edge;
@Override
public LabelFactory labelFactory() {
return new NegraLabelFactory();
}
private static class NegraLabelFactory implements LabelFactory {
public Label newLabel(String labelStr) {
return new NegraLabel(labelStr);
}
/**
* Options don't do anything.
*/
public Label newLabel(String labelStr, int options) {
return newLabel(labelStr);
}
/**
* Nothing fancy now: just makes the argument the value of the label
*/
public Label newLabelFromString(String encodedLabelStr) {
return newLabel(encodedLabelStr);
}
/**
* Iff oldLabel is a NegraLabel, copy it.
*/
public Label newLabel(Label oldLabel) {
NegraLabel result;
if(oldLabel instanceof NegraLabel) {
NegraLabel l = (NegraLabel) oldLabel;
result = new NegraLabel(l.value(), l.getEdge(), Generics.<String,String>newHashMap());
for (Map.Entry<String,String> e : l.features.entrySet()) {
result.features.put(e.getKey(), e.getValue());
}
} else {
result = new NegraLabel(oldLabel.value());
}
return result;
}
}
private Map<String,String> features;
public void setEdge(String edge) {
this.edge = edge;
}
public String getEdge() {
return edge;
}
private NegraLabel() {
}
public NegraLabel(String str) {
this(str, Generics.<String,String>newHashMap());
}
public NegraLabel(String str, Map<String,String> features) {
this(str, null, features);
}
public NegraLabel(String str, String edge, Map<String,String> features) {
super(str);
this.edge = edge;
this.features = features;
}
public void setFeatureValue(String feature, String value) {
features.put(feature, value);
}
public String featureValue(String feature) {
return features.get(feature);
}
@Override
public String toString() {
String str = value();
if (edge != null) {
str += "->" + getEdge();
}
if ( ! features.isEmpty()) {
str += "." + features.toString();
}
return str;
}
}