Искра - наиболее частое слово, следующее за данным словом - PullRequest
0 голосов
/ 29 апреля 2018

Я изучаю Scala и пытаюсь выяснить, как создать программу MapReduce в Scala, чтобы найти для каждого слова в файле, какое слово следует за ним больше всего. это то, что у меня есть. это работает, но я на самом деле хочу использовать уменьшение карты, и я пытаюсь найти способы максимально сократить циклы

 //initialize the list with first two words
  val list = scala.collection.mutable.MutableList((words.collect()(0), 
    words.collect()(1)));

   for (x <- 1 to (words.collect().length - 2)) {
  // add element into the list
  list += ((words.collect()(x), words.collect()(x + 1)))
   }
val rdd1 = spark.parallelize(list)

val rdd2 = rdd1.map(word => (word, 1)) // ex: key is (basketball,is)  value is 1

val counter = rdd2.reduceByKey((x, y) => x + y).sortBy(_._2, false) // sort in dec

val result2 = counter.collect();

print("the most frequent follower for basketball, the, and competitive \n")

println(" ")

// calls the function

findFreq("basketball", result2)

findFreq("the", result2)

findFreq("competitive", result2)

  }

 // method to find the most frequent follower for the specific word
   def findFreq(str: String, RDD: Array[((String, String), (Int))]): Unit = 
{

var max = -1;

for (x <- RDD) {
  }

  // display the results
  if (x._1._1.equals(str) && x._2 == max) {
    println("\"" + x._1._1 + "\"" + " is followed by " + "\"" + x._1._2 + "\"" + " " + x._2 + " times.\n")
     }
   }
  }
}

1 Ответ

0 голосов
/ 29 апреля 2018

Учитывая массив слов (как СДР), вы можете получить наиболее частое слово, которое следует за данным word в нескольких преобразованиях:

Шаг 1 : СДР пар слов с использованием скользящего (2)

  .sliding(2)

Шаг 2 : пара-СДР с ключом (word, w2), затем reduceByKey для подсчета вхождений пар слов данной word

  .collect{ case Array(`word`, w2) => ((word, w2), 1) }
  .reduceByKey( _ + _ )

Шаг 3 : пара-СДР с ключом word, затем reduceByKey для захвата пар слов с максимальным количеством

  .map{ case ((`word`, w2), c) => (word, (w2, c)) }
  .reduceByKey( (acc, x) => if (x._2 > acc._2) (x._1, x._2) else acc )

Объединение всего с преобразованиями, заключенными в методе:

import org.apache.spark.sql.functions._
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.rdd.RDDFunctions._

// load a RDD of words from the text file
val rdd = sc.textFile("/path/to/basketball.txt")
  .flatMap( _.split("""[\s,.;:!?]+""") )
  .map( _.toLowerCase )

def mostFreq(word: String, rdd: RDD[String]): RDD[(String, (String, Int))] =
  rdd
    .sliding(2)
    .collect{ case Array(`word`, w2) => ((word, w2), 1) }
    .reduceByKey( _ + _ )
    .map{ case ((`word`, w2), c) => (word, (w2, c)) }
    .reduceByKey( (acc, x) => if (x._2 > acc._2) (x._1, x._2) else acc )

Показать наиболее частое слово, которое следует за данным word:

mostFreq("basketball", rdd).foreach{ case (word, (w2, c)) =>
  println(s"'$word' is followed most frequently by '$w2' for $c times. ")
}
// 'basketball' is followed most frequently by 'leagues' for 2 times. 

Пример текстового файла: /path/to/basketball.txt (содержимое Википедия ):

Баскетбол - один из самых популярных и популярных в мире. спортивный. Национальная баскетбольная ассоциация (НБА) является одной из самых значительные профессиональные баскетбольные лиги в мире с точки зрения популярность, зарплаты, талант и уровень конкуренции. Вне севера Америка, лучшие клубы из национальных баскетбольных лиг имеют право на континентальные чемпионаты, такие как Евролига и ФИБА-Америка Лига. Чемпионат мира по баскетболу и мужской олимпийский баскетбол Турниры являются основными международными событиями спорта и привлекают лучшие сборные со всего мира.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...