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

use*_*006 20 python django heroku nltk wordnet

我正在努力让NLTK和wordnet在Heroku上工作.我已经完成了

heroku run python
nltk.download()
  wordnet
pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

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'
Run Code Online (Sandbox Code Playgroud)

然而,我已经在/ app/nltk_data中查看过了,所以我不知道发生了什么.

fol*_*oof 54

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

所以,假设我的python应用程序位于名为"myapp /"的目录中

第1步:创建目录

cd myapp/
mkdir nltk_data
Run Code Online (Sandbox Code Playgroud)

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

python -m nltk.downloader
Run Code Online (Sandbox Code Playgroud)

这会弹出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/")
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

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


Hap*_*ing 5

仅适用于 Mac 操作系统用户。

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

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

  1. 为 Mac 系统添加额外的权限更改,详细信息请参阅在 root El Capitan 上操作不允许(无 root 禁用)。但是,我不想仅针对此语料库更改为 mac 默认设置。我选择第二种解决方案。

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

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


Mic*_*all 5

更新

正如 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
Run Code Online (Sandbox Code Playgroud)

如您所见,它会在您的项目目录中查找该目录中您自己的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"
    
    Run Code Online (Sandbox Code Playgroud)
  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"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 添加nltk到您的requirements.txt文件(或者textblob如果您使用的是 Textblob)。

  5. 将所有这些更改提交到您的存储库。

  6. 在您的 heroku 应用程序上设置 NLTK_DATA 环境变量。

    $ heroku config:set NLTK_DATA='/app/nltk_data'
    
    Run Code Online (Sandbox Code Playgroud)
  7. 部署到 Heroku。您将post_compile在部署结束时看到步骤触发器,然后是 nltk 下载。

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