Tokenizer分詞
進行文本分析前,對文本中句子進行分詞我們處理的第一步。大家都是Spark的機器學習庫分為基於RDD和基於DataFrame的庫,由於基於RDD的庫在Spark2.0以後都處於維護狀態,我們這裏講的分詞就是基於Spark的Dataframe的。主要是講解兩個類Tokenizer和RegexTokenizer的使用。
1 首先準備數據
導包
import org.apache.spark.ml.feature.{RegexTokenizer, Tokenizer}
import org.apache.spark.sql.functions._
準數據
val sentenceDataFrame = spark.createDataFrame(Seq(
(0, "Hi I heard about Spark"),
(1, "I wish Java could use case classes"),
(2, "Logistic,regression,models,are,neat")
)).toDF("id", "sentence")
2 Tokenizer
Tokenizer負責讀取文檔或者句子,將其分解為單詞。聲明一個變量
val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
自定義函數來獲取每列單詞數目
val countTokens = udf { (words: Seq[String]) => words.length }
調用轉換函數
val tokenized = tokenizer.transform(sentenceDataFrame)
tokenized.select("sentence", "words").withColumn("tokens", countTokens(col("words"))).show(false)
3 RegexTokenizer
RegexTokenizer允許基於正則的方式進行文檔切分成單詞組。默認情況下,使用參數“pattern”( regex, default: "\s+")作為分隔符來分割輸入文本。或者,用户可以將參數“gaps”設置為false,指示正則表達式“pattern”表示“tokens”,而不是分割間隙,並查找所有匹配事件作為切分後的結果。
val regexTokenizer = new RegexTokenizer().setInputCol("sentence").setOutputCol("words").setPattern("\W")
// 也可換為 .setPattern("\w+").setGaps(false)開始轉換並查看執行結果
val regexTokenized = regexTokenizer.transform(sentenceDataFrame)
regexTokenized.select("sentence", "words").withColumn("tokens", countTokens(col("words"))).show(false)