Я хотел бы обучить NgramModel на одном наборе предложений, используя сглаживание Виттена-Белла для оценки невидимых ngrams, а затем использовать его для получения логарифмической вероятности тестового набора, сгенерированного этим распределением. Я хочу сделать почти то же самое, что и в примере документации, найденном здесь: http://nltk.org/_modules/nltk/model/ngram.html, но вместо этого со сглаживанием Виттена-Белла. Вот какой-то игрушечный код, пытающийся сделать то, что я хочу сделать:
from nltk.probability import WittenBellProbDist
from nltk import NgramModel
est = lambda fdist, bins: WittenBellProbDist(fdist)
fake_train = [str(t) for t in range(3000)]
fake_test = [str(t) for t in range(2900, 3010)]
lm = NgramModel(2, fake_train, estimator = est)
print lm.entropy(fake_test)
К сожалению, когда я пытаюсь запустить это, я получаю следующую ошибку:
Traceback (most recent call last):
File "ngram.py", line 8, in <module>
lm = NgramModel(2, fake_train, estimator = est)
File "/usr/lib/python2.7/dist-packages/nltk/model/ngram.py", line 63, in __init__
self._model = ConditionalProbDist(cfd, estimator, len(cfd))
File "/usr/lib/python2.7/dist-packages/nltk/probability.py", line 2016, in __init__
**factory_kw_args)
File "ngram.py", line 4, in <lambda>
est = lambda fdist, bins: WittenBellProbDist(fdist)
File "/usr/lib/python2.7/dist-packages/nltk/probability.py", line 1210, in __init__
self._P0 = self._T / float(self._Z * (self._N + self._T))
ZeroDivisionError: float division by zero
Что вызывает эту ошибку? Насколько я могу судить, я использую все правильно в соответствии с документацией, и это прекрасно работает, когда я использую Lidstone вместо Witten-Bell.
В качестве второго вопроса у меня есть данные в виде набора непересекающихся предложений. Как я могу использовать предложения как список списков строк или сделать что-то эквивалентное, чтобы получить такое же распределение? (то есть, конечно, я мог бы просто использовать список, в котором есть все предложения с фиктивным токеном, разделяющим последующие предложения, но это не дало бы такого же распределения.) В документации в одном месте говорится, что разрешен список строк, но затем я нашел отчет об ошибке, в котором документация якобы была отредактирована, чтобы отразить, что это не разрешено (и когда я просто пробую список списков строк, я получаю сообщение об ошибке).