private double GetBeta(string[] ngram)
{
string[] shortGram = ngram.GetNGram(0, ngram.Length - 1);
double beta;
if (_betaCache.TryFindValue(shortGram, out beta) && beta != 0)
{
return(beta);
}
double a = 0.0, b = 0.0;
foreach (var item in _referenceSource.GetAllSegments())
{
ngram[ngram.Length - 1] = item; // replace last segment
int frequencyA = _referenceSource.FindOccurrences(ngram);
if (frequencyA > 0)
{
var bNGram = ngram.GetNGram(1, ngram.Length - 1);
int frequencyB = _referenceSource.FindOccurrences(bNGram);
a += GetProbabilityIfPresent(ngram, frequencyA);
b += GetProbabilityIfPresent(bNGram, frequencyB);
}
}
beta = (1.0 - a) / (1.0 - b);
_betaCache.Increment(shortGram, beta);
return(beta);
}