pickle.picklingerror:\uu newobj\uuuargs中的args[0]与hadoop python具有错误的类

x6yk4ghg  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(401)

我正在尝试通过spark删除停止词,代码如下

from nltk.corpus import stopwords
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession

sc = SparkContext('local')
spark = SparkSession(sc)
word_list=["ourselves","out","over", "own", "same" ,"shan't" ,"she", "she'd", "what", "the", "fuck", "is", "this","world","too","who","who's","whom","yours","yourself","yourselves"]

wordlist=spark.createDataFrame([word_list]).rdd

def stopwords_delete(word_list):
    filtered_words=[]
    print word_list

    for word in word_list:
        print word
        if word not in stopwords.words('english'):
            filtered_words.append(word)

filtered_words=wordlist.map(stopwords_delete)
print(filtered_words)

我得到的错误如下:
pickle.picklingerror:newobj args中的args[0]具有错误的类
我不知道为什么,有人能帮我吗。
提前谢谢

zu0ti5jz

zu0ti5jz1#

这与停止词模块的上传有关。作为一个围绕导入stopwords库的工作,函数本身中包含。请参阅下面链接的类似问题。我有同样的问题,这项工作解决了这个问题。

def stopwords_delete(word_list):
        from nltk.corpus import stopwords
        filtered_words=[]
        print word_list

类似问题
我建议你 from pyspark.ml.feature import StopWordsRemover 作为永久固定点。

k3bvogb1

k3bvogb12#

您正在使用一个rdd上的Map,该rdd只有一行,每个字作为一列。因此,类型为的rdd的整行被传递给stopwords\u delete函数,并且在其中的for循环中,尝试将rdd与stopwords匹配,但失败了。请这样尝试,

filtered_words=stopwords_delete(wordlist.flatMap(lambda x:x).collect())
print(filtered_words)

我把这个输出作为过滤词,

["shan't", "she'd", 'fuck', 'world', "who's"]

另外,在函数中包含一个return。
另一种方法,你可以用列表理解来代替stopwords\u delete函数,

filtered_words = wordlist.flatMap(lambda x:[i for i in x if i not in stopwords.words('english')]).collect()
piztneat

piztneat3#

可能是因为你每次都在executor上定义stopwords.words('english')。在外面定义它,这样就行了。

相关问题