Spark ml余弦相似度:如何获得1到n相似度分数

voi*_*oid 5 scala cosine-similarity apache-spark apache-spark-ml apache-spark-mllib

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

genre,actor
horror,mohanlal shobhana pranav 
comedy,mammooty suraj dulquer
romance,fahad dileep manju
comedy,prithviraj
Run Code Online (Sandbox Code Playgroud)

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

val vectorRdd = finalDF.map(row => row.getAs[Vector]("features"))
Run Code Online (Sandbox Code Playgroud)

转换成 RDD[Vector]

然后,我RowMatrix通过

val matrix = new RowMatrix(vectorRdd)
Run Code Online (Sandbox Code Playgroud)

我下面这个指南,以余弦相似,我需要什么参考火花mllib的方法来找到特定的记录和所有其他人等之间的相似性在sklearn方法,如图所示,指南:

cosine_similarity(tfidf_matrix[0:1], tfidf_matrix)
Run Code Online (Sandbox Code Playgroud)

但是,我找不到如何执行此操作。我不明白matrix.columnSimilarities()比较和返回的内容。有人可以帮我找我的东西吗?

任何帮助表示赞赏!谢谢。

mce*_*aya 0

我自己用两个小函数计算过。在 2 个数据帧的 crossJoin 上调用 cosineSimilarity。(将第一行和其他行分成 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)
    }
Run Code Online (Sandbox Code Playgroud)