LookupError:找不到资源'corpora/stopwords'

use*_*472 3 python heroku nltk flask python-2.7

我正在尝试使用Flask在Heroku上运行webapp.webapp使用NLTK(自然语言工具包库)在Python中编程.

其中一个文件有以下标题:

import nltk, json, operator
from nltk.corpus import stopwords 
from nltk.tokenize import RegexpTokenizer 
Run Code Online (Sandbox Code Playgroud)

当调用带有停用词代码的网页时,会产生以下错误:

LookupError: 
**********************************************************************
  Resource 'corpora/stopwords' 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)

使用的确切代码:

#remove punctuation  
toker = RegexpTokenizer(r'((?<=[^\w\s])\w(?=[^\w\s])|(\W))+', gaps=True) 
data = toker.tokenize(data)  

#remove stop words and digits 
stopword = stopwords.words('english')  
data = [w for w in data if w not in stopword and not w.isdigit()]  
Run Code Online (Sandbox Code Playgroud)

Heroku上的webapp在stopword = stopwords.words('english')注释掉时不会产生Lookup错误.

代码在我的本地计算机上运行时没有任何故障.我已经在我的计算机上安装了所需的库

pip install requirements.txt  
Run Code Online (Sandbox Code Playgroud)

当我在计算机上测试代码时,Heroku提供的虚拟环境正在运行.

我也尝试过两种不同来源提供的NLTK,但LookupError它仍然存在.我使用的两个来源是:
http://pypi.python.org/packages/source/n/nltk/nltk-2.0.1rc4.zip
https://github.com/nltk/nltk.git

小智 5

问题是语料库(在这种情况下为'stopwords')不会上传到Heroku.您的代码在本地计算机上运行,​​因为它已经具有NLTK语料库.请按照以下步骤解决问题.

  1. 在项目中创建一个新目录(让我们称之为'nltk_data')
  2. 下载该目录中的NLTK语料库.您必须在下载期间配置它.
  3. 告诉nltk寻找这条特殊的路径.只需添加nltk.data.path.append('path_to_nltk_data')到实际使用nltk的Python文件即可.
  4. 现在将应用程序推送到Heroku.

希望能解决问题.为我工作!


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 stopwords corpora, 
    # so you may want to change for your specific needs.  
    # See http://www.nltk.org/data.html
    python -m nltk.downloader stopwords
    
    # 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 下载。

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