Заменить строку:
print(kneser_ney.prob('you go to'))
на:
print(kneser_ney.prob('you go to'.split()))
Тогда все работает нормально. Я получаю значение 0,05217391304347826 при использовании в качестве учебного файла текста из романа «Моби Дик», загруженного из Project Gutenberg
С этой модификацией ваш код становится аналогом полному крылу:
with open('./txts/mobyDick.txt') as ff:
text = ff.read()
from nltk import word_tokenize,trigrams
from nltk import FreqDist, KneserNeyProbDist
word_tok = word_tokenize(text)
ngrams = trigrams(word_tok)
freq_dist = FreqDist(ngrams)
kneser_ney = KneserNeyProbDist(freq_dist)
print(kneser_ney.prob('you go to'.split()))
Также все здесь делается на уровне слов, а не на уровне символов:
ngrams = trigrams(word_tok)
for _ in range(0,10):
print(next(ngrams))
#('\ufeff', 'The', 'Project')
#('The', 'Project', 'Gutenberg')
#('Project', 'Gutenberg', 'EBook')
#('Gutenberg', 'EBook', 'of')
#('EBook', 'of', 'Moby')
#('of', 'Moby', 'Dick')
#('Moby', 'Dick', ';')
#('Dick', ';', 'or')
#(';', 'or', 'The')
#('or', 'The', 'Whale')
Распределение частот также на уровне слов:
freq_dist.freq(tuple('on the ocean'.split()))
#7.710783916846906e-06
freq_dist.freq(tuple('new Intel CPU'.split()))
#0.0