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


person user1881006    schedule 20.12.2012    source источник
comment
devcenter.heroku.com/articles/python-nltk   -  person Kenneth Reitz    schedule 17.03.2017


Ответы (10)


У меня была такая же проблема. В итоге у меня сработало создание каталога «nltk_data» в самой папке приложения, загрузка корпуса в этот каталог и добавление строки в мой код, которая позволяет nltk искать в этом каталоге. Вы можете сделать все это локально, а затем отправить изменения в Heroku.

Итак, предположим, что мое приложение Python находится в каталоге с именем «myapp/»

Шаг 1. Создайте каталог

cd myapp/
mkdir nltk_data

Шаг 2. Загрузите корпус в новый каталог

python -m nltk.downloader

Откроется загрузчик nltk. Установите для Каталог загрузки значение whatever_the_absolute_path_to_myapp_is/nltk_data/. Если вы используете загрузчик с графическим интерфейсом, каталог загрузки задается в текстовом поле в нижней части пользовательского интерфейса. Если вы используете командную строку, вы устанавливаете ее в меню конфигурации.

Как только загрузчик узнает, что он указывает на ваш только что созданный каталог 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')

person follyroof    schedule 14.02.2013
comment
Если вы хотите установить данные NLTK на Heroku, не добавляя их в репозиторий git, см. мое решение ниже: stackoverflow.com/a/37558445/ 387337 - person Michael Godshall; 01.06.2016
comment
Ключом для меня было добавить nltk.data.path.append('./nltk_data/'). Спасибо! - person ; 26.04.2017

Обновлять

Как указал Кеннет Рейц, в пакет сборки heroku-python-buildpack добавлено гораздо более простое решение. Добавьте файл nltk.txt в свой корневой каталог и перечислите внутри свои корпуса. См. http://textblob.readthedocs.io/en/dev/install.html. для деталей.


Оригинальный ответ

Вот более чистое решение, которое позволяет вам устанавливать данные NLTK непосредственно на Heroku, не добавляя их в репозиторий git.

Я использовал аналогичные шаги для установки Textblob на Heroku, который использует NLTK в качестве зависимости. . Я внес небольшие изменения в свой исходный код на шагах 3 и 4, которые должны работать только для установки NLTK.

Пакет сборки heroku по умолчанию включает 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.

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

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

  5. Зафиксируйте все эти изменения в своем репо.

  6. Установите переменную среды NLTK_DATA в вашем приложении heroku.

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

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

person Michael Godshall    schedule 01.06.2016
comment
Как есть, решение загружает nltk_data каждый раз, когда вы развертываете приложение, что может занять много времени. Это необходимо? - person Jean-Claude Moissinac; 03.06.2016
comment
По моему опыту, дополнительное время развертывания незначительно, если вы устанавливаете только те данные nltk, которые вам нужны. Для этого конкретного вопроса установка wordnet при каждом развертывании будет очень быстрой. Он по-прежнему эффективен, даже если вам нужно несколько пакетов данных. Просто не пытайтесь установить все данные nltk, и в большинстве случаев у вас все будет хорошо. - person Michael Godshall; 03.06.2016
comment
Круто .. плюс 1 за предложение сборочных пакетов :) Мне действительно интересно, почему у этого еще нет хороших голосов !! - person Harsh Trivedi; 14.07.2016
comment
@ Jean-ClaudeMoissinac, вы можете легко сохранить условие, которое проверяет, установлен ли уже nltk или нет. И устанавливайте только если это не так. - person Harsh Trivedi; 14.07.2016
comment
Отличные ответы! Я долго искал решения, и это пока лучшее. - person DucCuong; 28.09.2016

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

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

данные корпуса не могут быть загружены непосредственно в папку /usr/share/nltk_data. сообщает об ошибке «нет разрешения», два решения:

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

    • Download the corpora to any directory you have the access to. `python -m nltk.downloader -d some_user_accessable_directory wordnet'. Noted, there you only download the required corpora, e.g., wordnet, reuters instead of the whole corpora from nltk.
    • Добавьте путь к пути nltk. В файле py добавьте следующие строки:

      import nltk nltk.data.path.append('nltk_data')

person HappyCoding    schedule 26.02.2016

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

/usr/share/nltk_data/corpora/wordnet

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

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

Опять же, вместо wordnet он может быть коричневым.

person Gaurav Anand    schedule 13.01.2016

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

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

python -m nltk.downloader -d /usr/local/share/nltk_data wordnet
person Thiago    schedule 13.11.2017

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

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

person Kenneth Reitz    schedule 17.03.2017

Я мог решить свою проблему только с помощью этого решения:

https://github.com/gunthercox/ChatterBot/issues/930#issuecomment-322111087

Это обходной путь, связанный с SSL.

person Laura Corssac    schedule 02.05.2020

Я знаю, что это старый вопрос, но поскольку «правильный» ответ изменился благодаря тому, что Heroku предлагает поддержку nltk, я подумал, что, возможно, стоит ответить.

Heroku теперь поддерживает nltk. Если вам нужно загрузить что-то для nltk (в этом примере wordnet или, возможно, стоп-слова или корпус), вы можете сделать это, просто включив файл nltk.txt в тот же корневой каталог, где у вас есть ваши Procfile и requirements.txt. В вашем файле nltk.txt вы перечисляете каждый элемент, который хотите загрузить. Для проекта, который я только что развернул, мне понадобились стоп-слова и wordnet, поэтому мой nltk.txt выглядит так:

stopwords

wordnet

Довольно просто. И, конечно же, убедитесь, что у вас есть соответствующая версия nltk, указанная в вашем Pipfile или requirements.txt. Чтобы узнать правду, посетите https://devcenter.heroku.com/articles/python-nltk< /а>.

person James L Tollefson    schedule 14.06.2020

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

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

person Scid    schedule 14.06.2019

Я столкнулся с той же ошибкой. Этот обходной путь, предложенный Fred Foo, помог мне решить проблему. В моем случае работает следующее:

# 1) execute the below written code 
# 2) a NLTK Download window will open
# 3) select "Corpora" tab and scroll down until "wordnet"
# 4) doubleclick to install

nltk.download()
from nltk.corpus import wordnet

Импорт WordNet в NLTK

person whitelegend    schedule 20.05.2021