在Python中使用NLTK语料库和AWS Lambda函数

时间:2017-02-22 04:20:18

标签: python nltk aws-lambda

我在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,但这看起来有点奇怪。

知道

的格式

有谁知道我哪里出错了?

4 个答案:

答案 0 :(得分:6)

之前我遇到过同样的问题但我使用环境变量解决了它。

  1. 执行“nltk.download()”并将其复制到AWS lambda应用程序的根文件夹。 (该文件夹应称为“nltk_data”。)
  2. 在lambda函数的用户界面中(在AWS控制台中),添加“NLTK_DATA”=“。/ nltk_data”。请看图像。 Configure NLTK DATA for AWS Lambda

答案 1 :(得分:2)

在AWS Lambda上

你需要在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目录,该目录可写。但是,如果您有大量并发,那么这可能不是一个很好的解决方案。