3

背景:我将 URL 数据聚合到一个字符串数组中。这种形式的。[xyz.com,abc.com,efg.com]

1)我根据 URL 计数连续过滤

vectored_file(size('agg_url_host')>3)

2)我过滤掉下一步不经常出现的url

CountVectorizer(inputCol="agg_url_host",outputCol="vectors",minDF=10000)

问题是某些行足以在步骤 1 中通过我的 size 函数,但在我们删除不太频繁的 url 之后却没有。因此,即使我只希望计数高于 3 的行用于建模,我也会得到向量列读取的行: (68,[],[]) (68,[4,56],[1.0,1.0]) 。

所以我的问题是我可以在像 countVectorizer 的输出这样的向量对象上运行大小函数吗?或者它们是否有类似的功能可以消除低计数?

也许有一种方法可以从我原来的 'agg_url' 列中创建一个新的字符串数组列,并且删除频率较低的列?然后我可以对其执行 CountVectorizer 。

任何帮助表示赞赏。

4

2 回答 2

2

输出向量的大小总是固定的,所以你唯一能做的就是计算非零元素:

from pyspark.sql.functions import udf

@udf("long")
def num_nonzeros(v):
    return v.numNonzeros()

df = spark.createDataFrame([
    (1, SparseVector(10, [1, 2, 4, 6], [0.1, 0.3, 0.1, 0.1])),
    (2, SparseVector(10, [], []))
], ("id", "vectors"))

df.where(num_nonzeros("vectors") > 3).show()
# +---+--------------------+      
# | id|             vectors|
# +---+--------------------+
# |  1|(10,[1,2,4,6],[0....|
# +---+--------------------+

但是像这样的操作操作通常不是很有用的特征工程步骤。请记住,缺乏信息也是信息。

于 2018-04-20T17:13:47.237 回答
0

您可以将密集向量转换为字符串,然后拆分和计数。这样你就不需要使用更有效的 udf 虽然它不是干净的代码看起来像这样

from pyspark.sql import functions as F
df = df.withColumn('str' ,df['vector'].cast('string'))
df = df.withColumn('count' , (F.size(F.split('str' , ','))-1)/2)
于 2020-12-13T19:49:20.670 回答