Ошибка засолки при использовании стоп-слов из NLTK в pyspark (блоки данных) - PullRequest
0 голосов
/ 05 марта 2020

Я обнаружил в сети следующую функцию:

def RemoveStops(data_str):    
    #nltk.download('stopwords')
    english_stopwords = stopwords.words("english")
    broadcast(english_stopwords)
    # expects a string
    stops = set(english_stopwords)
    list_pos = 0
    cleaned_str = ''
    text = data_str.split()
    for word in text:
        if word not in stops:
            # rebuild cleaned_str
            if list_pos == 0:
                cleaned_str = word
            else:
                cleaned_str = cleaned_str + ' ' + word
            list_pos += 1
    return cleaned_str

и затем делаю следующее:

ColumntoClean = udf(lambda x: RemoveStops(x), StringType())
data = data.withColumn("CleanedText", ColumntoClean(data[TextColumn]))

Я получаю следующую ошибку:

PicklingError: args [0] из newobj args имеет неправильный класс

Забавно, если я перезапущу тот же набор кода, он запускается и не выдает травление ошибка. Может кто-нибудь помочь мне решить эту проблему? Спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Просто измените свою функцию таким образом, и она должна запуститься.

nltk.download('stopwords')
english_stopwords = stopwords.words("english")
def RemoveStops(data_str):    
    # expects a string
    stops = set(english_stopwords)
    list_pos = 0
    cleaned_str = ''
    text = data_str.split()
    for word in text:
        if word not in stops:
            # rebuild cleaned_str
            if list_pos == 0:
                cleaned_str = word
            else:
                cleaned_str = cleaned_str + ' ' + word
            list_pos += 1
    return cleaned_str

Блоки данных - это боль, когда дело доходит до nltk. Он не позволяет stopwords.words ("engli sh") запускаться внутри функции при применении udf.

...