Как добавить пользовательский список стоп-слов в StopWordsRemover

Я использую класс pyspark.ml.feature.StopWordsRemover в своем фрейме данных pyspark. Он имеет идентификатор и текстовый столбец. В дополнение к предоставленному списку стоп-слов по умолчанию я хотел бы добавить свой собственный список, чтобы удалить все числовые значения из строки.

Я вижу, что есть метод для добавления setStopWords для этого класса. Я думаю, что борюсь с правильным синтаксисом для использования этого метода.

from pyspark.sql.functions import *
from pyspark.ml.feature import * 

a = StopWordsRemover(inputCol="words", outputCol="filtered")
b = a.transform(df)

Приведенный выше код дает ожидаемые результаты в отфильтрованном столбце, но он удаляет/останавливает только стандартные слова. Я ищу способ добавить свой собственный список, в котором будет больше слов и числовых значений, которые я хочу отфильтровать.


person user2763088    schedule 26.04.2017    source источник


Ответы (1)


Вы можете указать это с помощью этого:

stopwordList = ["word1","word2","word3"]

StopWordsRemover(inputCol="words", outputCol="filtered" ,stopWords=stopwordList)

Небольшое примечание:

Приведенное выше решение заменяет исходный список стоп-слов списком, который мы предоставили.
Если вы хотите добавить свои собственные стоп-слова в дополнение к существующим/предопределенным стоп-словам, нам нужно добавить исходный список перед передачей. в StopWordsRemover() в качестве параметра. Мы преобразуем, чтобы установить, чтобы удалить любой дубликат.

stopwordList = ["word1","word2","word3"] stopwordList.extend(StopWordsRemover().getStopWords())
stopwordList = list(set(stopwordList))#optionnal
StopWordsRemover(inputCol="words", outputCol="filtered" ,stopWords=stopwordList)

person ML_TN    schedule 29.04.2017
comment
Добавление этого примечания о том, как добавить все числовые значения в StopWrodList: num_list=range(0,99999) stopwordList=map(str,num_list) - person user2763088; 02.05.2017
comment
Я не думаю, что разумно использовать такой список, поскольку для каждого токена он должен перебирать каждый элемент списка и сравнивать его с токеном. Я бы предложил использовать регулярное выражение, такое как ``` re.sub(r/d+, , text) ```. это намного эффективнее - person ML_TN; 02.05.2017
comment
А что, если у меня не крошечный список, а огромный текст с произвольными словами? У меня проблемы с этим, потому что txt читается как dataFrame в pyspark, и этот аргумент ,stopWords= не будет принимать кадры данных :( - person Liliana Pacheco; 14.02.2019