繁体   English   中英

在 Python 中将 NLTK 语料库与 AWS Lambda 函数结合使用

[英]Using NLTK corpora with AWS Lambda functions in Python

在 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 上,但这似乎有点奇怪。

知道什么格式

有谁知道我可能哪里出错了?

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

  1. 执行“nltk.download()”并将其复制到您的 AWS lambda 应用程序的根文件夹。 (该文件夹应称为“nltk_data”。)

您可以使用以下代码

import nltk
nltk.download('punkt', download_dir='nltk_data/')

这会将“punkit”下载到您的根目录,然后放在您的 dockerfile 下面

COPY nltk_data ./nltk_data
  1. 在 lambda 函数的用户界面中(在 AWS 控制台中),您添加“NLTK_DATA”=“./nltk_data”。 请看图片。 为 AWS Lambda 配置 NLTK 数据

另一种解决方案是在 /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 目录。 但是,如果您有大量并发,这可能不是一个很好的解决方案。

在 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 -> corpora -> stopwords 并转储其余的。 如果您需要分词器,请保存 nltk_data -> 分词器 -> punkt。 要下载 nltk_data 文件夹,请使用 anaconda Jupyter notebook 并运行

nltk.download()

要么

https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/corpora/stopwords.zip

要么

python -m nltk.downloader all

如果您的停用词语料库在/nltk_data (基于 root,而不是您的主目录下),则您需要尝试访问语料库之前告诉 nltk:

from nltk.corpus import stopwords
nltk.data.path.append("/nltk_data")

stopwords = stopwords.words('english')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM