Ресурс '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 папка. сообщения об ошибках "нет разрешения", два решения:

  1. добавить дополнительные изменения разрешений в систему 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.

  1. создать bin каталог в корне вашего локального проекта.

  2. Добавить свой собственный до .

    # 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. Добавить свой собственный до .

    # 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. добавить nltk на requirements.txt файл (или textblob если вы используете Textblob).

  5. зафиксируйте все эти изменения в своем РЕПО.
  6. установите переменную среды NLTK_DATA в приложении heroku.

    $ heroku config:set NLTK_DATA='/app/nltk_data'
    
  7. развернуть на Heroku. Вы увидите post_compile триггер шага в конце развертывания, за которым следует загрузка nltk.

надеюсь, вы нашли это полезным! Наслаждайтесь!


Я получил эту проблему. Для тех, кто не работает в виртуальной среде, необходимо будет загрузить в следующий каталог в ubuntu:

/usr/share/nltk_data/corpora/wordnet

вместо wordnet это может быть коричневый или что-то еще. Вы можете напрямую запустить эту команду в своем терминале, если хотите загрузить корпус.

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

снова вместо wordnet он может быть коричневым.


Heroku теперь официально поддерживает данные NLTK, встроенные!

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


работает:

для пользователей Mac OS.

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