Pyspark NLP - CountVectorizer最大DF或TF。如何从数据中过滤常见的出现。

2024-06-16 11:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用CountVectorizer为ML准备一个数据集。我想过滤掉稀有单词,并使用CountVectorizer、minDF或minTF的参数。我还想删除数据集中“经常”出现的项。我看不到可以设置的maxTF或maxDF参数。有什么好办法吗?在

df = spark.createDataFrame(
[(0, ["a", "b", "c","b"]), (1, ["a", "b", "b", "c", "a"])],
["label", "raw"])

所以在本例中,如果我想删除出现“4”次或40%的参数,以及出现2次或更少的参数。这将删除“b”和“c”。在

目前,我运行CountVectorizer(minDf=3......)作为下限请求。如何筛选出出现频率超过我想要的模型的项目。在


Tags: 数据df参数raw单词mllabelspark
1条回答
网友
1楼 · 发布于 2024-06-16 11:35:56

我想您需要CountVectorizer参数,但现在看来还没有该参数。这不是一个简单或实用的方法来做它在一个简单的,但它是有效的。我希望这对你有帮助:

from pyspark.sql.types import *
from pyspark.sql import functions as F

df = spark.createDataFrame(
[(0, ["a", "b", "c","b"]), (1, ["a", "b", "b", "c", "a"])],
["label", "raw"])

counts_df = df \
    .select(F.explode('raw').alias('testCol')) \
    .groupby('testCol') \
    .agg(F.count('testCol').alias('count')).persist() # this will be used multiple times

total = counts_df \
    .agg(F.sum('count').alias('total')) \
    .rdd.take(1)[0]['total']
min_times = 3
max_times = total * 0.4
filtered_elements = counts_df \
    .filter((min_times>F.col('count')) | (F.col('count')>max_times)) \
    .select('testCol') \
    .rdd.map(lambda row: row['testCol']) \
    .collect()

def removeElements(arr):
    return list(set(arr) - set(filtered_elements))

remove_udf = F.udf(removeElements, ArrayType(StringType()))
filtered_df = df \
    .withColumn('raw', remove_udf('raw'))

结果:

^{pr2}$

相关问题 更多 >