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语料库.请按照以下步骤解决问题.
nltk.data.path.append('path_to_nltk_data')到实际使用nltk的Python文件即可.希望能解决问题.为我工作!
正如 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 数据。
bin在本地项目的根目录中创建目录。
将您自己的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)
将您自己的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)
添加nltk到您的requirements.txt文件(或者textblob如果您使用的是 Textblob)。
将所有这些更改提交到您的存储库。
在您的 heroku 应用程序上设置 NLTK_DATA 环境变量。
$ heroku config:set NLTK_DATA='/app/nltk_data'
Run Code Online (Sandbox Code Playgroud)
部署到 Heroku。您将post_compile在部署结束时看到步骤触发器,然后是 nltk 下载。
我希望你觉得这有帮助!享受!
| 归档时间: |
|
| 查看次数: |
6514 次 |
| 最近记录: |