Description
This operation produces a smoothed, normalized language model from input n-gram count FST. It smooths the model in one of six ways:
- witten_bell: smooths using Witten-Bell (cite), with a hyperparameter k, as presented in Carpenter (2005).
- absolute: smooths based on Absolute Discounting (cite), using
bins
and discount
parameters.
- katz: smooths based on Katz Backoff (cite), using
bins
parameters.
- kneser_ney: smooths based on Kneser-Ney (cite), a variant of Absolute Discounting.
- presmoothed: normalizes at each state based on the n-gram count of the history.
- unsmoothed: normalizes the model but provides no smoothing.
See Chen and Goodman (1998) for a discussion of these smoothing methods.
All of the smoothing methods can be used to build either a mixture model (in which higher order n-gram distributions are interpolated with lower order n-gram distributions) or a backoff model (using the
--backoff option, in which lower order n-gram distributions are only used if the higher order n-gram was unobserved in the corpus). Even though some of the methods are typically primarily used with either mixture or backoff smoothing (e.g., Katz with backoff), in this library they can be used with either. Note that mixture models are converted to a backoff topology by pre-summing the mixtures and placing the mixed probability on the highest order transition.
If the
--bins option is left as the default (-1), then the number of bins for the discounting methods (
katz,absolute,kneser_ney
) are set to method appropriate defaults (5 for
katz
, 1 for
absolute
).
The C++ classes are all derived from the base class
NGramMake
.
Usage
ngrammake [--options] [in.fst [out.fst]]
--method: type = string, one of: witten_bell (default) | absolute | katz |
kneser_ney | presmoothed | unsmoothed
--backoff: type = bool, default = false
--bins: type = int64, default = -1
--witten_bell_k, type = double, default = 1.0
--discount_D, type = double, default = 1.0
|
|
class NGramAbsolute ngram(StdMutableFst *countfst);
|
|
class NGramKatz ngram(StdMutableFst *countfst);
|
|
class NGramKneserNey ngram(StdMutableFst *countfst);
|
|
class NGramUnsmoothed ngram(StdMutableFst *countfst);
|
|
class NGramWittenBell ngram(StdMutableFst *countfst);
|
|
Examples
Caveats
The presmoothed method normalizes at each state based on the n-gram count of the history, which is only appropriate under specialized circumstances, such as when the counts have been derived from strings with backoff transitions indicated.
References
--
MichaelRiley - 09 Dec 2011