Есть ли какой-нибудь встроенный метод, чтобы найти оценку сходства между двумя текстовыми файлами в apache spark scala - PullRequest
0 голосов
/ 04 октября 2018

Я хочу посмотреть, насколько релевантен входящий твит для моей тестовой статьи. У меня есть набор ключевых фраз в массиве строк, извлеченном из тестовой статьи. Я хочу найти оценку сходства между этим массивом строк и входящим твитом (sparkпотоковое), чтобы я мог получить некоторые соответствующие твиты для рассматриваемых ключевых слов. Пожалуйста, помогите мне найти сходство ....

У меня есть массив строк str [a, b, c, ....]У меня есть входящий твит, и мне нужно знать, сколько строк из массива присутствует во входящем твите. Чем больше совпадают строки no.of, тем более релевантным является твит для моей взятой строки ключевых фраз. Твит - это rddи в нем только текст.

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете создать свой собственный метод сходства косинусов, например,

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

...