我想调用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">>>> 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环境中的路径。
为什么找不到?
NLTK. Punkt not found和这个How to config nltk data directory from code?的解决方案,但它们都不适合我。
我已经试着更新
nltk.data.path.append('/root/nltk_data/tokenizers/')
它不起作用。似乎nltk看不到新添加的路径!
我还将punkz复制到nltk将搜索的路径。
cp数据/根/nltk_ -r /令牌化器/punkt/根/nltk_data
但是,nltk仍然看不到它。
谢谢
发布于 2021-11-16 18:16:17
在启动Databricks单节点集群时,这将很好地工作。通过pip安装nltk,然后使用nltk.download模块获得预先构建的模型/文本。
假设:用户正在使用python作为默认语言的Databricks笔记本中进行编程。
在启动多节点集群时,您将遇到一些问题。
现在,当您运行UDF时,该模块将存在于群集的所有节点上。
使用nltk.download()
获取模块引用的数据的
nltk.data.path
.为了克服这个问题,我探索了两种可能性。其中一个是有效的。
使用初始化脚本安装
python -c 'import nltk;nltk.download('all');‘
我遇到了nltk已安装但安装后找不到的问题。我假设虚拟环境在这里扮演了一个角色。
1. Create the script
dbutils.fs.put('/dbfs/databricks/scripts/nltk-install.sh',“#!/bin/bash pip install nltk”,True)
1. Check it out
%sh head '/dbfs/databricks/scripts/nltk-install.sh‘
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)
启动集群。
安装完成并运行群集后,请检查以确保环境变量已正确创建。
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及其所有默认数据/模型了。
发布于 2021-10-18 12:44:51
这帮助我解决了这个问题:
import nltk
nltk.download('all')
https://stackoverflow.com/questions/63433168
复制相似问题