我试图通过将余弦相似性应用于Databricks中的pyspark框架来找到文本列('title','headline')的相似性。我的函数名为'cosine_sim_udf',为了能够使用它,我必须进行第一次udf转换。
我得到查找错误后,应用功能的df。有人知道原因或有解决方案吗?
我的函数是寻找余弦相似性;
nltk.download('punkt')
stemmer = nltk.stem.porter.PorterStemmer()
remove_punctuation_map = dict((ord(char), None) for char in string.punctuation)
def stem_tokens(tokens):
return [stemmer.stem(item) for item in tokens]
'''remove punctuation, lowercase, stem'''
def normalize(text):
return stem_tokens(nltk.word_tokenize(text.lower().translate(remove_punctuation_map)))
vectorizer = TfidfVectorizer(tokenizer=normalize, stop_words='english')
def cosine_sim(text1, text2):
tfidf = vectorizer.fit_transform([text1, text2])
return float(((tfidf * tfidf.T).A)[0,1])
cosine_sim_udf = udf(cosine_sim, FloatType())
df2 = df.withColumn('cosine_distance', cosine_sim_udf('title', 'headline')) # title and headline are text to find similarities
然后我得到这个错误
PythonException: 'LookupError:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 426.0 failed 4 times, most recent failure: Lost task 0.3 in stage 426.0 (TID 2135) (10.109.245.129 executor 1): org.apache.spark.api.python.PythonException: 'LookupError:
**********************************************************************
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:
- '/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'
2条答案
按热度按时间xzv2uavs1#
问题在于,在您的示例中,
nltk.download('punkt')
仅在驱动程序节点上执行,而您的UDF函数在没有安装它的工作节点上执行。您有以下可能性:
dw1jzc5e2#
注:此答案在2023-08运行的DataBricks版本上进行测试。用户界面往往会随着时间的推移而变化,所以请始终检查文档:
https://docs.databricks.com/en/libraries/workspace-libraries.html
引用:“工作区库用作本地存储库,您可以从中创建群集安装的库。.必须先在群集上安装工作区库,然后才能在笔记本或作业中使用它”
在Databricks中,您可以将库安装到群集(供您自己使用),或安装在工作区中以使其可用于工作区中的所有群集。
这个库可以是例如pypi中的python lib(nltk),你构建的一个python文件等。
来回顾一下docs说的话:要在一个群集中安装,请执行以下操作:
要在工作区中安装:
现在,群集下次重新启动时即可使用该库。