Spark:Jieba對數據庫裏提取的記錄進行中文分詞

從數據庫裏讀取記錄

我們要創建一個DataFrame來存儲從數據庫裏讀取的表。
首先要創建Spark的入口–SparkSession對象。
需要引入的包:

import org.apache.spark.sql.SparkSession

在main函數裏:

val spark = SparkSession.builder().getOrCreate()//創建一個SparkSession對象

然後使用spark.read.format(“jdbc”)通過從mysql數據庫讀取的數據(讀取的是某個表,DataFrame也是一個類似於數據庫表的結構的數據結構):

val jdbcDF = spark.read.format("jdbc")
      .option("url","jdbc:mysql://picpic.55555.io:24691/recTest")
      .option("driver","com.mysql.jdbc.Driver")
      .option("dbtable","isbn_info")
      .option("user","rec")
      .option("password","cuclabcxg")
      .load()

可以查看一下該表的模式:

jdbcDF.printSchema()

在這裏插入圖片描述

Jieba進行中文分詞

IDEA中首先在Maven pom.xml中添加jieba所需依賴:

		<dependency>
            <groupId>com.huaban</groupId>
            <artifactId>jieba-analysis</artifactId>
            <version>1.0.2</version>
        </dependency>

在程序裏導入jieba包:

import com.huaban.analysis.jieba.JiebaSegmenter
import com.huaban.analysis.jieba.JiebaSegmenter.SegMode

在main裏,取出mysql表中數據,轉成String格式,然後再使用jieba分詞。

	val comment:String = jdbcDF.first()(6).toString()
    var jieba:String = new JiebaSegmenter().sentenceProcess(comment).toString()

上面代代碼就是取出comment字段爲String格式,然後使用jieba的sentenceProcess方法進行分詞。

全部代碼及結果

import org.apache.spark.sql.SparkSession
import com.huaban.analysis.jieba.JiebaSegmenter
import com.huaban.analysis.jieba.JiebaSegmenter.SegMode
object wordCut {
  def main(args: Array[String]): Unit = {
    //spark的入口
    val spark = SparkSession.builder().getOrCreate()//創建一個SparkSession對象

    //訪問數據庫,得到dataframe存儲表數據
    val jdbcDF = spark.read.format("jdbc")
      .option("url","jdbc:mysql://picpic.55555.io:24691/recTest")
      .option("driver","com.mysql.jdbc.Driver")
      .option("dbtable","isbn_info")
      .option("user","rec")
      .option("password","cuclabcxg")
      .load()

    //取出評論
    val comment:String = jdbcDF.first()(6).toString()
    var jieba:String = new JiebaSegmenter().sentenceProcess(comment).toString()
    print(jieba)
  }
}

在這裏插入圖片描述

Jieba分詞函數的探究

JiebaSegmenter對象下有兩個方法:process(),sentenceProcess()。
在這裏插入圖片描述
在這裏插入圖片描述
從IDEA上給出的函數參數可以看出,process()需要兩個參數(要進行分詞的String類型的文本(段落),切分模式mode(INDEX或SEARCH));sentenceProcess()只需要一個參數(要進行分詞的String類型的文本(句子))。
我上面使用的是sentenceProcess,結果是對的。那麼使用前者輸出結果會是什麼樣的呢?有什麼作用呢?下面就來測試一下:

	val str:String = "我來到北京清華大學。"

    var jieba0:String = new JiebaSegmenter().sentenceProcess(str).toString()
    println(jieba0)
    var jieba2:String = new JiebaSegmenter().process(str,SegMode.INDEX).toString()
    println(jieba2)
    var jieba3 = new JiebaSegmenter().process(str,SegMode.SEARCH).toString()
    println(jieba3)

在這裏插入圖片描述
在此可以發現:使用process()結果是列表套列表,裏面的每個小列表中元素依次是
[分好的詞, 分好的詞的第一個字符在文本字符數組的索引, 分好的詞的最後一個字符在文本字符數組的索引的下一個索引]

INDEX:精準的切開,用於對用戶查詢詞分詞;
SEARCH:長詞再切分,提高召回率。

(對這兩個模式的解釋翻遍全網,這個還算靠譜)

分詞的執行邏輯

在這裏插入圖片描述
可以看到核心在於:
1、內部包含一個字典
2、分詞邏輯
3、不同模式的切分粒度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章