首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NLTK被调用并得到错误"punkt“not found on databricks pyspark

NLTK被调用并得到错误"punkt“not found on databricks pyspark
EN

Stack Overflow用户
提问于 2020-08-16 12:32:21
回答 2查看 934关注 0票数 4

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

我的py3代码:

代码语言:javascript
运行
复制
 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())

我运行上面的代码,得到了:

代码语言:javascript
运行
复制
 [nltk_data] Downloading package punkt to /root/nltk_data...
 [nltk_data]   Package punkt is already up-to-date!

当我运行以下代码时:

代码语言:javascript
运行
复制
 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 !

我收到错误:

代码语言:javascript
运行
复制
 <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‘。它位于

代码语言:javascript
运行
复制
/root/nltk_data/tokenizers

我已经用文件夹位置更新了spark环境中的路径。

为什么找不到?

NLTK. Punkt not found和这个How to config nltk data directory from code?的解决方案,但它们都不适合我。

我已经试着更新

代码语言:javascript
运行
复制
 nltk.data.path.append('/root/nltk_data/tokenizers/')

它不起作用。似乎nltk看不到新添加的路径!

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

cp数据/根/nltk_ -r /令牌化器/punkt/根/nltk_data

但是,nltk仍然看不到它。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2021-11-16 18:16:17

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

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

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

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

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

使用nltk.download()获取模块引用的数据的

  1. 。当我们在多节点集群中以交互方式执行nltk.download()时,它只会下载到驱动程序节点。因此,当您的UDF在其他节点上执行时,这些节点将不会在缺省情况下查找的指定路径中包含所需的引用。要查看这些路径,请运行nltk.data.path.

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

使用初始化脚本安装

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

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

我遇到了nltk已安装但安装后找不到的问题。我假设虚拟环境在这里扮演了一个角色。

  1. (工作)使用初始化脚本安装nltk.

代码语言:javascript
运行
复制
1. Create the script

dbutils.fs.put('/dbfs/databricks/scripts/nltk-install.sh',“#!/bin/bash pip install nltk”,True)

代码语言:javascript
运行
复制
1. Check it out

%sh head '/dbfs/databricks/scripts/nltk-install.sh‘

代码语言:javascript
运行
复制
1. Configure cluster to run init script on start up [Databricks Cluster Init Script Config](https://i.stack.imgur.com/DH2jZ.png)
2. In the cluster configuration create the environment variable NLTK\_DATA="/dbfs/databricks/nltk\_data/". This is used by the nltk package to search for data/model dependencies. [Databricks Cluster Env Variable Config](https://i.stack.imgur.com/cdD3h.png)

启动集群。

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

代码语言:javascript
运行
复制
import os 
os.environ.get("NLTK_DATA")

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

代码语言:javascript
运行
复制
import nltk
nltk.data.path

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

代码语言:javascript
运行
复制
nltk.download('all', download_dir="/dbfs/databricks/nltk_data/")

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

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

执行完这些步骤之后,您就可以开始使用nltk及其所有默认数据/模型了。

票数 1
EN

Stack Overflow用户

发布于 2021-10-18 12:44:51

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

代码语言:javascript
运行
复制
import nltk
nltk.download('all')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63433168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档