从计数矢量化器向量元素的Pyspark-大小函数?

时间:2018-04-20 16:45:44

标签: python apache-spark pyspark spark-dataframe countvectorizer

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

1)我使用

连续根据Url计数进行过滤
vectored_file(size('agg_url_host')>3)

2)我使用

过滤掉下一步不经常出现的网址
CountVectorizer(inputCol="agg_url_host",outputCol="vectors",minDF=10000)

问题是某些行足以在步骤1中传递我的大小函数,但是在我们删除不太频繁的URL之后没有。所以我最终得到了矢量列读数的行: (68,[],[]) (68,[4,56],[1.0,1.0]) 即使我只想要计数大于3的行。

所以我的问题是我可以在vectorVectorizer的输出上运行矢量对象的大小函数吗?或者他们是一个类似的功能,将删除低计数?

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

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

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

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....|
# +---+--------------------+

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

答案 1 :(得分:0)

您可以将Dense向量转换为字符串,然后进行分割和计数。这样,您不需要使用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)