【问题标题】:Spark ml cosine similarity: how to get 1 to n similarity scoreSpark ml余弦相似度:如何获得1到n的相似度分数
【发布时间】:2017-02-27 10:39:22
【问题描述】:

我读到我可以使用RowMatrix 附带的columnSimilarities 方法来查找各种记录的余弦相似度(基于内容)。我的数据如下所示:

genre,actor
horror,mohanlal shobhana pranav 
comedy,mammooty suraj dulquer
romance,fahad dileep manju
comedy,prithviraj

现在,我创建了一个 spark-ml 管道来计算上述文本特征(流派、演员)的 tf-idf,并在我的管道中使用 VectorAssembler 将这两个特征组合成一列“特征” .之后,我使用这个转换我获得的DataFrame

val vectorRdd = finalDF.map(row => row.getAs[Vector]("features"))

将其转换为RDD[Vector]

然后,我通过

获得我的RowMatrix
val matrix = new RowMatrix(vectorRdd)

我正在关注this 指南以获取余弦相似度的参考,我需要的是 spark-mllib 中的一种方法来查找特定记录与所有其他记录之间的相似度,例如 sklearn 中的this 方法,如图所示指南:

cosine_similarity(tfidf_matrix[0:1], tfidf_matrix)

但是,我无法找到如何做到这一点。我不明白matrix.columnSimilarities() 在比较和返回什么。有人可以帮我找什么吗?

感谢任何帮助!谢谢。

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib cosine-similarity apache-spark-ml


    【解决方案1】:

    我自己用 2 个小函数计算出来的。在 2 个数据帧的 crossJoin 上调用 cosineSimilarity。(将第 1 行和其他行分隔为 2)

    def cosineSimilarity(vectorA: SparseVector, 
            vectorB:SparseVector,normASqrt:Double,normBSqrt:Double) :
        (Double,Double) = {
            var dotProduct = 0.0
            for (i <-  vectorA.indices){ 
                dotProduct += vectorA(i) * vectorB(i)
            }
            val div = (normASqrt * normBSqrt)
            if (div == 0 )
                (dotProduct,0)
            else
                (dotProduct,dotProduct / div)
        }
    
        val normSqrt : (org.apache.spark.ml.linalg.SparseVector => Double) = (vector: org.apache.spark.ml.linalg.SparseVector) => {
            var norm = 0.0
            for (i <- vector.indices ) {
                norm += Math.pow(vector(i), 2)
            }
            Math.sqrt(norm)
        }
    

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 2016-01-26
      • 2011-01-01
      • 2018-04-11
      • 2019-12-23
      • 2014-02-25
      • 2011-05-01
      相关资源
      最近更新 更多