我正在尝试通过火花删除停用词,代码如下
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)
我得到的错误如下:
泡菜。PicklingError: args[0] fromnewobj args有错误的类
我不知道为什么,有人可以帮助我。
提前致谢
这与上传停用词模块有关。作为函数本身导入停用词库的解决方法。请参阅下面链接的类似问题。 我遇到了同样的问题,这个解决方法解决了这个问题。
def stopwords_delete(word_list):
from nltk.corpus import stopwords
filtered_words=[]
print word_list
类似问题
我建议from pyspark.ml.feature import StopWordsRemover
作为永久修复。
可能只是因为你每次在执行器上定义 arrestwords.words('english'(。在外面定义它,这将起作用。
您正在对只有一行的 rdd 使用 map,每个单词都作为 column.so,整行 rdd 的类型被传递给stopwords_delete函数,并在其中的 for 循环中,试图将 rdd 与停用字匹配,但失败了。像这样尝试,
filtered_words=stopwords_delete(wordlist.flatMap(lambda x:x).collect())
print(filtered_words)
我得到了这个输出作为filtered_words,
["shan't", "she'd", 'fuck', 'world', "who's"]
此外,在函数中包含返回值。
另一种方式,您可以使用列表推导来替换stopwords_delete功能,
filtered_words = wordlist.flatMap(lambda x:[i for i in x if i not in stopwords.words('english')]).collect()
问题与停用词有关。 您需要以稳定的方式确定它