在Heroku上找不到资源'corpora / wordnet'

时间:2012-12-20 05:21:22

标签: python django heroku nltk wordnet

我正在努力让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中查看过了,所以我不知道发生了什么。

10 个答案:

答案 0 :(得分:53)

我刚遇到同样的问题。最终为我工作的是在应用程序的文件夹中创建一个'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/。如果您正在使用GUI下载程序,则通过UI底部的文本字段设置下载目录。如果您正在使用命令行1,则在配置菜单中进行设置。

一旦下载者知道指向您新创建的nltk_data目录,请下载您的语料库。

或者从Python代码中迈出一步:

nltk.download("wordnet", "whatever_the_absolute_path_to_myapp_is/nltk_data/")

第3步:让nltk知道在哪里看

ntlk查找数据,资源等。在nltk.data.path变量中指定的位置。您需要做的就是使用nltk将nltk.data.path.append('./nltk_data/')添加到python文件中,除了默认路径之外,它还会在那里查找语料库,标记符等。

第4步:将其发送至Heroku

git add nltk_data/
git commit -m 'super useful commit message'
git push heroku master

那应该有用!无论如何它确实对我有用。值得注意的一点是,从执行nltk内容的python文件到nltk_data目录的路径可能会有所不同,具体取决于您的应用程序结构,所以只需在执行nltk.data.path.append('path_to_nltk_data')

时考虑到这一点

答案 1 :(得分:4)

仅适用于Mac OS用户。

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

语料库数据无法直接下载到/usr/share/nltk_data文件夹。错误报告"没有许可",两个解决方案:

  1. 向Mac系统添加其他权限更改,详情请参阅mixed content。但是,我不想仅为此语料库更改为mac默认设置。然后我去寻找第二个解决方案。

    • 将语料库下载到您有权访问的任何目录。 `python -m nltk.downloader -d some_user_accessable_directory wordnet'。注意,在那里你只下载了所需的语料库,例如wordnet,路透社而不是nltk的整个语料库。
    • 添加路径到nltk路径。在py文件中,添加以下行:

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

答案 2 :(得分:3)

更新

As Kenneth Reitz pointed out,一个更简单的解决方案已被添加到heroku-python-buildpack中。将nltk.txt文件添加到根目录并在其中列出您的语料库。有关详细信息,请参阅https://devcenter.heroku.com/articles/python-nltk

原始答案

这是一个更简洁的解决方案,允许您直接在Heroku上安装NLTK数据,而无需将其添加到您的git仓库。

我使用类似的步骤在Heroku上安装Textblob,Heroku使用NLTK作为依赖项。我对步骤3和4中的原始代码进行了一些小的调整,这些调整应适用于仅限NLTK的安装。

默认的heroku buildpack包含一个post_compile step,它在所有默认构建步骤完成后运行:

# 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. 在heroku应用程序上设置NLTK_DATA环境变量。

    $ heroku config:set NLTK_DATA='/app/nltk_data'
    
  7. 部署到Heroku。您将在部署结束时看到post_compile步骤触发器,然后是nltk下载。
  8. 我希望你发现这有用!享受!

答案 3 :(得分:2)

我遇到了这个问题。对于那些不在虚拟环境中工作的人,需要下载到ubuntu中的以下目录:

/usr/share/nltk_data/corpora/wordnet

而不是wordnet它可能是棕色或其他什么。 如果要下载语料库,可以在终端中直接运行此命令。

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

再次代替wordnet,它可能是棕色的。

答案 4 :(得分:1)

Heroku现在正式支持内置的NLTK数据!

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

答案 5 :(得分:1)

这个有效:

适用于Mac OS用户。

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

答案 6 :(得分:0)

在Heroku平台上部署聊天机器人时,我遇到了完全相同的问题。尽管天窗的答案是一个万无一失的解决方案,但是在许多情况下,存储库的大小将急剧增加。

因此,我在app.py文件中使用了nltk.download('PACKAGE')。这样,无论何时运行app.py,都将自动下载依赖项。

答案 7 :(得分:0)

我只能用此解决方案解决问题:

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

这是与SSL相关的解决方法。

答案 8 :(得分:0)

我知道这是一个老问题,但是由于Heroku对nltk的支持,“正确”的答案已经改变,我认为可能值得回答。

Heroku现在支持nltk。如果您需要下载nltk的内容(在此示例中为wordnet,或者可能是停用词或语料库),则只需在您的{ {1}}和nltk.txt。在Procfile文件中,列出要下载的每个项目。对于刚刚部署的项目,我需要停用词和wordnet,因此我的requirements.txt如下所示:

nltk.txt

非常简单。并且,当然,请确保您在nltk.txtstopwords wordnet 中指定了正确的nltk版本。有关基本事实,请访问https://devcenter.heroku.com/articles/python-nltk

答案 9 :(得分:0)

我遇到了同样的错误。 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

Import WordNet In NLTK