【问题标题】:nltk.trigams has no count attributenltk.trigams 没有计数属性
【发布时间】:2018-10-10 15:32:39
【问题描述】:

我在virtualenv 上运行Python-3.x,尝试使用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 用于计数方法,但感觉这与某种方式无关。知道我可能做错了什么吗?

【问题讨论】:

    标签: python count nlp nltk n-gram


    【解决方案1】:

    因为nltk.ngramsreturns 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})
    

    【讨论】:

      【解决方案2】:

      您正面临AttributeError: 'generator' object has no attribute 'count' 问题,因为 Generatorfirst use 在 python 中后被销毁。

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

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

      在上面的代码行中,tri_token 使用了两次。因此,当您想要获得 count 个项目时,您的 generator(sorted(set(tri_tokens)) 使用之后已经 destroyed。这就是您遇到 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))]
      

      【讨论】:

        【解决方案3】:

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

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

        转换为列表后可以count()

        【讨论】:

          猜你喜欢
          • 2021-01-28
          • 2021-09-17
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 1970-01-01
          • 2019-10-25
          • 2018-09-27
          • 1970-01-01
          相关资源
          最近更新 更多