Ресурс "corpora/wordnet" не найден на Heroku
Я пытаюсь заставить NLTK и wordnet работать на Heroku. Я уже сделал
heroku run python
nltk.download()
wordnet
pip install -r requirements.txt
Но я получаю эту ошибку:
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'
Тем не менее, я смотрел в /app/nltk _data и там, поэтому я не уверен, что происходит.
Ответы
Ответ 1
У меня была такая же проблема. Что для меня работало, так это создание каталога "nltk_data" в самой папке приложения, загрузка его в этот каталог и добавление строки к моему коду, который позволяет nltk знать, что искать в этом каталоге. Вы можете сделать это все локально, а затем нажать на изменения в Heroku.
Итак, предположим, что мое приложение python находится в каталоге под названием "myapp/"
Шаг 1. Создайте каталог
cd myapp/
mkdir nltk_data
Шаг 2: Загрузите Corpus в новый каталог
python -m nltk.downloader
Появится сообщение nltk
downloader. Установите каталог загрузки в whatever_the_absolute_path_to_myapp_is/nltk_data/
. Если вы используете загрузчик графического интерфейса, каталог загрузки устанавливается через текстовое поле в нижней части пользовательского интерфейса. Если вы используете командную строку 1, вы устанавливаете ее в меню конфигурации.
Как только загрузчик знает, чтобы указать на ваш вновь созданный каталог nltk_data
, загрузите его.
Или в один шаг от кода Python:
nltk.download("wordnet", "whatever_the_absolute_path_to_myapp_is/nltk_data/")
Шаг 3: Пусть nltk Знайте, где искать
ntlk
ищет данные, ресурсы и т.д. в местах, указанных в переменной nltk.data.path
. Все, что вам нужно сделать, это добавить nltk.data.path.append('./nltk_data/')
в файл python, на самом деле используя nltk, и он будет искать корпуса, токенизаторы и т.д. В дополнение к путям по умолчанию.
Шаг 4: Отправьте его в Heroku
git add nltk_data/
git commit -m 'super useful commit message'
git push heroku master
Это должно сработать! Это все равно. Стоит отметить, что путь из файла python, выполняющего nltk stuff в каталог nltk_data, может быть различным в зависимости от того, как вы структурировали ваше приложение, поэтому просто учтите это, когда вы делаете nltk.data.path.append('path_to_nltk_data')
Ответ 2
Только для пользователей Mac OS.
python -m nltk.downloader -d /usr/share/nltk_data wordnet
данные о корпусе не могут быть загружены непосредственно в папку /usr/share/nltk_data
. сообщения об ошибках "без разрешения", два решения:
Ответ 3
Update
Как отметил Кеннет Рейтц, в файл heroku-python-buildpack добавлено гораздо более простое решение. Добавьте файл nltk.txt
в свой корневой каталог и перечислите свои тела внутри. Подробнее см. https://devcenter.heroku.com/articles/python-nltk.
Оригинальный ответ
Здесь более чистое решение, которое позволяет вам устанавливать данные NLTK непосредственно на Heroku, не добавляя его в репозиторий git.
Я использовал аналогичные шаги для установки Textblob на Heroku, который использует NLTK как зависимость. Я сделал некоторые незначительные изменения в моем исходном коде на шагах 3 и 4, которые должны работать только для установки NLTK.
По умолчанию пакет heroku buildpack включает post_compile
шаг, который запускается после завершения всех шагов по умолчанию:
# 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
Как вы можете видеть, он выглядит в вашем каталоге проекта для вашего собственного файла post_compile
в каталоге bin
, и он запускает его, если он существует. Вы можете использовать этот крючок для установки данных nltk.
-
Создайте каталог bin
в корне вашего локального проекта.
-
Добавьте свой собственный post_compile
файл в каталог 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"
-
Добавьте собственный install_nltk_data
файл в каталог 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"
-
Добавьте nltk
в ваш requirements.txt
файл (или textblob
, если вы используете Textblob).
- Зафиксируйте все эти изменения в своем репо.
-
Установите переменную среды NLTK_DATA в приложении heroku.
$ heroku config:set NLTK_DATA='/app/nltk_data'
- Развернитесь до Героку. В конце развертывания вы увидите триггер
post_compile
, за которым следует загрузка nltk.
Надеюсь, вы нашли это полезным! Наслаждайтесь!
Ответ 4
Я получал эту проблему. Для тех, кто не работает в виртуальной среде, вам нужно будет загрузить в следующий каталог в ubuntu:
/usr/share/nltk_data/corpora/wordnet
Вместо wordnet это может быть коричневый или любой другой.
Вы можете напрямую запустить эту команду в своем терминале, если хотите загрузить корпус.
$ sudo python -m nltk.downloader -d /usr/share/nltk_data wordnet
Снова вместо wordnet он может быть коричневым.
Ответ 5
Heroku теперь официально поддерживает данные NLTK, встроенные!
https://devcenter.heroku.com/articles/python-nltk
Ответ 6
Это работает:
Для пользователей Mac OS.
python -m nltk.downloader -d /usr/local/share/nltk_data wordnet
Ответ 7
Я столкнулся с точно такой же проблемой при развертывании чат-бота на платформе Heroku. Хотя ответ от follyroof является надежным решением, но во многих случаях размер хранилища будет резко увеличен.
Итак, я использовал nltk.download('PACKAGE') в моем файле app.py. Таким образом, каждый раз, когда запускается app.py, зависимости загружаются автоматически.