加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读