擅长:python、mysql、java
<p>它显然是<a href="http://code.google.com/p/nltk/issues/detail?id=538" rel="nofollow">almost 3 years</a>的已知问题。<code>ZeroDivisionError</code>的原因是由于<code>__init__</code>中的以下行</p>
<pre><code>if bins == None:
bins = freqdist.B()
self._freqdist = freqdist
self._T = self._freqdist.B()
self._Z = bins - self._freqdist.B()
</code></pre>
<p>每当没有指定<code>bins</code>参数时,它默认为<code>None</code>,因此<code>self._Z</code>实际上只是<code>freqdist.B() - freqdist.B()</code>,并且</p>
^{pr2}$
<p>减少到</p>
<pre><code>self._P0 = freqdist.B() / 0.0
</code></pre>
<p>另外,如果将<code>bins</code>指定为大于<code>freqdist.B()</code>的任何值,则在执行这行代码时</p>
<pre><code>print lm.entropy(fake_test)
</code></pre>
<p>您将收到<code>NotImplementedError</code>,因为在<code>WittenBellProbDist</code>类中</p>
<pre><code>def discount(self):
raise NotImplementedError()
</code></pre>
<p>显然,<code>discount</code>方法也在<code>NgramModel</code>类的<code>prob</code>和{<cd13>}中使用,因此您也无法调用它们。在</p>
<p>在不改变<code>NLTK</code>的情况下,解决这些问题的一种方法是从<code>WittenBellProbDist</code>继承并重写相关的方法。在</p>