我在AWS Lambda中使用NLTK语料库(特别是停用词)时遇到了困难。我知道语料库需要下载并使用NLTK.download('stopwords')完成,并将它们包含在用于在nltk_data / corpora / stopwords中上传lambda模块的zip文件中。
代码中的用法如下:
from nltk.corpus import stopwords
stopwords = stopwords.words('english')
nltk.data.path.append("/nltk_data")
这将从Lambda日志输出中返回以下错误
module initialization error:
**********************************************************************
Resource u'corpora/stopwords' not found. Please use the NLTK
Downloader to obtain the resource: >>> nltk.download()
Searched in:
- '/home/sbx_user1062/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'
- '/nltk_data'
**********************************************************************
我还尝试通过包含
直接加载数据nltk.data.load("/nltk_data/corpora/stopwords/english")
产生不同的错误
module initialization error: Could not determine format for file:///stopwords/english based on its file
extension; use the "format" argument to specify the format explicitly.
从Lambda zip加载数据时可能会出现问题,需要将其存储在外部..比如S3,但这看起来有点奇怪。
知道
的格式有谁知道我哪里出错了?
答案 0 :(得分:6)
之前我遇到过同样的问题但我使用环境变量解决了它。
答案 1 :(得分:2)
你需要在lambda中包含nltk python包并修改data.py:
path += [
str('/usr/share/nltk_data'),
str('/usr/local/share/nltk_data'),
str('/usr/lib/nltk_data'),
str('/usr/local/lib/nltk_data')
]
到
path += [
str('/var/task/nltk_data')
#str('/usr/share/nltk_data'),
#str('/usr/local/share/nltk_data'),
#str('/usr/lib/nltk_data'),
#str('/usr/local/lib/nltk_data')
]
您无法包含整个nltk_data目录,删除所有zip文件,如果您只需要停用词,请保存nltk_data - >语料库 - >停止并停止其余部分。如果你需要tokenizer,请保存nltk_data - > tokenizers - > PUNKT。要下载nltk_data文件夹,请使用anaconda Jupyter笔记本并运行
nltk.download()
或
https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/corpora/stopwords.zip
或
python -m nltk.downloader all
答案 2 :(得分:0)
如果你的停用词语料库在/nltk_data
下(基于root,而不是在你的主目录下),你需要告诉nltk 之前你试图访问语料库:
from nltk.corpus import stopwords
nltk.data.path.append("/nltk_data")
stopwords = stopwords.words('english')
答案 3 :(得分:0)
另一种解决方案是在/ tmp位置使用Lambda的临时存储空间
因此,您将遇到以下情况:
import nltk
import json
from nltk.tokenize import word_tokenize
nltk.data.path.append("/tmp")
nltk.download("punkt", download_dir = "/tmp")
在运行时,punkt将下载到/ tmp目录,该目录可写。但是,如果您有大量并发,那么这可能不是一个很好的解决方案。