Вы можете создать свой собственный метод сходства косинусов, например,
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
для преобразования ваших токенов в числовые векторы, в этом случае вам нужно преобразовать выходные данные подходящим образом, чтобыиспользуйте метод выше (было бы хорошо, если бы вы предоставили некоторый код того, что у вас есть)