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()比较和返回的内容。有人可以帮我找我的东西吗?
任何帮助表示赞赏!谢谢。
我自己用两个小函数计算过。在 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)
| 归档时间: |
|
| 查看次数: |
1559 次 |
| 最近记录: |