matlab实现余弦相似度_Spark文本相似度:Spark相似度计算如何实现

文章来源:加米谷大数据

在大数据平台系统当中,对于推荐系统、文本聚类、图像视频聚类等方面的计算需求,通常就涉及到相似度计算的相关问题。以文本聚类为例,如果在大数据计算当中遇到文本相似度计算的处理需求,应该如何去实现呢?今天,我们就主要来分享一下Spark文本相似度计算方面的知识。
如上所言,大规模相似度计算的需求,常常在推荐系统、文本聚类以及图像视频聚类当中出现,而文本聚类,也就是文本相似度计算,相对推荐系统、图像聚类来说,实现难度不算太高。

af3674db36d7d625b293923750e2628c.png


在Spark框架当中,实现相似度计算,可以基于笛卡尔积的方式计算RDD中两两匹配的相似度。
RDD作为分布式计算数据集,可以很容易的实现多线程、多节点的进行相似度计算,比单机单进程的计算方式要快很多。一般业务场景下item数量要远远大于user数据量。所以,在大数据量下,即时单机可以容忍itemCF的计算时间,userCF则不行。最简单的RDD优化方式,可以通过广播变量的方式提高对比计算的效率。
向量化+分布式矩阵

RowMatrix
CoordinateMatrix
//利用Spark分布式矩阵计算Item相似度
def itemVectorSimilarity(spark:SparkSession,
trainData:Dataset[UserItem],
topN: Int) = {
//计算相似度矩阵
def standardCosine(matrix: CoordinateMatrix): RDD[MatrixEntry] = {
val similarity= matrix.toIndexedRowMatrix().columnSimilarities()
val sim= similarity.entries
sim
}
val sim= standardCosine(parseToMatrix(trainData)).map {
case MatrixEntry(user1, user2, sim)=> (user1, (user2,sim))
}.groupByKey().
flatMapValues {x=>
val sim_users = x.toList.sortBy(-_._2).take(topN)
sim_users
}.map(x=> (x._1, x._2._1,x._2._2))
}
LSH
Spark实现LSH(局部敏感哈希)如:BucketedRandomProjectionLSH 和 MinHash。
LSH保证高维空间相近的点映射到低维空间相近的概率很高。LSH也是一个降维的过程。
LSH的参数
Tables:该参数越大,可以降低误报率(false negative rate);参数越小,可以提高运行的效率。
K-Means Tree
K-Means Tree实际就是对数据做了多层K-means,每一层到当前的划分“叶子节点”包含样本数都小于1个。
K-D Tree
是对数据点在k维空间中划分的一种数据结构。k-d tree实际上是一种二叉树。
Spark-LSH实现Item相似度计算:
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.ml.linalg.{SparseVector,Vectors}
import org.apache.spark.ml.feature.{BucketedRandomProjectionLSH, MinHashLSH, MinHashLSHModel}
val user_count =data_rating.map(_._1.toInt).max
val data_rating_matrix = data_rating.map (x=> (x._2.toInt, (x._1.toInt, x._3))).
groupByKey().mapValues { x =>
val features= x.toList.map {
case (feature_index, value) =>
(feature_index, value)
}.sortBy(_._1)
Vectors.sparse(user_count - 1, features)
}.sortByKey()
val data_rating_df =spark.createDataFrame(data_rating_matrix).toDF("id", "features")
val mh = new MinHashLSH().
setNumHashTables(5).
setInputCol("features").
setOutputCol("hashes")
val itemModel = mh.fit(data_rating_df)
val transformed_data_rating =itemModel.transform(data_rating_df)
transformed_data_rating.show(false)
val itemSimRDD = data_rating_matrix.collect().
map(x=> (x._1, itemModel.approxNearestNeighbors(data_rating_df, x._2, 10)))
itemSimRDD
目前来说,Spark文本相似度计算的最佳解决方案,是LSH +TopN,无需计算笛卡尔积,只要查找最近邻TopN即可。如果是计算笛卡尔积,时间复杂度至少 O(2^n), 如果变成TopN查找问题,时间复杂度立马下降到O(n)。
关于Spark文本相似度计算,以上就是简单的介绍了,基于Spark在计算性能上的优势,大规模相似度计算的任务,可以快速地完成,并且将结果反馈到用户端。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值