【问题标题】:Any way to import Python's nltk.download('punkt') into Google Cloud Functions?有什么方法可以将 Python 的 nltk.download('punkt') 导入 Google Cloud Functions?
【发布时间】:2020-09-24 06:53:20
【问题描述】:

有什么方法可以将 Python 的 nltk.download('punkt') 导入 Google Cloud Functions?我发现手动将语句添加到 main.py 的代码块中会显着减慢我的函数处理速度,因为每次运行时都必须下载 punkt。有什么方法可以通过其他方式调用 punkt 来消除这种情况?

EDIT#1:- 我编辑了我的代码和程序结构以符合 Barak 的建议,但我一直收到同样的错误:

Error: function terminated. Recommended action: inspect logs for termination reason. Details:

**********************************************************************
  Resource [93mpunkt[0m not found.
  Please use the NLTK Downloader to obtain the resource:

  [31m>>> import nltk
  >>> nltk.download('punkt')
  [0m
  For more information see: https://www.nltk.org/data.html

  Attempted to load [93mtokenizers/punkt/PY3/english.pickle[0m

  Searched in:
    - '/tmp/nltk_data'
    - '/env/nltk_data'
    - '/env/share/nltk_data'
    - '/env/lib/nltk_data'
    - '/usr/share/nltk_data'
    - '/usr/local/share/nltk_data'
    - '/usr/lib/nltk_data'
    - '/usr/local/lib/nltk_data'
    - ''
**********************************************************************

【问题讨论】:

    标签: python google-cloud-platform google-cloud-functions nltk


    【解决方案1】:

    将 nltk 添加到您的 requirements.txt

    在您的本地计算机上安装 nltk,如果您还没有:

    pip install nltk
    

    然后下载 nltk_data 文件。对于分词器,我需要 Punkt 分词器模块:

    python -m nltk.downloader punkt  
    

    将它们(它们位于 Roaming/ for Windows 中)复制到您的根文件夹(即与您的函数一起):

    cp -r C:\Users\<USER>\AppData\Roaming\nltk_data\* YOUR\ROOT\FOLDER\nltk_data\       
    

    在你的主要 python 函数的开头,或者在使用 nltk 之前,添加以下代码——基本上,它会获取 path where nltk_data 是,并告诉 nltk 查看这个文件夹:

      root = os.path.dirname(os.path.abspath(__file__))
      download_dir = os.path.join(root, 'nltk_data')
      os.chdir(download_dir)
      nltk.data.path.append(download_dir)
    

    最后,在提交/推送之后(如果您使用 Cloud Source Repos),(重新)部署您的函数!

    【讨论】:

    • 我对这个答案投了赞成票,因为这对我有用。我不得不删除 os.chdir 部分,因为这会导致错误。谢谢你帮我摆脱这个困境。
    【解决方案2】:

    查看uploading files with your Cloud function 的说明。具体来说,由于您可以上传文件,因此您可以修改 nltk 以仅使用这些文件:

    official NLTK documentation 之后,您可以“将您的 NLTK_DATA 环境变量设置为指向您的顶级 nltk_data 文件夹。”

    将这些组合在一起,您会得到:

    1. 使用python -m nltk.downloader punkt下载数据(在您的计算机上)
    2. 将 NLTK 目录(在上述文档中找到您计算机上的路径)上传为 nltk_data 目录,在您的函数环境的根目录下创建
    3. 配置代码以找到该文件夹​​:

      import os
      root = os.path.dirname(path.abspath(__file__))
      nltk_dir = os.path.join(root, 'nltk_data')  # Your folder name here
      os.environ['NLTK_DATA'] = nltk_dir
      

    编辑:好像带环境变量的路径导出并没有达到预期的效果,所以让我们在代码中明确路径

    1. 在您的计算机上下载数据

      import os
      download_dir = os.path.abspath('my_nltk_dir')
      os.makedirs(download_dir)
      import nltk
      nltk.download('punkt', download_dir=download_dir)
      
    2. 将目录my_nltk_dir 添加到您的python 脚本的同一文件夹中。这将是

      PROJECT_ROOT/
      |-- my_code.py
      |-- my_nltk_dir/
          |-- ...
      
    3. 在您的代码中引用数据使用

      import ntlk.data
      root = os.path.dirname(path.abspath(__file__))
      download_dir = os.path.join(root, 'my_nltk_dir')
      nltk.data.load(
          os.path.join(download_dir, 'tokenizers/punkt/english.pickle')
      )
      

    【讨论】:

    • 谢谢。我有两个问题。首先,我是否应该在上述代码中的任何位置提供直接到达所需文件的路径?我见过添加路径代替“nltk_data”的代码,但这对我不起作用。其次,此代码是否依赖于我托管 nltk 的设备?或者我可以只部署该功能然后完全忘记我的设备吗?再次感谢。
    • @LuckyStrike - 我添加了更多详细信息,因为使用环境变量似乎确实存在问题 - 我已经详细说明了如何找出具体相对于您的代码的 nltk 数据的路径,你可以将它打包在包含你的代码的 zip 中 - 它应该能够在你的函数运行的任何地方运行。
    • 在根据您的建议重新编辑我的代码后,我已经编辑了我的问题以匹配我面临的当前问题。我还添加了与最后一个 nltk.data.load 函数相同的行,但与“tokenizers/punkt/english.pickle”一起,我还为“tokenizers/punkt/PY3/english.pickle”添加了另一个加载命令。
    • @LuckyStrike - 从错误来看,它似乎并没有真正尝试合并 ntlk 文件夹(它正在尝试加载 tokenizers/punkt/PY3/english.pickle)。尝试修复执行此操作的代码,或者在该代码之前尝试os.chdir(download_dir),这样当它尝试从当前目录加载时,这也将起作用。如果没有代码本身,这是我能提供的最佳猜测。
    • 谢谢,我会将您的答案标记为正确,因为代码相对较快(但不够快)。 Os.chdir 做到了。自 2 年以来,使用 Google Cloud Functions 似乎存在固有的延迟问题,使其比 Azure 函数或 AWS Lambda 慢得多。
    猜你喜欢
    • 2020-02-13
    • 2023-02-03
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2023-03-16
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多