NGram на наборе данных с одним словом - PullRequest
0 голосов
/ 25 февраля 2020

Я работаю над SparkML, пытаясь создать нечеткое совпадение, используя возможности Spark OOB. Попутно я строю NGrams с n = 2. Однако некоторые строки в моем наборе данных содержат отдельные слова, в которых происходит сбой конвейера Spark. Независимо от Spark, интересно, каков будет общий подход к этой проблеме. ie. что если токены

1 Ответ

0 голосов
/ 25 февраля 2020

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.

...