gpt4 book ai didi

scala - Spark ml 余弦相似度 : how to get 1 to n similarity score

转载 作者:行者123 更新时间:2023-12-03 17:39:19 25 4
gpt4 key购买 nike

我读到我可以使用 columnSimilarities RowMatrix 附带的方法找到各种记录的余弦相似度(基于内容)。我的数据看起来像这样:

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

现在,我创建了一个 spark-ml 管道来计算上述文本特征(流派、 Actor )的 tf-idf 并使用 VectorAssembler在我的管道中,将这两个功能组合成一列“功能”。之后,我转换我获得的 DataFrame使用这个:
val vectorRdd = finalDF.map(row => row.getAs[Vector]("features"))

将其转换为 RDD[Vector]
然后,我获得了我的 RowMatrix经过
val matrix = new RowMatrix(vectorRdd)

我正在关注 this余弦相似度引用指南,我需要的是 spark-mllib 中的一种方法来查找特定记录与所有其他记录之间的相似度,例如 this sklearn中的方法,如指南所示:
cosine_similarity(tfidf_matrix[0:1], tfidf_matrix)

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

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

最佳答案

我自己用 2 个小函数计算过。在 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)
}

关于scala - Spark ml 余弦相似度 : how to get 1 to n similarity score,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40103442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com