FreqDist.plot没有使用最常用的单词

时间:2014-09-03 21:11:59

标签: nltk

我正在遵循http://www.nltk.org/book/ch01.html中的代码,特别是第3.2节。

from __future__ import division
import nltk
from nltk.book import *
import dateutil
import pyparsing
import numpy
import six
import matplotlib
fdist1 = FreqDist(text1)
fdist1.plot(50,cumulative=True)

是我正在运行的脚本(未来的导入是其他一些东西的剩余部分)。然而,我得到的情节与书中的情节不符。它有一些不常见的词,如funereal。我在Windows上运行32位python 2.7。我的朋友在他的Mac上运行它运行相同的命令并从书中获取情节。我完全不知道差异可能是什么。谢谢!

1 个答案:

答案 0 :(得分:0)

我最近遇到了同样的问题。

NLTK在python的FreqDist包中的Counter类上构建它collectionsplot()(以及tabulate()函数)提取要使用的样本,如下所示:

samples = list(islice(self, *args))

来源:http://www.nltk.org/_modules/nltk/probability.html

我猜他们这样做是为了能够绘制子序列的绘图,例如第10个和第40个样本之间的范围,但它假设Counter对象(基本上是dict)排序。虽然有时候会出现这种情况,但显然并不总是如此,因为python文档明确指出。 NLTK源中上述行的正确替换将是:

samples = [item for item, _ in self.most_common(*args)]

在最近的NLTK code on GitHub中也可以找到正确的版本。它已在NLTK 3.0.0中修复,因此请确保您没有使用旧版本(如NLTK 3的alpha或beta版本)。

如果您不想更改NLTK的来源并且无法更新它,您可以自己轻松调整plot()功能:

def plot_freqdist(fd, num = 0, cumulative = False, title = None):
    import pylab
    # Set up parameters
    if num <= 0:
        num = fd.B
    # Get samples and frequencies
    samples, freq, accu = [], [], 0
    for s, f in fd.most_common(num):
        accu = accu + f if cumulative else f
        samples.append(s)
        freq.append(accu)
    # Create plot
    pylab.grid(True, color = 'silver')
    if title:
        pylab.title(title)
    pylab.plot(freq, linewidth = 2)
    pylab.xticks(range(len(samples)), samples, rotation = 90)
    pylab.xlabel('Samples')
    pylab.ylabel('Cumulative Counts' if cumulative else 'Counts')
    pylab.show()