Nltk: text.generate() não existe, mas ainda é referenciado

Criado em 20 ago. 2014  ·  27Comentários  ·  Fonte: nltk/nltk

Tenho tentado acompanhar o livro Natural Language Processing, mas logo no primeiro capítulo estou me deparando com alguns problemas. Depois de import fazer tudo de nltk.book , meu primeiro pensamento foi tentar text3.generate() como foi demonstrado em um dos exemplos. Claro, eu consegui um adorável AttributeError porque a classe Text aparentemente não tem esse método no NLTK que eu instalei.
Além disso, mesmo executando nltk.text.demo() tenta fazer o texto gerado - e retorna o mesmo erro.
Claro, eu não consegui encontrar nenhuma documentação para o método generate() , então estou assumindo que ele foi removido; se for esse o caso, você deve remover as referências a ele de nltk.text.demo() e do livro.

Estou usando o Python 2.7.8 com NLTK 3.0.0b1 (que era a versão disponível através do pacote de instalação do Windows do PyPI no momento da redação deste artigo). O exemplo text3.generate() está nas versões antigas e atuais do livro.

language-model

Comentários muito úteis

Isso ainda é referido no Capítulo um do livro: http://www.nltk.org/book/ch01.html

Não é grande coisa, mas provavelmente sou típico em gastar alguns minutos pesquisando isso como um problema. Esses poucos minutos, no entanto, muitas pessoas estão trabalhando no livro... :)

Todos 27 comentários

Desculpe pela confusão. Houve problemas com a modelagem de linguagem do NLTK
class e por isso a removemos até que os problemas sejam resolvidos. Isso quebrou o
funcionalidade de geração de texto. Atualizei a versão online do livro
com uma nota sobre isso, e atualizou o texto de demonstração (a ser incluído no
versão 3.0.0b2 em breve).

-Steven Bird

Em 20 de agosto de 2014 17:12, Kasran [email protected] escreveu:

Eu tenho tentado acompanhar o Processamento de Linguagem Natural
livro, mas logo no primeiro capítulo estou me deparando com algumas questões. Depois de
importando tudo do nltk.book, meu primeiro pensamento foi tentar
text3.generate() como foi demonstrado em um dos exemplos. Claro que eu
tem um adorável AttributeError porque a classe Text aparentemente não
tem esse método no NLTK que instalei.
Além disso, mesmo executando nltk.text.demo() tenta fazer o texto gerado -
e retorna o mesmo erro.
Claro, não consegui encontrar nenhuma documentação para o método generate(),
então estou assumindo que foi removido; se for esse o caso, você deve remover
referências a ele de nltk.text.demo() e do livro-texto.

Estou usando Python 2.7.8 com NLTK 3.0.0b1. O exemplo text3.generate() é
tanto na versão antiga quanto na atual do livro.

Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/nltk/nltk/issues/736.

Tudo bem! Totalmente compreensível. Acho que vou ter que escrever meus próprios chatterbots com correntes de Markov aplicadas, da maneira antiga e grosseira, até que seja consertado.

Obrigado por sua sua resposta rápida.

Também me deparei com esse mesmo problema que me intrigou um pouco. Obrigado por este tópico que a pesquisa do Google me levou.

Hmmm. isso ajuda (https://github.com/alvations/nltk/blob/develop/nltk/translate/decoder.py#L33)? O modelo de linguagem parece funcionar bem ao decodificar. Em breve, enviarei um código atualizado e devidamente documentado para a biblioteca translate .

Desculpe, eu estava fora de hackathon, workshops e conferências consecutivas. Vou tentar empurrá-lo até o final desta semana, eu espero.

Ah, mas meu modelo carrega um modelo pré-caculado, não construindo o modelo do zero. Alguém está construindo um módulo de modelo de linguagem?

Vejo dois problemas com o código atual (além do fato de não funcionar), em termos de experiência do usuário:

  1. No livro, o método não recebe nenhum parâmetro (pelo menos quando aparece pela primeira vez no livro), mas a assinatura atual requer um parâmetro words . Então, quando você segue o livro, o que você obtém é o seguinte:

    >>> text1.generate()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: generate() missing 1 required positional argument: 'words'
    

    Isso não é muito amigável. Sugiro dar às palavras um valor padrão na assinatura (por exemplo words=None ) para evitar esse problema.

  2. Usando o console Python regular seguindo as instruções do livro, não vejo o DeprecationWarning que o código registra. Isto é o que eu fiz desde o início:

    [adrian<strong i="17">@chakra</strong> temporal]$ mkdir nltk
    [adrian<strong i="18">@chakra</strong> temporal]$ cd nltk/
    [adrian<strong i="19">@chakra</strong> nltk]$ python3 -m venv venv
    [adrian<strong i="20">@chakra</strong> nltk]$ . venv/bin/activate
    (venv) [adrian<strong i="21">@chakra</strong> nltk]$ pip install nltk
    Collecting nltk
    Using cached nltk-3.2.2.tar.gz
    Collecting six (from nltk)
    Using cached six-1.10.0-py2.py3-none-any.whl
    Installing collected packages: six, nltk
    Running setup.py install for nltk ... done
    Successfully installed nltk-3.2.2 six-1.10.0
    You are using pip version 8.1.1, however version 9.0.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    (venv) [adrian<strong i="22">@chakra</strong> nltk]$ python
    Python 3.5.2 (default, Jan 18 2017, 23:05:33) 
    [GCC 5.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import nltk
    >>> # Download the book resources, which requires GUI interaction.
    ... 
    >>> nltk.download()
    showing info https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml
    True
    >>> from nltk.book import *
    *** Introductory Examples for the NLTK Book ***
    Loading text1, ..., text9 and sent1, ..., sent9
    Type the name of the text or sentence to view it.
    Type: 'texts()' or 'sents()' to list the materials.
    text1: Moby Dick by Herman Melville 1851
    text2: Sense and Sensibility by Jane Austen 1811
    text3: The Book of Genesis
    text4: Inaugural Address Corpus
    text5: Chat Corpus
    text6: Monty Python and the Holy Grail
    text7: Wall Street Journal
    text8: Personals Corpus
    text9: The Man Who Was Thursday by G . K . Chesterton 1908
    >>> text1.generate(words=None)
    >>>
    

    Como o generate() não está simplesmente obsoleto como em “ele será removido”, mas também como em “não funciona mais”, sugiro aumentar um NotImplementedError em vez de registrar um aviso. Fazer isso faria o código existente falhar (que é o que eu, como desenvolvedor, gostaria que fizesse em vez de aparentemente ter sucesso sem realmente fazer o que costumava fazer) e aparecer no console para leitores de livros.

Se você concorda com essas alterações, mas não tem tempo ou motivação para implementá-las, basta me informar e enviarei uma solicitação de mesclagem.

Também gostaria de saber se poderíamos remover as referências a generate() do livro. Pelo menos no capítulo 1, eles não parecem ser exigidos por outras seções do capítulo.

Na minha opinião, concordo totalmente com vocês para remover (gerar () referências).

Isso ainda é referido no Capítulo um do livro: http://www.nltk.org/book/ch01.html

Não é grande coisa, mas provavelmente sou típico em gastar alguns minutos pesquisando isso como um problema. Esses poucos minutos, no entanto, muitas pessoas estão trabalhando no livro... :)

Bump, as referências generate() ainda estão lá.

Ainda está lá agora.

Ainda está lá agora.

Ainda está lá agora (na versão Safari Online do livro NLTK)

Oh, eu vejo que houve uma nota inserida após o exemplo, que generate() foi removido do NLTK 3 -- desculpe

ainda esta dando erro

O método generate deve estar presente a partir do NLTK 3.4. Confira o pacote nltk.lm !

Oi, quais são as possíveis alternativas atuais para gerar texto automaticamente, em substituição a esta função? Estou lendo o texto gerado do capítulo 1 do livro e também gostaria de produzir frases maravilhosas como "No princípio de seu irmão é um homem cabeludo" ou esta pergunta fundamental: "assim será o teu salário?" .

Desculpe @eric-burel, não entendi muito bem o seu comentário. Vou tentar formular com minhas palavras e você me diz se está correto, ok?

Você quer alguma outra maneira de gerar texto além de treinar um modelo de linguagem e usar seu método generate ?

Oi, desculpe eu não estava claro, eu estava apenas dando boas risadas lendo o livro de PNL com Python ao chegar à parte de geração de texto, pois as frases são muito realistas e ainda são estranhas, e acho esse assunto interessante em geral.
Eu só quero saber qual é a alternativa recomendada atual para gerar texto automaticamente, em substituição a generate() . Devo atualizar smth ou carregar outra biblioteca?

Bem, começando com o NLTK versão 3.4, você realmente tem acesso a generate() . Dê uma olhada na documentação do módulo lm :

>>> from nltk import lm
>>> help(lm)

Também poderia construir seu próprio gerar, se você quiser: http://www.cyber-omelette.com/2017/01/markov.html

Estou tentando seguir os exemplos do livro O'Reilly Natural Language Processing with Python, que é como cheguei a essa discussão. Acho que as pessoas estão falando sobre a função nltk.text.generate e não sobre a função nltk.parse.generate, que parece estar causando alguma confusão.

Eu digito text1.generate(), devo obter uma lista de frases no estilo de Moby Dick. Em vez disso, tudo o que recebo é a mensagem de erro TypeError: generate() missing 1 required positional argument: 'words' .

Isso parece vir de site-packages/nltk/text.py, que é definido como def generate(self, words) e seu único propósito parece ser imprimir um aviso de que a função do gerador não está mais disponível, o que não acontece mesmo se você passar um valor para o argumento words.

Estou usando o nltk versão 3.5.2.

Isso pode ser fechado agora desde generate was added .

Obrigado @Copper-Head

Gerar foi removido novamente? Estou seguindo o livro e recebi o erro generate() missing 1 required positional argument: 'words' . Alguma ajuda, por favor?

Ainda tendo problemas com esta função :/

@Tserewara @AlbertSawZ qual versão do NLTK você está usando? Você poderia postar um exemplo mínimo que podemos tentar executar para reproduzir esse problema?

É um pouco difícil ajudá-lo com base nas informações que você enviou até agora :(

Também estou seguindo o livro, mas o problema ainda persiste
Qualquer maneira alternativa para esta função de geração

TypeError                                 Traceback (most recent call last)
<ipython-input-36-463eb7c367ab> in <module>()
----> 1 text3.generate()

TypeError: generate() missing 1 required positional argument: 'words'
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

talbaumel picture talbaumel  ·  4Comentários

stevenbird picture stevenbird  ·  4Comentários

vezeli picture vezeli  ·  3Comentários

alvations picture alvations  ·  4Comentários

alvations picture alvations  ·  4Comentários