Witten-Bell 平滑化を使用して目に見えない ngram を推定し、それを使用してその分布によって生成されたテスト セットの対数尤度を取得し、1 セットの文で NgramModel をトレーニングしたいと思います。ここにあるドキュメントの例とほぼ同じことをしたい: http://nltk.org/_modules/nltk/model/ngram.html、代わりに Witten-Bell 平滑化を使用します。私がやりたいことについてやろうとしているおもちゃのコードは次のとおりです。
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
このエラーの原因は何ですか? 私が知る限り、ドキュメントに従ってすべてを正しく使用しています。Witten-Bell の代わりに Lidstone を使用すると、これは正常に機能します。
2 番目の質問として、ばらばらな文の集まりの形式のデータがあります。文字列のリストのリストのように文を使用するにはどうすればよいですか、または同じ分布を生成する同等のことを行うにはどうすればよいですか? (つまり、もちろん、後続の文を区切るダミー トークンを含むすべての文を含むリストを使用することもできますが、それでは同じ分布が生成されません。) ある場所のドキュメントでは、文字列のリストのリストが許可されていると述べています。しかし、それが許可されていないことを反映するようにドキュメントが編集されたと思われるバグレポートを見つけました(そして、文字列のリストのリストを試してみるとエラーが発生します)。