PicklingError:无法序列化对象:TypeError:无法腌制fasttext_pybind.fasttext对象

数据挖掘 数据科学模型 数据框 pyspark 序列化
2021-10-08 16:29:56

我建立了一个 fasttext 分类模型,以便对 facebook 评论进行情感分析(在 windows 上使用 pyspark 2.4.1)。当我使用预测模型函数来预测一个句子的类别时,结果是一个元组,其形式如下:

[('__label__positif', '__label__négatif', '__label__neutre', 0.8947999477386475, 0.08174632489681244, 0.023483742028474808)]

但是当我尝试将其应用于“文本”列时,我这样做了:

from pyspark.sql.types import *
from pyspark.sql.functions import udf, col
import fasttext

schema = StructType([
    StructField("pos", StringType(), False),
    StructField("neg", StringType(), False),
    StructField("ntr", StringType(), False),
    StructField("pr_pos", DoubleType(), False),
    StructField("pr_neg", DoubleType(), False),
    StructField("pr_ntr", DoubleType(), False)
])

udf_label = udf(lambda words : predictClass(words), schema)
df = df.withColumn("classe", udf_label(col('text')))

df.select('classe').show()

我收到此错误: PicklingError: Could not serialize object: TypeError: can't pickle fasttext_pybind.fasttext objects

1个回答

在 FastText 用户 FB 页面中,某个 Maksym Kysylov 回答我“这不是 FastText 问题。这是 Spark 问题 :) 当您将函数应用于 Dataframe(或 RDD)时,Spark 需要对其进行序列化并发送给所有执行程序。实际上不可能序列化 FastText 的代码,因为它的一部分是本机的(在 C++ 中)。可能的解决方案是将模型保存到磁盘,然后为每个 spark 分区从磁盘加载模型并将其应用于数据。类似于:df.rdd.mapPartitions( func). 并且 func 应该: 1. 加载模型; 2. 对于分区中的记录:yield ft.predict(record['text'])。" 它对我有用,我非常感谢他!