nltk.trigams没有count属性

时间:2016-01-04 09:34:36

标签: python count nlp nltk n-gram

我在Python-3.x上运行virtualenv,尝试使用nltk处理文字。

我看到了这篇帖子What are ngram counts...,最受欢迎的答案有一些使用count()方法的代码。但是当我把它复制/粘贴到我的手中时:

import nltk
from nltk import bigrams
from nltk import trigrams

text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam tempus vitae. Morbi justo mauris,
congue sit amet imperdiet ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam"""

tokens = nltk.word_tokenize(text)
tokens = [token.lower() for token in tokens if len(token) > 1]
bi_tokens = bigrams(tokens)
tri_tokens = trigrams(tokens)

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))]

我收到此消息:

AttributeError: 'generator' object has no attribute 'count'

我在monkeypatch上看到了this other post的计数方法,但感觉就像是不相关的。知道我可能做错了吗?

3 个答案:

答案 0 :(得分:1)

这是因为nltk.ngrams returns an iterable generator,请参阅https://www.python.org/dev/peps/pep-0255/What does the "yield" keyword do in Python?

您应该使用collections.Counter

>>> from nltk import ngrams
>>> from collections import Counter
>>> s = "This is a foo bar sentence".split()
>>> Counter(ngrams(s, 3))
Counter({('This', 'is', 'a'): 1, ('a', 'foo', 'bar'): 1, ('is', 'a', 'foo'): 1, ('foo', 'bar', 'sentence'): 1})

答案 1 :(得分:0)

您遇到此AttributeError: 'generator' object has no attribute 'count'问题,因为生成器在python中首次使用后被销毁。

tri_tokens is Generator。它在您的代码中使用两次

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))]

在上面的代码行中, tri_token 使用两次。因此,当您希望获得计数项目时,生成器已经已销毁(sorted(set(tri_tokens))使用后。那'为什么会出现 AttributeError 问题。

所以,最佳方式将生成器转换为列表

tri_tokens = list(tri_tokens)

尝试以下代码:

import nltk
from nltk import bigrams
from nltk import trigrams

text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam tempus vitae. Morbi justo mauris,
congue sit amet imperdiet ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam"""

tokens = nltk.word_tokenize(text)
tokens = [token.lower() for token in tokens if len(token) > 1]
bi_tokens = bigrams(tokens)
tri_tokens = trigrams(tokens)

tri_tokens = list(tri_tokens)

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))]

答案 2 :(得分:0)

其他答案对我不起作用,我最终使用:

bi_tokens = list(bigrams(tokens))
tri_tokens = list(trigrams(tokens))

转换为列表后,可以count()