package cc.mallet.types;
/** Efficient, compact, incremental counting of features in an alphabet. */
public class FeatureCounter
{
Alphabet alphabet;
gnu.trove.TIntIntHashMap featureCounts;
public FeatureCounter (Alphabet alphabet) {
this.alphabet = alphabet;
featureCounts = new gnu.trove.TIntIntHashMap();
}
public int increment (Object entry) {
return featureCounts.adjustOrPutValue(alphabet.lookupIndex(entry), 1, 1);
}
public int increment (Object entry, int incr) {
return featureCounts.adjustOrPutValue(alphabet.lookupIndex(entry), incr, incr);
}
public int increment (int featureIndex) {
if (featureIndex < 0 || featureIndex > alphabet.size())
throw new IllegalArgumentException ("featureIndex "+featureIndex+" out of range");
return featureCounts.adjustOrPutValue(featureIndex, 1, 1);
}
public int increment (int featureIndex, int incr) {
if (featureIndex < 0 || featureIndex > alphabet.size())
throw new IllegalArgumentException ("featureIndex "+featureIndex+" out of range");
return featureCounts.adjustOrPutValue(featureIndex, incr, incr);
}
public int get (int featureIndex) {
if (featureIndex < 0 || featureIndex > alphabet.size())
throw new IllegalArgumentException ("featureIndex "+featureIndex+" out of range");
return featureCounts.get (featureIndex);
}
/** Unlike increment(Object), this method does not add the entry to the Alphabet if it is not there already. */
public int get (Object entry) {
int fi = alphabet.lookupIndex(entry, false);
if (fi == -1)
return 0;
else
return featureCounts.get (fi);
}
public int put (int featureIndex, int value) {
if (featureIndex < 0 || featureIndex > alphabet.size())
throw new IllegalArgumentException ("featureIndex "+featureIndex+" out of range");
return featureCounts.put (featureIndex, value);
}
public int put (Object entry, int value) {
return featureCounts.put (alphabet.lookupIndex(entry), value);
}
public FeatureVector toFeatureVector () {
int[] indices = featureCounts.keys();
double[] values = new double[indices.length];
for (int i = 0; i < indices.length; i++)
values[i] = featureCounts.get(indices[i]);
return new FeatureVector (alphabet, indices, values);
}
public RankedFeatureVector toRankedFeatureVector () {
int[] indices = featureCounts.keys();
double[] values = new double[indices.length];
for (int i = 0; i < indices.length; i++)
values[i] = featureCounts.get(indices[i]);
return new RankedFeatureVector (alphabet, indices, values);
}
}