Spark:使用jieba分詞的工程搭建

1、IDEA開發環境中project structure的設置

配置項目的JDK:

File > Project Structure > Project Settings > Project > Project SDK

在複選框中選擇項目使用的JDK,如果之前沒有設置,點擊旁邊的new按鈕從本地目錄導入自己下載好的JDK。

2、Maven配置文件的設置

IDEA Maven倉庫:

Maven 倉庫有三種類型:

  • 本地(local):通常maven的本地倉庫在自己的用戶目錄下 .m2/respository。Maven 的本地倉庫,在安裝 Maven 後並不會創建,它是在第一次執行 maven 命令的時候才被創建。運行 Maven 的時候,Maven 所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嚐試從中央倉庫下載構件至本地倉庫,然後再使用本地倉庫的構件。如果中央倉庫沒有,如果設置了遠程倉庫,則嘗試從遠程倉庫獲取構件。
  • 中央(central):Maven 中央倉庫是由 Maven 社區提供的倉庫,其中包含了大量常用的庫。一般來說,簡單的Java項目依賴的構件都可以在這裏下載到。需要通過網絡才能訪問。
  • 遠程(remote):如果 Maven 在中央倉庫中也找不到依賴的文件,它會停止構建過程並輸出錯誤信息到控制檯。爲避免這種情況,Maven 提供了遠程倉庫的概念,它是開發人員自己定製倉庫,包含了所需要的代碼庫或者其他工程中用到的 jar 文件。

IDEA 項目的Maven本地倉庫也是在用戶主目錄/.m2/respository,不過.m2文件是隱藏的,如果想要看到隱藏文件,在文件查看器頁面使用ctrl+h即可看到隱藏文件了。

 在.m2/repository/org/apache/spark下就能找到我們引入的一系列org.apache.spark模塊下的包。

配置jieba需要的包jieba-anaylsis.jar:

在工程下創建的pom.xml文件中加入以下代碼引入jieba-anaylsis依賴:

# <dependencies>標籤內加入:
        <dependency>
            <groupId>com.huaban</groupId>
            <artifactId>jieba-analysis</artifactId>
            <version>1.0.2</version>
        </dependency>

加入代碼後Maven會自動幫你從中央倉庫/遠程倉庫中拉取jar到本地倉庫,使用時import即可。

3、程序中import語句導入分類詞庫

import org.apache.spark.sql.{DataFrame, SparkSession}//spark入口,DataFrame操作需要用到的包
import java.nio.file.{Path, Paths}//加入自定義詞庫時路徑需要的包
 
import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}//jieba分詞需要用到的包,其中WordDictionary爲加入自定義詞庫需要
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}//特徵向量提取需要用到的包
 
import scala.collection.mutable//java.util.List轉換成scala Aarray需要用到的包

4、分詞詞庫(包括自定義詞庫)的存放與引用

默認詞庫:

同樣的,在Maven本地庫.m2/repository裏在com/huaban文件夾裏可以找到jieba-analysis.jar。

打開jieba-analysis.jar,dict.txt即爲jieba的默認詞庫。

自定義詞庫:

jieba自定義詞庫的格式需要.txt文本文件,且每一行格式爲:詞 詞頻 詞性。(注意三個部分是由空格隔開的,除了“詞”其餘兩項允許是缺失的,但是如果想要自定義詞庫的優先級比默認詞庫高,就需要有詞頻(詞頻爲多少任意,哪怕爲1尚可))。

加入自定義詞庫:

import java.nio.file.{Path, Paths}
import com.huaban.analysis.jieba.{JiebaSegmenter, WordDictionary}
val path = Paths.get("/home/maples/phy.txt")
WordDictionary.getInstance().loadUserDict(path)

【注意】

Path.get()裏要爲自定義詞庫的絕對路徑,如果要轉換爲相對路徑的寫法,可以使用getCanonicalPath()函數或getAbsolutePath()函數將相對路徑轉換爲絕對路徑,不過這兩個函數的區別在於:

  • 對於getCanonicalPath()函數,“."就表示當前的文件夾,而”..“則表示當前文件夾的上一級文件夾。
  • 對於getAbsolutePath()函數,則不管”.”、“..”,返回當前的路徑加上你在new File()時設定的路徑。

詳細解讀可以參考:https://blog.csdn.net/u010261322/article/details/44219781

例如我寫的,new File()相對文件路徑是從工程文件夾根目錄開始的(WordCount文件夾):

val path = Paths.get(new File("phy.txt").getCanonicalPath())

然後再正常分詞(如果不加入自定義詞庫,直接使用以下代碼即可):

val jieba = new JiebaSegmenter()
val res:String = jieba.sentenceProcess(text).toString()//text是待分詞的文本字符串

 

5、jieba分詞的關鍵API調用

jieba分詞要首先初始化一個JiebaSegmenter對象:

val jieba = new JiebaSegmenter()

JiebaSegmenter對象下有兩個方法:process()sentenceProcess()

在這裏插入圖片描述

在這裏插入圖片描述

從IDEA上給出的函數參數可以看出,process()需要兩個參數(要進行分詞的String類型的文本(段落),切分模式mode(INDEX或SEARCH));要使用SegMode參數需要引入:import com.huaban.analysis.jieba.JiebaSegmenter.SegMode

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:長詞再切分,提高召回率。

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

6、基於jieba分詞的特徵向量提取

https://blog.csdn.net/LOG_IN_ME/article/details/103047796

 

 

 

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