【问题标题】:No module named 'spacy' in PySparkPySpark 中没有名为“spacy”的模块
【发布时间】: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.1spacy-legacy==3.0.9spacy-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


【解决方案1】:

在 Jupyter Notebook 中复制您的案例时,我遇到了同样的错误。

我使用了这个 pip 命令并且它有效:

pip install -U spacy

但是安装后,我得到了一个JAVA_HOME is not set 错误,所以我使用了这些命令:

conda install openjdk conda install -c 
conda-forge findspark 
!python3 -m spacy download en_core_web_sm

我只是把它包括在内,以防你也可能遇到它。

这是输出:

注意:我使用了spacy.load("en_core_web_sm")

【讨论】:

  • 您好,感谢您的尝试。然而,暂时我会说我会“作为一粒盐”排练这个解决方案,因为在我的情况下,它是强制使用我自己的 NER 模型,作为 spaCy 的默认模型(en_core_web_sm你正在使用)没有我必须使用的实体,因此它没有用(您能否开发一个您自己的快速、自定义的 NER 模型,并尝试看看您的解决方案是否有效?在这里找到一个快速演示:course.spacy.io/en/chapter4)。另外,JAVA_HOME is not set 不是我得到的错误,所以如果我实现其他命令,我可能会偏离。
【解决方案2】:

我通过结合两条信息设法解决了这个问题:

  • “配置 Dataproc Python 环境”,“Dataproc 映像版本 2.0”(因为这是我正在使用的版本):可用here(特别感谢评论部分的@Dagang)。
  • “创建一个(数据处理)簇”:可用here

具体来说,在通过 Google 控制台设置 Dataproc 集群期间,我通过以下方式“安装”了 spaCy:

当集群已经创建时,我运行了我原来的帖子中提到的代码(没有修改),结果如下:

这解决了我原来的问题。我计划将我的解决方案应用于更大的数据集,但我认为那里发生的任何事情都是不同线程的主题。

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2019-08-05
    • 2021-01-18
    • 2021-07-25
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多