我想在一組句子上訓練NgramModel,使用Witten-Bell平滑來估計看不見的ngram,然後使用它獲取由該分佈產生的測試集的對數似然性。我想要做的事情幾乎與文檔中的例子一樣:http://nltk.org/_modules/nltk/model/ngram.html,但用Witten-Bell平滑處理。下面就試圖做什麼,我想要做一些玩具代碼:使用Witten Bell Smoothing在nltk中使用NgramModel訓練和評估bigram/trigram分佈
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時,這種方式正常工作。
作爲第二個問題,我有收集不相交句子的數據。我怎樣才能像使用字符串列表一樣使用句子,或者做一些相同的事情來產生相同的分佈? (也就是說,我當然可以使用一個列表,其中包含所有包含後續句子的虛擬標記的句子,但這不會產生相同的分佈。)一個地方的文檔說明允許列表的字符串列表,但後來我發現一個錯誤報告,其中的文檔據說被編輯,以反映這是不被允許的(當我只是嘗試一串字符串列表,我得到一個錯誤)。
感謝您的答案,每個人都總結。我結束了與SRILM,因爲該代碼實際上是完整的,看起來是正確的... – DJLamar