使用 PySpark 代码在文档分类中包含关键字字典

Include keywords dictionary in document classification using PySpark code

我正在尝试使用 PySpark 执行文档分类。

我正在使用以下步骤:

# Tokenizer

tokenizer = Tokenizer().setInputCol("text").setOutputCol("words")

# Stop Word removal

    updated_stopwords_list = list(set(StopWordsRemover().getStopWords() + 
    custom_stopword_list))

remover_custom = StopWordsRemover(inputCol="words", outputCol="filtered", 
stopWords=updated_stopwords_list)

# HashingTF

hashingTF = HashingTF().setNumFeatures(1000).setInputCol("filtered").setOutputCol("rawFeatures")

# IDF

idf = 
IDF().setInputCol("rawFeatures").setOutputCol("features").setMinDocFreq(0)
pipeline=Pipeline(stages=[tokenizer,remover_custom,hashingTF,idf])

我正在管道中使用它。

现在,在删除停用词后,我想包含一个关键字字典(数据字典),这样它将 select 数组中的单词(停用词删除器的输出是一个数组词)存在于该词典中。

谁能指导我如何做到这一点?我正在从 CSV 文件中读取关键字字典。

如果您不需要使用 HashingTF,这里是一个使用 CountVectorizer 的选项,方法是将词汇表强制为您的关键字列表:

# Prepare keyword list to go into CountVectorizer. Can also use Tokenizer if your keywords are only single words
str_to_arr_udf = udf(lambda s: [s], ArrayType(StringType()))

# Fit CountVectorizer to keywords list so vocabulary = keywords
keyword_df = spark.read.format("csv").load(csv_file)
keyword_df.withColumn("filtered", str_to_arr_udf("keyword"))
cv = CountVectorizer(inputCol="filtered", outputCol="filtered_only_keywords", binary=True)
cvm = cv.fit(keyword_df)

# Transform the actual dataframe
cv.transform(df_output_from_stopwords)

否则,udf 路由始终是一个选项。类似于:

keyword_list = [x.word for x in spark.read.load(file).collect()]
keep_words_udf = udf(lambda word_list: [ word for word in word_list if word in keyword_list], ArrayType(StringType()) )

假设这个关键词列表不包含StopWordsRemover列表中的任何词,StopWordsRemover步骤实际上是不必要的。