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.
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')
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.
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.
Créez le répertoire bin
à la racine de votre projet local.
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"
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"
Ajoutez nltk
à votre requirements.txt
fichier (Ou textblob
si vous utilisez Textblob).
Définissez la variable d'environnement NLTK_DATA sur votre application Heroku.
$ heroku config:set NLTK_DATA='/app/nltk_data'
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!
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:
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.
Ajoutez le chemin au chemin nltk. Dans le fichier py, ajoutez les lignes suivantes:
import nltk nltk.data.path.append('nltk_data')
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.
Celui-ci fonctionne:
Pour les utilisateurs de Mac OS.
python -m nltk.downloader -d /usr/local/share/nltk_data wordnet
Heroku prend désormais officiellement en charge les données NLTK, intégrées!
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.