调用了NLTK,并得到了在数据块pyspark上未找到“punkt”的错误

vxf3dgd4  于 2022-11-01  发布在  Spark
关注(0)|答案(5)|浏览(367)

我想通过pyspark调用NLTK在数据块上做一些NLP。我已经从数据块的库标签中安装了NLTK。它应该可以从所有节点访问。
我的py 3代码:

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'
- ''

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

/root/nltk_data/tokenizers

我已经用文件夹位置更新了spark环境中的PATH。
为什么它找不到?
NLTK. Punkt not found的解决方案和这个如何从代码配置nltk数据目录?但他们都不为我工作。
我已尝试更新

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

不起作用。似乎nltk看不到新添加的路径!
我还将punkz复制到nltk将搜索的路径中。
cp -r /root/nltk_data/标记化程序/插入点/root/nltk_data
但是nltk仍然看不到它。
谢谢

du7egjpx

du7egjpx1#

当启动一个Databricks单节点集群时,这将工作正常。通过pip安装nltk,然后使用nltk.download模块获得预构建的模型/文本。
假设条件:用户正在使用默认语言python在Databricks笔记本中进行编程。
在启动多节点集群时,您会遇到一些问题。
1.您正在注册依赖于其他模块中的代码的UDF。为了使此UDF在群集中的每个节点上工作,需要在群集级别安装该模块(即nltk安装在驱动程序和所有工作节点上)。该模块可以像这样在集群启动时通过init脚本进行安装,也可以通过“数据块计算”部分中的库部分进行安装。更多信息请点击此处...(我也在下面给予了代码示例)https://learn.microsoft.com/enus/azure/databricks/libraries/cluster-libraries
现在,当您运行UDF时,该模块将存在于集群的所有节点上。
1.使用nltk.download()来获取模块引用的数据。当我们nltk.download在多节点集群中交互执行www.example.com()时,它只会下载到驱动程序节点。因此,当UDF在其他节点上执行时,这些节点将不会在默认情况下查找的指定路径中包含所需的引用。要查看这些路径默认路径,请运行nltk.data.path
为了克服这个问题,我探索了两种可能性,其中一种可行。
1.(不起作用)使用init脚本,安装nltk,然后在相同的init脚本中,nltk.download在安装后通过一行bash python表达式调用www.example.com,如...

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

我遇到了nltk安装后却找不到的问题。我假设虚拟环境在这里扮演了一个角色。
1.(工作)使用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.将群集配置为在启动Databricks Cluster Init Script Config时运行init脚本
1.在集群配置中创建环境变量NLTK_DATA="/dbfs/databricks/nltk_data/"。nltk软件包使用该变量来搜索数据/模型依赖关系。Databricks Cluster Env Variable Config
启动群集。
安装环境变量并运行群集后,请检查以确保已正确创建环境变量。

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_DATA,所以当我们汇入nltk时,它会在该目录中寻找。唯一的差异是,我们现在将nltk指向每个节点都可以存取的Databricks储存体。
现在,由于数据在集群启动时就存在于装载的存储中,我们不需要每次都重新下载数据。
完成这些步骤后,您应该可以使用nltk及其所有默认数据/模型了。

tyg4sfes

tyg4sfes2#

我最近遇到了同样的问题时,使用NLTK在胶水工作。
将“丢失”文件添加到所有节点为我解决了这个问题。我不确定它是否会帮助数据库,但值得一试。

sc.addFile('/tmp/nltk_data/tokenizers/punkt/PY3/english.pickle')
0lvr5msh

0lvr5msh3#

Drew Ringo的建议几乎对我起了作用。如果你在Databricks中使用多节点集群,你将面临Ringo提到的问题。对我来说,一个简单得多的解决方案是运行下面的init_script

dbutils.fs.put("dbfs:/databricks/scripts/nltk_punkt.sh", """#!/bin/bash
pip install nltk
python -m nltk.downloader punkt""",True)

请确保在集群配置菜单中的 * 高级选项-〉初始化脚本 * 下添加文件路径。

41zrol4v

41zrol4v4#

如果集群的init_script如下所示,那么Drew Ringo提出的两种可能性中的第一种将有效:

%sh
/databricks/python/bin/pip install nltk
/databricks/python/bin/python -m nltk.downloader punkt

他认为他最初的问题与虚拟环境有关是正确的。

tktrz96b

tktrz96b5#

这帮助我解决了这个问题:

import nltk
nltk.download('all')

相关问题