【发布时间】:2022-08-31 05:53:08
【问题描述】:
我正在尝试使用自定义 NER spaCy 模型执行一些实体提取。提取将通过 Spark Dataframe 完成,所有内容都在 Dataproc cluster 中进行编排(使用 Jupyter Notebook,可在“工作台”)。我正在使用的代码如下所示:
# IMPORTANT: NOTICE THIS CODE WAS RUN FROM A JUPYTER NOTEBOOK (!)
import pandas as pd
import numpy as np
import time
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf, pandas_udf
from pyspark.sql.types import ArrayType, StringType
spark = SparkSession.builder.appName('SpacyOverPySpark') \
.getOrCreate()
# FUNCTIONS DEFINITION
def load_spacy_model():
import spacy
print("Loading spacy model...")
return spacy.load("./spacy_model") # This model exists locally
@pandas_udf(ArrayType(StringType()))
def entities(list_of_text: pd.Series) -> pd.Series:
# retrieving the shared nlp object
nlp = broadcasted_nlp.value
# batch processing our list of text
docs = nlp.pipe(list_of_text)
# entity extraction (`ents` is a list[list[str]])
ents=[
[ent.text for ent in doc.ents]
for doc in docs
]
return pd.Series(ents)
# DUMMY DATA FOR THIS TEST
pdf = pd.DataFrame(
[
"Pyhton and Pandas are very important for Automation",
"Tony Stark is a Electrical Engineer",
"Pipe welding is a very dangerous task in Oil mining",
"Nursing is often underwhelmed, but it's very interesting",
"Software Engineering now opens a lot of doors for you",
"Civil Engineering can get exiting, as you travel very often",
"I am a Java Programmer, and I think I'm quite good at what I do",
"Diane is never bored of doing the same thing all day",
"My father is a Doctor, and he supports people in condition of poverty",
"A janitor is required as soon as possible"
],
columns=['postings']
)
sdf=spark.createDataFrame(pdf)
# MAIN CODE
# loading spaCy model and broadcasting it
broadcasted_nlp = spark.sparkContext.broadcast(load_spacy_model())
# Extracting entities
df_new = sdf.withColumn('skills',entities('postings'))
# Displaying results
df_new.show(10, truncate=20)
我得到的错误代码看起来类似于this,但answer 不适用于我的情况,因为它处理“在 Yarn 中执行 Pyspark 作业”这是不同的(或者我认为,请随时纠正我)。另外,我还找到了this,但答案相当模糊(我必须在这里说实话:我为“重新启动 spark 会话”所做的唯一事情就是在我的 Jupyter Notebook 的最后一个单元格中运行spark.stop() ,然后再次运行上面的单元格,也可以在这里纠正我)。
使用的代码受到"Answer 2 of 2" in this forum 的极大启发,这让我想知道是否仍然有一些缺失的设置让我无法理解(顺便说一句,“Answer 1 of 2”已经过测试但没有用)。关于我的特定软件版本,可以找到here。
谢谢你。
澄清:
因为评论部分生成的一些查询或提示可能很长,我决定将它们包括在这里:
- 第 1 号:“您使用哪个命令创建集群?”:我使用了this 方法,所以命令“一目了然”是不可见的;然而,我刚刚意识到,当您即将创建集群时,您有一个“等价的命令行”按钮,授予对此类命令的访问权限:
就我而言,Dataproc 集群创建代码(由 GCP 自动生成)是:
gcloud dataproc clusters create my-cluster \
--enable-component-gateway \
--region us-central1 \
--zone us-central1-c \
--master-machine-type n1-standard-4 \
--master-boot-disk-size 500 \
--num-workers 2 \
--worker-machine-type n1-standard-4 \
--worker-boot-disk-size 500 \
--image-version 2.0-debian10 \
--optional-components JUPYTER \
--metadata PIP_PACKAGES=spacy==3.2.1 \
--project hidden-project-name
注意spaCy 是如何安装在元数据中的(遵循these 建议);但是,在 Dataproc 集群创建后立即运行 pip freeze | grep spacy 命令不会显示任何结果(即spaCy 没有成功安装)。为了启用它,之后使用official method。
-
第 2 名:“可能的原因是错误的路径”:不是我的情况,它实际上看起来类似于this case(即使我不能说两者的根本情况相同):
- 运行
which python显示/opt/conda/miniconda3/bin/python作为结果。 - 运行
which spacy(阅读“第1 号澄清”)显示/opt/conda/miniconda3/bin/spacy作为结果。
- 运行
【问题讨论】:
-
你可以试试 -pip 列表来检查它是否包含在你的包中吗?
-
您好@PoalaAstrid,不确定您是否要仔细检查是否安装了 spaCy 库,如果是,请在 cmets 中告诉我(或者如果您想要安装整个软件包列表)。我会假设你这样做,在这种情况下答案是肯定的,我确实在我的环境中安装了它:
spacy==3.2.1、spacy-legacy==3.0.9、spacy-loggers==1.0.3。 -
@PoalaAstrid,顺便说一句,我还在我的原始帖子中更新了参考 [6],因此您可以一瞥整个包和库列表。谢谢
-
您能否添加有关如何安装
spacy的更多详细信息?您是否使用了cloud.google.com/dataproc/docs/tutorials/python-configuration 中描述的方法? -
嗨@DavidEspinosa,如果我错了,请纠正我,但这是你的错误消息所说的“ModuleNotFoundError:没有名为'spacy'的模块”吗?我是从您提供的链接中得到的,因为您说您遇到了类似的错误。当路径错误时也可能发生此错误,您可能需要再次检查它。
标签: pyspark user-defined-functions google-cloud-dataproc named-entity-recognition spacy-3