将n grams python生成器输出保存为cvs文件



我正在从python中的文本数据中找到n个语法。

我已经使用了NLTK包来获得它。这是代码

from nltk.util import ngrams
bigrams=ngrams(cleaned_docs,2)
trigrams=ngrams(cleaned_docs,3)
quadgrams=ngrams(cleaned_docs,4)
pentagrams=ngrams(cleaned_docs,5)

这里cleaned_docs是一个文本中标记化单词的列表。这里,每个返回的类型都是一个生成器,其值为n个元组。对于bi-gram来说,这就是它的样子:

for x in bigrams:
    print x
("mom's", 'hi')
('this', 'in')
('in', 'house')

我想得到上面定义的每个n克的频率分布,并按频率降序将它们保存在cvs文件中。csv将有两列,一列是n gram名称,另一列是文本中对应的计数。

此外,我还想绘制n克的频率,并将该图保存为.jpeg文件。这是我用来绘制unigram或单词频率的代码。但不确定这个nltk-fd对象是如何用于将其保存为jpeg的。

fd = nltk.FreqDist(cleaned_docs)
fig = plt.figure(figsize=(20,15))
plt.ylabel("frequency",fontsize=25)
plt.xlabel("Words",fontsize=25)
plt.rc('xtick', labelsize=15) 
plt.rc('ytick', labelsize=15)
plt.title("Word Frequency Distribution",fontsize=25)
fd.plot(80,cumulative=False) 

请注意,我正在寻找一个更快的解决方案,因为我的文本是巨大的。我有550K个观察结果,每个观察结果平均有500多个字符的文本数据。因此,bigram和n克的数量也将是巨大的。

nltk.FreqDist类是python的collections.Counter的一个子类,所以它没有什么特别之处。它会计算您传递给它的迭代中每个元素的出现次数。

n2_freq = ntlk.FreqDist(bigrams)

要按降序获取元素,可以使用most_common方法。

for bigram, freq in n2_freq.most_common():
    # Print them...

要保存该图,您需要使用plt.figure返回的fig对象,它应该有一个savefig方法。

fig = plt.figure(figsize=(20,15))
[...]
n2_freq.plot()
fig.savefig('bigram_freq_dist.jpg')

正如您在plot函数的源代码中看到的那样,它不返回任何内容。

最新更新