24

我正在尝试让 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 并且它就在那里,所以我不确定发生了什么。

4

11 回答 11

62

我刚遇到同样的问题。最终为我工作的是在应用程序的文件夹本身中创建一个“nltk_data”目录,将语料库下载到该目录并在我的代码中添加一行,让 nltk 知道在该目录中查找。您可以在本地完成这一切,然后将更改推送到 Heroku。

因此,假设我的 python 应用程序位于一个名为“myapp/”的目录中

第一步:创建目录

cd myapp/
mkdir nltk_data

第 2 步:将语料库下载到新目录

python -m nltk.downloader

这将弹出nltk下载器。将您的下载目录设置为whatever_the_absolute_path_to_myapp_is/nltk_data/. 如果您使用的是 GUI 下载器,下载目录是通过 UI 底部的文本字段设置的。如果您使用的是命令行一,则在配置菜单中进行设置。

一旦下载器知道指向您新创建的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/')到实际使用 nltk 的 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')

于 2013-02-14T07:02:50.543 回答
6

更新

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


原始答案

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

我使用类似的步骤在 Heroku 上安装Textblob,它使用 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 数据。

  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在部署结束时看到 step trigger,然后是 nltk 下载。

我希望你觉得这很有帮助!享受!

于 2016-06-01T02:26:45.447 回答
4

仅适用于 Mac OS 用户。

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

语料库数据不能直接下载到/usr/share/nltk_data文件夹中。报错“无权限”,两种解决方法:

  1. 为 Mac 系统添加额外的权限更改,详情请参阅在 root El capitan (rootless disabled) 上时不允许操作。但是,我不想仅为这个语料库更改为 mac 默认设置。我选择第二种解决方案。

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

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

于 2016-02-26T03:26:48.723 回答
2

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

/usr/share/nltk_data/corpora/wordnet

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

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

再次而不是 wordnet 它可能是棕色的。

于 2016-01-13T20:28:02.063 回答
2

这个有效:

对于 Mac OS 用户。

python -m nltk.downloader -d /usr/local/share/nltk_data wordnet
于 2017-11-13T03:09:23.473 回答
1

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

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

于 2017-03-17T19:05:39.337 回答
1

我只能用这个解决方案解决我的问题:

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

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

于 2020-05-02T12:46:21.790 回答
1

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

Heroku 现在支持nltk. 如果你需要下载一些东西nltk(在这个例子中是 wordnet,或者可能是停用词或语料库),你可以通过简单地nltk.txt在你拥有Procfilerequirements.txt. 在您的nltk.txt文件中,您列出要下载的每个项目。对于我刚刚部署的项目,我需要停用词和 wordnet,所以我nltk.txt看起来像这样:

stopwords

wordnet

很简单。而且,当然,请确保您的or中nltk指定了适当的版本。有关基本事实,请访问https://devcenter.heroku.com/articles/python-nltkPipfilerequirements.txt

于 2020-06-14T07:54:06.980 回答
0

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

所以,我在 app.py 文件中使用了 nltk.download('PACKAGE') 。这样,每当运行 app.py 时,都会自动下载依赖项。

于 2019-06-14T05:19:44.890 回答
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

在 NLTK 中导入 WordNet

于 2021-05-20T14:12:58.587 回答
0

我遇到了同样的问题,我尝试了这个解决方案,它是有效的。我刚刚放了这些:

import nltk
nltk.download('wordnet')

在上面的代码中,它运行没有问题。所以试试吧,也许对你有帮助。

于 2021-09-29T19:13:35.793 回答