3

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 番目の質問として、ばらばらな文の集まりの形式のデータがあります。文字列のリストのリストのように文を使用するにはどうすればよいですか、または同じ分布を生成する同等のことを行うにはどうすればよいですか? (つまり、もちろん、後続の文を区切るダミー トークンを含むすべての文を含むリストを使用することもできますが、それでは同じ分布が生成されません。) ある場所のドキュメントでは、文字列のリストのリストが許可されていると述べています。しかし、それが許可されていないことを反映するようにドキュメントが編集されたと思われるバグレポートを見つけました(そして、文字列のリストのリストを試してみるとエラーが発生します)。

4

3 に答える 3

0

当分の間、NLTK の NgramModel には近づかないことにします。現在、n>1 の場合にモデルが可能性を大幅に過大評価する原因となる平滑化バグがあります。これは、WittenBellProbDist や LidstoneProbDist を含むすべての推定量に適用されます。このエラーは数年前から発生していると思います。これは、NLTK のこの部分が十分にテストされていないことを示唆しています。

参照: https://github.com/nltk/nltk/issues/367

于 2013-04-09T17:27:58.350 に答える