package edu.stanford.nlp.sequences;
import edu.stanford.nlp.math.ArrayMath;
/**
* This class will sample an output from a sequence model. It assumes that
* the scores are (unnormalized) log-probabilities. It works by sampling
* each variable in order, conditioned on the previous variables.
*
* @author Jenny Finkel
*/
public class SequenceSampler implements BestSequenceFinder {
/**
* Samples each label in turn from left to right.
*
* @return an array containing the int tags of the best sequence
*/
@Override
public int[] bestSequence(SequenceModel ts) {
// Also allocate space for rightWindow, just in case sequence model uses
// it, even though this implementation doesn't. Probably it shouldn't,
// or the left-to-right sampling is invalid, but our test classes do.
int[] sample = new int[ts.length()+ts.leftWindow()+ts.rightWindow()];
for (int pos = ts.leftWindow(); pos < sample.length - ts.rightWindow(); pos++) {
double[] scores = ts.scoresOf(sample, pos);
for (int i = 0; i < scores.length; i++) {
scores[i] = Math.exp(scores[i]);
}
ArrayMath.normalize(scores);
int l = ArrayMath.sampleFromDistribution(scores);
sample[pos] = ts.getPossibleValues(pos)[l];
}
return sample;
}
}