【问题标题】:Pyspark- size function on elements of vector from count vectorizer?Pyspark- 来自计数矢量化器的矢量元素的大小函数?
【发布时间】:2018-10-01 10:40:51
【问题描述】:

背景: 我将 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 步中通过我的大小函数,但在我们删除不太频繁的 url 之后却没有。所以我最终得到了带有向量列的行: (68,[],[]) (68,[4,56],[1.0,1.0]) 即使我只想要计数高于 3 的行进行建模。

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

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

任何帮助表示赞赏。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以将密集向量转换为字符串,然后拆分和计数。这样你就不需要使用更有效的 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)
      

      【讨论】:

      • 这种方法假设没有空向量
      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多