我想查看传入的推文与我的测试文章的相关性。我在从测试文章中提取的字符串数组中有一组关键短语。我想找到此字符串数组与传入的推文之间的相似度分数(火花流式传输),这样我就可以为所考虑的关键字获得一些相关的推文。请帮助我找到相似之处。...
我有一个String数组str [a,b,c,....] 我有一个传入的推文,我需要知道传入的推文中存在多少个来自数组的字符串。匹配的字符串数越多,该推文与我所采取的一系列关键短语的关联性就越高。该推文是rdd而且里面只有文字。
答案 0 :(得分:0)
例如,您可以构建自己的余弦相似度方法
object CosineSimilarity{
def cosineSimilarity(x: Array[Double], y: Array[Double]): Double = {
require(x.size == y.size)
dotProduct(x, y)/(magnitude(x)*magnitude(y))
}
def dotProduct(x: Array[Double], y: Array[Double]): Double = {
(for((a, b)<-x zip y) yield a*b).sum
}
def magnitude(x: Array[Double]): Double = {
math.sqrt(x.map(i => i*i).sum)
}
}
假设您将关键字表示为Array(1.1,1.2,1.3,1.4,1.5)
,并将下一条推特表示为Array(1.1,1.2,1.2,1.5,1.6)
。这些非常相似:
scala> import CosineSimilarity._
import CosineSimilarity._
scala> cosineSimilarity(Array(1.1,1.2,1.3,1.4,1.5),Array(1.1,1.2,1.2,1.5,1.6))
res8: Double = 0.9984816648599194
我不确定您是否使用org.apache.spark.ml.feature.Word2Vec
将令牌转换为数字矢量,在这种情况下,您需要将输出转换为合适的方式才能使用上述方法(这很好如果您提供您所拥有的一些代码)