Ресурс '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, и он там, поэтому я не уверен, что происходит.
6 ответов
у меня была такая же проблема. В конечном итоге для меня работает создание каталога "nltk_data" в самой папке приложения, загрузка корпуса в этот каталог и добавление строки в мой код, которая позволяет nltk знать, чтобы искать в этом каталоге. Вы можете сделать это все локально, а затем перенести изменения на Heroku.
Итак, предположим, что мое приложение python находится в каталоге под названием "myapp/"
Шаг 1: Создайте каталог
cd myapp/
mkdir nltk_data
Шаг 2: Загрузите корпус в новый каталог
python -m nltk.downloader
это всплывающее nltk
загрузчика. Установить Скачать Каталог to whatever_the_absolute_path_to_myapp_is/nltk_data/
. Если вы используете загрузчик GUI, каталог загрузки устанавливается через текстовое поле в нижней части пользовательского интерфейса. Если вы используете командную строку one, вы устанавливаете ее в меню config.
как только загрузчик знает, чтобы указать на ваш недавно созданный 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, до каталога nltk_data может отличаться в зависимости от того, как вы структурировали свое приложение, поэтому просто учитывайте это, когда вы делаете nltk.data.path.append('path_to_nltk_data')
только для пользователей Mac OS.
python -m nltk.downloader -d /usr/share/nltk_data wordnet
данные корпорации не могут быть загружены непосредственно в /usr/share/nltk_data
папка. сообщения об ошибках "нет разрешения", два решения:
добавить дополнительные изменения разрешений в систему Mac, подробности см. операция не разрешена, когда на root El capitan (rootless disabled) . Однако я не хочу менять настройки mac по умолчанию только для этой корпорации. и я принимаю второе решение.
- загрузите корпорацию в любой каталог, к которому у вас есть доступ. - питон-м нлтк.downloader-d some_user_accessable_directory wordnet'. Обратите внимание, что там вы загружаете только необходимые корпорации, например, wordnet, reuters вместо всей корпорации из nltk.
-
добавить путь к пути nltk. В файле py добавьте следующие строки:
import nltk nltk.data.path.append('nltk_data')
обновление
как указал Кеннет Рейц, в 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
как вы можете видеть, он выглядит в вашем каталоге проекта для вашего собственного на , и он запускает его, если он существует. Этот крюк можно использовать для установки данных nltk.
создать
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"
-
Добавить свой собственный до .
# 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'
- развернуть на Heroku. Вы увидите
post_compile
триггер шага в конце развертывания, за которым следует загрузка nltk.
надеюсь, вы нашли это полезным! Наслаждайтесь!
Я получил эту проблему. Для тех, кто не работает в виртуальной среде, необходимо будет загрузить в следующий каталог в ubuntu:
/usr/share/nltk_data/corpora/wordnet
вместо wordnet это может быть коричневый или что-то еще. Вы можете напрямую запустить эту команду в своем терминале, если хотите загрузить корпус.
$ sudo python -m nltk.downloader -d /usr/share/nltk_data wordnet
снова вместо wordnet он может быть коричневым.