一个n-gram是一个包含n
个tokens
(如词)的序列。NGram
可以将输入特征 转换为n-grams
。
NGram
输入一系列的序列,参数n
用来决定每个n-gram
的词个数。输出包含一个n-grams
序列,每个n-gram
表示一个划定空间的连续词序列。 如果输入序列包含的词少于n
,将不会有输出。
N-Gram认为语言中每个单词只与其前面长度 N-1 的上下文有关。主要分为bigram和trigram,bigram假设下一个词的出现依赖它前面的一个词,trigram假设下一个词的出现依赖它前面的两个词。在SparkML中用NGram类实现,setN(2)为bigram,setN(3)为trigram。
// $example on$ import org.apache.spark.SparkConf import org.apache.spark.ml.feature.NGram // $example off$ import org.apache.spark.sql.SparkSession /** * N-Gram认为语言中每个单词只与其前面长度 N-1 的上下文有关。主要分为bigram和trigram, * bigram假设下一个词的出现依赖它前面的一个词,trigram假设下一个词的出现依赖它前面的两个词。 * 在SparkML中用NGram类实现,setN(2)为bigram,setN(3)为trigram。 */ object NGramExample { def main(args: Array[String]): Unit = { val sparkConf = new SparkConf(); sparkConf.setMaster("local[*]").setAppName(this.getClass.getSimpleName) val spark = SparkSession .builder .config(sparkConf) .appName("NGramExample") .getOrCreate() // $example on$ val wordDataFrame = spark.createDataFrame(Seq( (0, Array("Hi", "I", "heard", "about", "Spark")), (1, Array("I", "wish", "Java", "could", "use", "case", "classes")), (2, Array("Logistic", "regression", "models", "are", "neat")) )).toDF("id", "words") val ngram = new NGram().setN(2).setInputCol("words").setOutputCol("ngrams") val ngramDataFrame = ngram.transform(wordDataFrame) ngramDataFrame.select("ngrams").show(false) // $example off$ spark.stop() } }
输出结果:
+——————————————————————+
|ngrams |
+——————————————————————+
|[Hi I, I heard, heard about, about Spark] |
|[I wish, wish Java, Java could, could use, use case, case classes]|
|[Logistic regression, regression models, models are, are neat] |
+——————————————————————+