SCALA подход. Обычно он должен работать и с 1 словом, а не без сбоев, cra sh. Используя не MLLIB, но скользя, вы получаете биграмм 1, который, конечно, спорен, с разбором предложения. как это:
val rdd = sc.parallelize(Array("Hello my Friend. How are",
"you today? bye my friend.",
"singleword"))
rdd.map{
// Split each line into substrings by periods
_.split('.').map{ substrings =>
// Trim substrings and then tokenize on spaces
substrings.trim.split(' ').map{_.replaceAll("""\W""", "").toLowerCase()}.
// Find bigrams, etc.
sliding(2)
}.
// Flatten, and map the ngrams to concatenated strings
flatMap{identity}.map{_.mkString(" ")}.
// Group the bigrams and count their frequency
groupBy{identity}.mapValues{_.size}
}.
// Reduce to get a global count, then collect.
flatMap{identity}.reduceByKey(_+_).collect.
// Print
foreach{x=> println(x._1 + ", " + x._2)}
Это не дает сбоя для "одиночного слова", но дает вам одно слово:
you today, 1
hello my, 1
singleword, 1
my friend, 2
how are, 1
bye my, 1
today bye, 1
Использование mllib и переход по строкам с этим вводом:
the quick brown fox.
singleword.
two words.
с использованием:
import org.apache.spark.mllib.rdd.RDDFunctions._
val wordsRdd = sc.textFile("/FileStore/tables/sliding.txt",1)
val wordsRDDTextSplit = wordsRdd.map(line => (line.trim.split(" "))).flatMap(x => x).map(x => (x.toLowerCase())).map(x => x.replaceAll(",{1,}","")).map(x => x.replaceAll("!{1,}",".")).map(x => x.replaceAll("\\?{1,}",".")).map(x => x.replaceAll("\\.{1,}",".")).map(x => x.replaceAll("\\W+",".")).filter(_ != ".").filter(_ != "")
.map(x => x.replace(".","")).sliding(2).collect
вы получаете:
wordsRDDTextSplit: Array[Array[String]] = Array(Array(the, quick), Array(quick, brown), Array(brown, fox), Array(fox, singleword), Array(singleword, two), Array(two, words))
Примечание. Я анализирую строки по-разному.
При выполнении вышеупомянутого только с одной строкой с 1 словом, тогда я получаю нулевой вывод.
wordsRDDTextSplit: Array[Array[String]] = Array()
Итак, вы видите, что вы можете обрабатывать строки или нет, et c.