【问题标题】:Summation of TFIDF sparse vector values for each document in Spark with Python使用 Python 对 Spark 中每个文档的 TFIDF 稀疏向量值求和
【发布时间】:2016-06-09 22:48:42
【问题描述】:

我使用 Pyspark 的 HashingTF 和 IDF 计算了 3 个示例文本文档的 TFIDF,得到了以下 SparseVector 结果:

(1048576,[558379],[1.43841036226])
(1048576,[181911,558379,959994],  [0.287682072452,0.287682072452,0.287682072452])
(1048576,[181911,959994],[0.287682072452,0.287682072452])

如何计算文档中所有术语的 TFIDF 值的总和。 例如。 (0.287682072452 + 0.287682072452) 用于 3d 文档。

【问题讨论】:

    标签: python apache-spark tf-idf apache-spark-mllib


    【解决方案1】:

    IDF 的输出只是一个 PySpark SparseVector,当它暴露给 Python 并且它的值是标准 NumPy array 所以你只需要sum 调用:

    from pyspark.mllib.linalg import SparseVector
    
    v = SparseVector(1048576,[181911,959994],[0.287682072452,0.287682072452])
    v.values.sum()
    ## 0.57536414490400001
    

    或超过 RDD:

    rdd = sc.parallelize([
      SparseVector(1048576,[558379],[1.43841036226]),
      SparseVector(1048576, [181911,558379,959994],  
          [0.287682072452,0.287682072452,0.287682072452]),
      SparseVector(1048576,[181911,959994],[0.287682072452,0.287682072452])])
    
    rdd.map(lambda v: v.values.sum())
    

    【讨论】:

    • 感谢@zero323,它适用于您的示例中的给定值,但是当我按照以下代码为所有文档转换 TFIDF 时:i=0for k in tfidf.collect():v[i]=SparseVector(k)i= i+1我得到消息:TypeError: int() argument must be a string or a number, not 'SparseVector'
    • 这与向量中的值之和有何关系?这里有上下文吗?
    • 是的,因为我的问题还说“针对每个文档”而不是针对一行。您回答的第一步是使用不适用于每个文档的 SparseVector 方法。
    • 你的意思是map(查看编辑)?如果您想求和,只需在末尾添加 sum() 调用即可。
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2023-04-07
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多