3

Я прочитал, что могу использовать метод columnSimilarities, который поставляется с RowMatrix, чтобы найти сходство косинусов различных записей (на основе контента). Мои данные выглядит примерно так:Spark ml cosine сходство: как получить от 1 до n оценку подобия

genre,actor 
horror,mohanlal shobhana pranav 
comedy,mammooty suraj dulquer 
romance,fahad dileep manju 
comedy,prithviraj 

Теперь, я создал искровым мл трубопровода для расчета Tf-IDF указанных выше текстовых объектов (жанр, актер) и использует VectorAssembler в моем трубопроводе, чтобы собрать как функции в один столбец «функции». После этого я конвертировать мой полученный DataFrame с помощью этого:

val vectorRdd = finalDF.map(row => row.getAs[Vector]("features")) 

, чтобы превратить его в RDD[Vector]

Тогда я получаю мой RowMatrix по

val matrix = new RowMatrix(vectorRdd) 

Я следую this руководства для ссылки к подобию косинуса и тому, что мне нужно, - это метод в spark-mllib, чтобы найти сходство между конкретной записью и всеми остальными, например, this метод в sklearn, так как s в руководстве:

cosine_similarity(tfidf_matrix[0:1], tfidf_matrix) 

Но, я не могу найти, как это сделать. Я не понимаю, что сравнивает и возвращает matrix.columnSimilarities(). Может кто-нибудь помочь мне с тем, что я ищу?

Любая помощь приветствуется! Благодарю.

ответ

0

Я сам вычислил его с помощью двух небольших функций. Call cosine. Сходство по crossJoin из 2-х фреймов данных (отдельная 1-я строка и другие по 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) 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^