package edu.stanford.nlp.ie.crf;
import edu.stanford.nlp.ling.Datum;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
/**
* The representation of Datums used internally in CRFClassifier.
*
* @author Jenny Finkel
*/
public class CRFDatum<FEAT,LAB> implements Serializable {
/**
* Features for this Datum.
*/
@SuppressWarnings({"NonSerializableFieldInSerializableClass"})
private final List<FEAT> features;
@SuppressWarnings({"NonSerializableFieldInSerializableClass"})
private final LAB label;
@SuppressWarnings({"NonSerializableFieldInSerializableClass"})
// featureVals holds the (optional) feature value for non-boolean features
// such as the ones used in continuous vector space embeddings
private final List<double[]> featureVals;
/**
* Constructs a new BasicDatum with the given features and label.
*
* @param features The features of the CRFDatum
* @param label The label of the CRFDatum
*/
public CRFDatum(List<FEAT> features, LAB label, List<double[]> featureVals) {
this.features = features;
this.label = label;
this.featureVals = featureVals;
}
/**
* Returns the collection that this BasicDatum was constructed with.
*
* @return the collection that this BasicDatum was constructed with.
*/
public List<FEAT> asFeatures() {
return features;
}
/**
* Returns the double array containing the feature values
*
* @return the double array that contains the feature values matching each feature as
* returned by <code>asFeatures()</code>
*/
public List<double[]> asFeatureVals() {
return featureVals;
}
/**
* Returns the label for this Datum, or null if none have been set.
* @return The label for this Datum, or null if none have been set.
*/
public LAB label() {
return label;
}
/**
* Returns a String representation of this BasicDatum (lists features and labels).
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder("CRFDatum[\n");
sb.append(" label=").append(label).append('\n');
for (int i = 0, sz = features.size(); i < sz; i++) {
sb.append(" features(").append(i).append("):").append(features.get(i));
sb.append(", val=").append(Arrays.toString(featureVals.get(i)));
sb.append('\n');
}
sb.append(']');
return sb.toString();
}
/**
* Returns whether the given Datum contains the same features as this Datum.
* Doesn't check the labels, should we change this?
* (CDM Feb 2012: Also doesn't correctly respect the contract for equals,
* since it gives one way equality with other Datum's.)
*
* @param o The object to test equality with
* @return Whether it is equal to this CRFDatum in terms of features
*/
@Override
public boolean equals(Object o) {
if (!(o instanceof Datum)) {
return (false);
}
Datum d = (Datum) o;
return features.equals(d.asFeatures());
}
@Override
public int hashCode() {
return features.hashCode();
}
private static final long serialVersionUID = -8345554365027671190L;
}