Подтвердить что ты не робот

Ресурс "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 и там, поэтому я не уверен, что происходит.

4b9b3361

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

  • Добавьте дополнительные изменения в систему Mac, подробности см. в Операция Не разрешена, если на корневом сервере El capitan (отключено без rootless). Тем не менее, я не хочу менять настройки по умолчанию для Mac только для этого корпуса. и я иду на второе решение.

    • Загрузите теки в любой каталог, к которому у вас есть доступ. `python -m nltk.downloader -d some_user_accessable_directory wordnet '. Отмечено, что вы загружаете только необходимые корпуса, например, wordnet, reuters, а не все корпуса из nltk.
    • Добавить путь к пути nltk. В файле py добавьте следующие строки:

      import nltk nltk.data.path.append('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 он может быть коричневым.

Ответ 6

Это работает:

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

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

Ответ 7

Я столкнулся с точно такой же проблемой при развертывании чат-бота на платформе Heroku. Хотя ответ от follyroof является надежным решением, но во многих случаях размер хранилища будет резко увеличен.

Итак, я использовал nltk.download('PACKAGE') в моем файле app.py. Таким образом, каждый раз, когда запускается app.py, зависимости загружаются автоматически.