我正在尝试使用自定义的NER空间模型来执行一些实体提取。提取将在Spark Dataframe上完成,所有的工作都在Dataproc集群中进行(使用Jupyter Notebook,可在 “Workbench” 中获得)。我正在使用的代码如下所示:
# 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)
我得到的错误代码看起来与此类似,但answer不适用于我的情况,因为它处理的是 “在Yarn中执行Pyspark作业”,这是不同的(或者我是这么认为的,请随时纠正我)。另外,我也找到了this,但答案相当模糊(我必须在这里诚实地说:我所做的唯一一件“重新启动spark会话”的事情是在我的Jupyter Notebook的最后一个单元格中运行spark.stop()
,然后再次运行上面的单元格,也可以在这里纠正我)。
所使用的代码深受"Answer 2 of 2" in this forum的启发,这让我怀疑是否还有一些缺失的设置仍然困扰着我(顺便说一句,“答案1/2”已经测试过了,但没有工作)。
- 谢谢-谢谢
澄清事项:
因为在注解部分生成的一些查询或提示可能很长,所以我决定在这里包含它们:
- 问题1:“您使用哪个命令创建了群集?"*:我使用了这种方法,所以命令“在普通视线中“是不可见的;但是,我刚刚意识到,当您要创建集群时,您会看到一个 “EQUIVALENT COMMAND LINE” 按钮,该按钮可赠款对以下命令的访问权限:
在我的例子中,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。
- No. 2:“可能的原因路径错误”:不是我的情况,它实际上看起来类似于this case(即使我不能说两者的根情况是相同的):
- 运行
which python
将显示/opt/conda/miniconda3/bin/python
作为结果。 - 运行
which spacy
(读取“澄清编号1”)显示结果为/opt/conda/miniconda3/bin/spacy
。
2条答案
按热度按时间nbewdwxp1#
在Jupyter Notebook中复制您的案例时,我遇到了同样的错误。
我使用了这个pip命令,它成功了:
但是在安装之后,我得到了一个
JAVA_HOME is not set
错误,所以我使用了这些命令:我只是把它包括在内,以防你也可能遇到它。
以下是输出:
注意:我使用了
spacy.load("en_core_web_sm")
。i2loujxw2#
我设法解决了这个问题,通过结合两条信息:
具体来说,在通过Google Console设置Dataproc群集期间,我通过执行以下操作“安装”了Spacy:
当集群创建完成后,我运行了我的原始帖子中提到的代码(没有修改),结果如下:
这解决了我最初的问题。我计划将我的解决方案应用于更大的数据集,但我认为那里发生的任何事情,都是不同线程的主题。