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

26

我正在尝试在Heroku上使用NLTK和wordnet。我已经完成了

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目录,并且它确实存在,所以我不确定发生了什么事情。


https://devcenter.heroku.com/articles/python-nltk - Kenneth Reitz
15个回答

65

我刚遇到了同样的问题。最终解决方法是在应用程序文件夹本身中创建一个“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底部的文本字段设置下载目录。如果您使用命令行下载器,则需要在配置菜单中进行设置。

一旦下载器知道指向您新创建的nltk_data目录,就可以下载语料库。

或者通过Python代码一步完成:

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

步骤3:告诉nltk要查找哪里

nltknltk.data.path变量指定的位置查找数据、资源等。你只需要在实际使用nltk的Python文件中添加nltk.data.path.append('./nltk_data/'),它就会在默认路径之外的那里查找语料库、分词器等。

步骤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')时要考虑到这一点。


如果您想在Heroku上安装NLTK数据而不将其添加到git存储库中,请参见我下面的解决方案:https://dev59.com/AGYr5IYBdhLWcg3wFGZS#37558445 - Michael Godshall
对我来说关键是要添加nltk.data.path.append('./nltk_data/')。 - user2415010

6

更新

正如 Kenneth Reitz 所指出的那样,heroku-python-buildpack 已经添加了一个更简单的解决方案。只需在根目录下添加一个 nltk.txt 文件,并将您的 corpora 列表列出来即可。详情请参见 https://devcenter.heroku.com/articles/python-nltk


原始回答

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

我使用类似的步骤在 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

正如您所看到的,它会在您的项目目录中查找bin目录中自己的post_compile文件,并在存在时运行它。 您可以使用此挂钩来安装nltk数据。

  1. Create the bin directory in the root of your local project.

  2. Add your own post_compile file to the bin directory.

    # 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. Add your own install_nltk_data file to the bin directory.

    # 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. Add nltk to your requirements.txt file (Or textblob if you are using Textblob).

  5. Commit all of these changes to your repo.

  6. Set the NLTK_DATA environment variable on your heroku app.

    $ heroku config:set NLTK_DATA='/app/nltk_data'
    
  7. Deploy to Heroku. You will see the post_compile step trigger at the end of the deployment, followed by the nltk download.

我希望这篇文章能对你有所帮助!祝你愉快!


现在的解决方案每次部署应用程序时都需要加载nltk_data,这可能会花费很长时间。这是必要的吗? - Jean-Claude Moissinac
根据我的经验,如果只安装你需要的nltk数据,额外的部署时间可以忽略不计。对于这个具体的问题,每次部署只安装wordnet会非常快。即使你需要一些数据包,这仍然是有效的。只要不尝试安装所有的nltk数据,你在大多数情况下都应该没问题。 - Michael Godshall
太棒了!加1个赞,因为你建议使用构建包:) 我真的很想知道为什么这还没有得到好评!! - Harsh Trivedi
@Jean-ClaudeMoissinac,您可以轻松地保留一个条件来检查nltk是否已经安装。如果没有安装,只需安装即可。 - Harsh Trivedi
非常好的答案!我已经寻找解决方案很长时间了,这是迄今为止最好的一个。 - DucCuong

5

仅适用于Mac OS用户。

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

无法直接将语料库数据下载到/usr/share/nltk_data文件夹。出现“无权限”错误报告,有两个解决方案:

  1. 向Mac系统添加额外的权限更改,详细信息请参见在root 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')


python -m nltk.downloader -d C:\Users\Username\AppData\Roaming\nltk_data wordnet 可以在 Windows 10 上使用。 - Mike IT Expert

2

我遇到了这个问题。对于那些没有使用虚拟环境的人,在Ubuntu中需要下载下面的目录:

/usr/share/nltk_data/corpora/wordnet

可以使用除了WordNet之外的语料库,例如Brown或其他。如果您想下载语料库,可以直接在终端中运行此命令。

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

相比于WordNet,也可以使用Brown语料库。


2

这个可以使用:

适用于Mac OS用户。

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

1

1

1
我遇到了同样的问题,我尝试了这个解决方案,它有效。我只是加入了这些内容:
import nltk
nltk.download('wordnet')

在上面的代码中,它可以无问题地运行。因此,尝试一下,也许能帮助你。


1

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

现在Heroku支持nltk。如果您需要下载nltk的某些内容(例如此示例中的wordnet或者stopwords或者一个corpora),您只需在与Procfilerequirements.txt位于同一根目录下的位置包含一个nltk.txt文件即可。在您的nltk.txt文件中,您列出每个要下载的项目。对于我刚刚部署的项目,我需要停用词和wordnet,因此我的nltk.txt如下:

stopwords

wordnet

非常简单。当然,确保你在Pipfilerequirements.txt中指定了适当版本的nltk。有关真相,请访问https://devcenter.heroku.com/articles/python-nltk


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接