我正在尝试使用Flask在Heroku上运行webapp。 webapp使用NLTK(自然语言工具包库)在Python中编程。
其中一个文件包含以下标题:
import nltk, json, operator
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
当调用带有停用词代码的网页时,会产生以下错误:
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'
**********************************************************************
使用的确切代码:
#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()]
当stopword = stopwords.words('english')
被注释掉时,Heroku上的webapp不会产生查找错误。
代码在我的本地计算机上运行时没有任何故障。我已经使用
在我的计算机上安装了所需的库pip install requirements.txt
当我在计算机上测试代码时,Heroku提供的虚拟环境正在运行。
我也尝试过两个不同来源提供的NLTK,但LookupError
仍在那里。我使用的两个来源是:
http://pypi.python.org/packages/source/n/nltk/nltk-2.0.1rc4.zip
https://github.com/nltk/nltk.git
答案 0 :(得分:5)
问题是语料库(在这种情况下为'stopwords')没有上传到Heroku。您的代码在本地计算机上运行,因为它已经具有NLTK语料库。请按照以下步骤解决问题。
nltk.data.path.append('path_to_nltk_data')
添加到实际使用nltk的Python文件中。希望能解决问题。为我工作!
答案 1 :(得分:3)
As Kenneth Reitz pointed out,一个更简单的解决方案已被添加到heroku-python-buildpack中。将nltk.txt
文件添加到根目录并在其中列出您的语料库。有关详细信息,请参阅https://devcenter.heroku.com/articles/python-nltk。
这是一个更简洁的解决方案,允许您直接在Heroku上安装NLTK数据,而无需将其添加到您的git仓库。
我使用类似的步骤在Heroku上安装Textblob,Heroku使用NLTK作为依赖项。我对步骤3和4中的原始代码进行了一些小的调整,这些调整应适用于仅限NLTK的安装。
默认的heroku buildpack包含一个post_compile
step,它在所有默认构建步骤完成后运行:
# 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数据。
在本地项目的根目录中创建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"
将您自己的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"
将nltk
添加到requirements.txt
文件中(如果您使用的是Textblob,则为textblob
)。
在heroku应用程序上设置NLTK_DATA环境变量。
$ heroku config:set NLTK_DATA='/app/nltk_data'
post_compile
步骤触发器,然后是nltk下载。我希望你发现这有用!享受!