使用Python对Spark中每个文档的TFIDF稀疏向量值求和

使用Python对Spark中每个文档的TFIDF稀疏向量值求和,python,apache-spark,tf-idf,apache-spark-mllib,Python,Apache Spark,Tf Idf,Apache Spark Mllib,我使用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]) 如何计算文档中所有术语

我使用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文档。

来自
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=0
用于tfidf中的k.collect():
v[I]=SparseVector(k)
I=I+1
我得到消息:TypeError:int()参数必须是字符串或数字,不是“SparseVector”,这与向量中的值之和有什么关系?这里有上下文吗?是的,因为我的问题还说“针对每个文档”,而不是针对一行。回答的第一步是使用SparseVector方法,但这对每个文档都不起作用。你是说
map
(请参见编辑)?如果要求和,只需在末尾添加
sum()
call。