NLTK 被调用并收到错误“punkt”在 databricks pyspark 上未找到

2024-01-08

我想调用 NLTK 通过 pyspark 在 databricks 上做一些 NLP。 我已经从 databricks 的库选项卡安装了 NLTK。它应该可以从所有节点访问。

我的 py3 代码:

 import pyspark.sql.functions as F
 from pyspark.sql.types import StringType
 import nltk
 nltk.download('punkt')
 

 def get_keywords1(col):
     sentences = []
     sentence = nltk.sent_tokenize(col)
      

 get_keywords_udf = F.udf(get_keywords1, StringType())

我运行上面的代码并得到:

 [nltk_data] Downloading package punkt to /root/nltk_data...
 [nltk_data]   Package punkt is already up-to-date!

当我运行以下代码时:

 t = spark.createDataFrame(
 [(2010, 1, 'rdc', 'a book'), (2010, 1, 'rdc','a car'),
  (2007, 6, 'utw', 'a house'), (2007, 6, 'utw','a hotel')
 ], 
 ("year", "month", "u_id", "objects"))
 
 t1 = t.withColumn('keywords', get_keywords_udf('objects'))
 t1.show() # error here !

我收到错误:

 <span class="ansi-red-fg">&gt;&gt;&gt; import nltk

 PythonException: 
  An exception was thrown from the Python worker. Please see the stack trace below.
 Traceback (most recent call last):
  
 LookupError: 
 **********************************************************************
 Resource punkt not found.
 Please use the NLTK Downloader to obtain the resource:

 >>> import nltk
 >>> nltk.download('punkt')

 For more information see: https://www.nltk.org/data.html

Attempted to load tokenizers/punkt/PY3/english.pickle

Searched in:
- '/root/nltk_data'
- '/databricks/python/nltk_data'
- '/databricks/python/share/nltk_data'
- '/databricks/python/lib/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'
- ''

我已经下载了“朋克”。它位于

/root/nltk_data/tokenizers

我已经使用文件夹位置更新了 Spark 环境中的 PATH。

为什么找不到?

解决方案位于NLTK。未找到朋克 https://stackoverflow.com/questions/55297145/nltk-punkt-not-found和这个如何从代码中配置nltk数据目录? https://stackoverflow.com/questions/3522372/how-to-config-nltk-data-directory-from-code/22987374#22987374但他们都不适合我。

我已尝试更新

 nltk.data.path.append('/root/nltk_data/tokenizers/')

这是行不通的。 看来nltk看不到新添加的路径!

我还将 punkz 复制到 nltk 将搜索的路径中。

cp -r /root/nltk_data/tokenizers/punkt /root/nltk_data

但是,nltk仍然看不到它。

thanks


当启动 Databricks 单节点集群时,这将工作得很好。通过 pip 安装 nltk,然后使用 nltk.download 模块来获取预构建的模型/文本。

假设:用户正在 Databricks 笔记本中使用 Python 作为默认语言进行编程。

当启动多节点集群时,您会遇到一些问题。

  1. 您正在注册一个依赖于另一个模块的代码的 UDF。为了使 UDF 在集群中的每个节点上工作,需要在集群级别安装模块(即安装在驱动程序和所有工作节点上的 nltk)。该模块可以在集群启动时通过 init 脚本进行安装,也可以通过 Databricks 计算部分中的库部分进行安装。更多关于这里......(我还在下面给出了代码示例)https://learn.microsoft.com/enus/azure/databricks/libraries/cluster-libraries https://learn.microsoft.com/enus/azure/databricks/libraries/cluster-libraries.

    现在,当您运行 UDF 时,该模块将存在于集群的所有节点上。

  2. Using nltk.download()获取模块引用的数据。当我们在多节点集群中交互执行 nltk.download() 时,它只会下载到驱动程序节点。因此,当您的 UDF 在其他节点上执行时,这些节点将不会在默认情况下查找的指定路径中包含所需的引用。查看这些路径默认路径运行nltk.data.path.

为了克服这个问题,我探索了两种可能性。其中之一有效。

  1. (不起作用)使用初始化脚本安装 nltk,然后在安装后在同一初始化脚本中通过单行 bash python 表达式调用 nltk.download,如下所示...

    python -c 'import nltk; nltk.download('all');'
    

    我遇到过安装了 nltk 但安装后找不到的问题。我假设虚拟环境在这里发挥作用。

  2. (有效)使用 init 脚本安装 nltk。

    1. 创建脚本
    dbutils.fs.put('/dbfs/databricks/scripts/nltk-install.sh', """ 
    #!/bin/bash
    pip install nltk""", True)
    
    1. 一探究竟
    %sh
    head '/dbfs/databricks/scripts/nltk-install.sh'
    
    1. 配置集群在启动时运行 init 脚本Databricks 集群初始化脚本配置 https://i.stack.imgur.com/DH2jZ.png
    2. 在集群配置中创建环境变量 NLTK_DATA="/dbfs/databricks/nltk_data/"。 nltk 包使用它来搜索数据/模型依赖项。Databricks 集群环境变量配置 https://i.stack.imgur.com/cdD3h.png

启动集群。

安装完毕并且集群正在运行后,请检查以确保环境变量已正确创建。

import os 
os.environ.get("NLTK_DATA")

然后检查以确保 nltk 指向正确的路径。

import nltk
nltk.data.path

如果 '/dbfs/databricks/nltk_data/ 在列表中,我们就可以开始了。 下载您需要的东西。

nltk.download('all', download_dir="/dbfs/databricks/nltk_data/")

请注意,我们将依赖项下载到 Databricks 存储中。现在每个节点都可以访问 nltk 默认依赖项。因为我们在导入 nltk 时在集群创建时指定了环境变量 NLTK_DATA,所以它将在该目录中查找。这里唯一的区别是我们现在将 nltk 指向我们的 Databricks 存储,每个节点都可以访问该存储。

现在,由于数据在集群启动时存在于已安装的存储中,因此我们不需要每次都重新下载数据。

遵循这些步骤后,您应该可以使用 nltk 及其所有默认数据/模型了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NLTK 被调用并收到错误“punkt”在 databricks pyspark 上未找到 的相关文章

随机推荐