scala – Spark ml余弦相似度:如何获得1到n的相似度得分
发布时间:2020-12-16 18:29:01 所属栏目:安全 来源:网络整理
导读:我读到我可以使用RowMatrix附带的columnSimilarities方法来查找各种记录(基于内容)的余弦相似性.我的数据看起来像这样: genre,actorhorror,mohanlal shobhana pranav comedy,mammooty suraj dulquerromance,fahad dileep manjucomedy,prithviraj 现在,我创
我读到我可以使用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()正在比较和返回什么.有人可以帮助我找到我要找的东西吗? 任何帮助表示赞赏!谢谢. 解决方法
我用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) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |