web-dev-qa-db-fra.com

Ressource 'corpus / wordnet' introuvable sur Heroku

J'essaie de faire fonctionner NLTK et wordnet sur Heroku. jai deja fait

heroku run python
nltk.download()
  wordnet
pip install -r requirements.txt

Mais je reçois cette erreur:

Resource 'corpora/wordnet' not found.  Please use the NLTK
  Downloader to obtain the resource:  >>> nltk.download()
  Searched in:
    - '/app/nltk_data'
    - '/usr/share/nltk_data'
    - '/usr/local/share/nltk_data'
    - '/usr/lib/nltk_data'
    - '/usr/local/lib/nltk_data'

Pourtant, j'ai regardé dans/app/nltk_data et il est là, donc je ne suis pas sûr de ce qui se passe.

22
user1881006

Je viens d'avoir ce même problème. Ce qui a fini par fonctionner pour moi est de créer un répertoire 'nltk_data' dans le dossier de l'application elle-même, de télécharger le corpus dans ce répertoire et d'ajouter une ligne à mon code qui permet au nltk de regarder dans ce répertoire. Vous pouvez tout faire localement, puis pousser les modifications vers Heroku.

Donc, en supposant que mon python se trouve dans un répertoire appelé "myapp /"

Étape 1: créer le répertoire

cd myapp/
mkdir nltk_data

Étape 2: télécharger le corpus dans un nouveau répertoire

python -m nltk.downloader

Cela fera apparaître le téléchargeur nltk. Réglez votre répertoire de téléchargement sur whatever_the_absolute_path_to_myapp_is/nltk_data/. Si vous utilisez le téléchargeur GUI, le répertoire de téléchargement est défini via un champ de texte en bas de l'interface utilisateur. Si vous utilisez la ligne de commande 1, vous la définissez dans le menu de configuration.

Une fois que le téléchargeur sait pointer vers votre nouveau répertoire nltk_data, Téléchargez votre corpus.

Ou en une seule étape depuis Python:

nltk.download("wordnet", "whatever_the_absolute_path_to_myapp_is/nltk_data/")

Étape 3: laissez nltk savoir où chercher

ntlk recherche des données, des ressources, etc. aux emplacements spécifiés dans la variable nltk.data.path. Tout ce que vous devez faire est d'ajouter nltk.data.path.append('./nltk_data/') au fichier python utilisant réellement nltk, et il recherchera des corpus, des tokenizers, etc.) en plus des chemins par défaut .

Étape 4: Envoyez-le à Herok

git add nltk_data/
git commit -m 'super useful commit message'
git Push heroku master

Cela devrait fonctionner! Ça l'a fait pour moi de toute façon. Une chose à noter est que le chemin du fichier python exécutant des trucs nltk vers le répertoire nltk_data peut être différent selon la façon dont vous avez structuré votre application, alors tenez-en compte lorsque vous faites nltk.data.path.append('path_to_nltk_data')

55
follyroof

Mettre à jour

Comme Kenneth Reitz l'a souligné , une solution beaucoup plus simple a été ajoutée au pack de construction heroku-python. Ajouter un nltk.txt fichier dans votre répertoire racine et listez vos corpus à l'intérieur. Voir https://devcenter.heroku.com/articles/python-nltk pour plus de détails.


Réponse originale

Voici une solution plus propre qui vous permet d'installer les données NLTK directement sur Heroku sans les ajouter à votre dépôt git.

J'ai utilisé des étapes similaires pour installer Textblob sur Heroku, qui utilise NLTK comme dépendance. J'ai apporté quelques ajustements mineurs à mon code d'origine aux étapes 3 et 4 qui devraient fonctionner pour une installation NLTK uniquement.

Le pack de compilation Heroku par défaut comprend un post_compile step qui s'exécute une fois toutes les étapes de génération par défaut terminées:

# post_compile
#!/usr/bin/env bash

if [ -f bin/post_compile ]; then
    echo "-----> Running post-compile hook"
    chmod +x bin/post_compile
    sub-env bin/post_compile
fi

Comme vous pouvez le voir, il recherche dans votre répertoire de projet votre propre post_compile fichier dans le répertoire bin, et il l'exécute s'il existe. Vous pouvez utiliser ce hook pour installer les données nltk.

  1. Créez le répertoire bin à la racine de votre projet local.

  2. Ajouter votre propre post_compile fichier dans le répertoire bin.

    # bin/post_compile
    #!/usr/bin/env bash
    
    if [ -f bin/install_nltk_data ]; then
        echo "-----> Running install_nltk_data"
        chmod +x bin/install_nltk_data
        bin/install_nltk_data
    fi
    
    echo "-----> Post-compile done"
    
  3. Ajouter votre propre install_nltk_data fichier dans le répertoire bin.

    # bin/install_nltk_data
    #!/usr/bin/env bash
    
    source $BIN_DIR/utils
    
    echo "-----> Starting nltk data installation"
    
    # Assumes NLTK_DATA environment variable is already set
    # $ heroku config:set NLTK_DATA='/app/nltk_data'
    
    # Install the nltk data
    # NOTE: The following command installs the wordnet corpora, 
    # so you may want to change for your specific needs.  
    # See http://www.nltk.org/data.html
    python -m nltk.downloader wordnet
    
    # If using Textblob, use this instead:
    # python -m textblob.download_corpora lite
    
    # Open the NLTK_DATA directory
    cd ${NLTK_DATA}
    
    # Delete all of the Zip files
    find . -name "*.Zip" -type f -delete
    
    echo "-----> Finished nltk data installation"
    
  4. Ajoutez nltk à votre requirements.txt fichier (Ou textblob si vous utilisez Textblob).

  5. Validez toutes ces modifications dans votre référentiel.
  6. Définissez la variable d'environnement NLTK_DATA sur votre application Heroku.

    $ heroku config:set NLTK_DATA='/app/nltk_data'
    
  7. Déployez sur Heroku. Vous verrez le post_compile déclencheur d'étape à la fin du déploiement, suivi du téléchargement nltk.

J'espère que vous avez trouvé cela utile! Prendre plaisir!

4
Michael Godshall

Pour les utilisateurs de Mac OS uniquement.

python -m nltk.downloader -d /usr/share/nltk_data wordnet

les données de corpus ne peuvent pas être téléchargées directement dans le dossier /usr/share/nltk_data. rapports d'erreur "pas d'autorisation", deux solutions:

  1. Ajoutez des modifications d'autorisation supplémentaires au système Mac, les détails se réfèrent à Opération non autorisée sur root El capitan (rootless désactivé) . Cependant, je ne veux pas changer le paramètre par défaut de Mac uniquement pour ce corpus. et je vais pour la deuxième solution.

    • Téléchargez les corpus dans n'importe quel répertoire auquel vous avez accès. `python -m nltk.downloader -d some_user_accessable_directory wordnet '. Notez que vous ne téléchargez ici que les corpus requis, par exemple wordnet, reuters au lieu de l'ensemble des corpus de nltk.
    • Ajoutez le chemin au chemin nltk. Dans le fichier py, ajoutez les lignes suivantes:

      import nltk nltk.data.path.append('nltk_data')

4
HappyCoding

J'obtenais ce problème. Pour ceux qui ne travaillent pas dans un environnement virtuel, devront télécharger dans le répertoire suivant dans ubuntu:

/usr/share/nltk_data/corpora/wordnet

Au lieu de wordnet, il pourrait être marron ou autre. Vous pouvez exécuter directement cette commande dans votre terminal si vous souhaitez télécharger le corpus.

$ Sudo python -m nltk.downloader -d /usr/share/nltk_data wordnet

Encore une fois au lieu de wordnet, il pourrait être marron.

2
Gaurav Anand

Celui-ci fonctionne:

Pour les utilisateurs de Mac OS.

python -m nltk.downloader -d /usr/local/share/nltk_data wordnet
2
Joolah

Heroku prend désormais officiellement en charge les données NLTK, intégrées!

https://devcenter.heroku.com/articles/python-nltk

1
Kenneth Reitz

J'ai rencontré exactement le même problème lors du déploiement d'un chatbot sur la plate-forme Heroku. Bien que la réponse de follyroof soit une solution à toute épreuve, mais dans de nombreux cas, la taille du référentiel serait considérablement augmentée.

J'ai donc utilisé le nltk.download ('PACKAGE') dans mon fichier app.py. De cette façon, chaque fois que app.py est exécuté, les dépendances sont automatiquement téléchargées.

0
Scid