1. 程式人生 > >Scala使用Ansj分詞

Scala使用Ansj分詞

導包

    <!-- https://mvnrepository.com/artifact/org.ansj/ansj_seg -->
    <dependency>
      <groupId>org.ansj</groupId>
      <artifactId>ansj_seg</artifactId>
      <version>5.1.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.nlpcn/nlp-lang -->
    <dependency>
      <groupId>org.nlpcn</groupId>
      <artifactId>nlp-lang</artifactId>
      <version>1.7.7</version>
    </dependency>

基本使用

ansj分詞有四種模式:

基本分詞-BaseAnalysis

使用者自定義詞典 數字識別 人名識別 機構名識別 新詞發現
Χ Χ Χ Χ

精準分詞-ToAnalysis

使用者自定義詞典 數字識別 人名識別 機構名識別 新詞發現
Χ Χ

nlp分詞-NlpAnalysis

使用者自定義詞典 數字識別 人名識別 機構名識別 新詞發現

面向索引分詞-IndexAnalysis

使用者自定義詞典 數字識別 人名識別 機構名識別 新詞發現
Χ Χ

精準分詞是店長推薦款,如果想馬上上手使用,推薦用精準分詞的方式:

val str = "這是一個詐騙簡訊,恭喜您中獎啦!http://regxlib.com/Default.aspx"
val result = ToAnalysis.parse(str)
println(result)

 顯示結果:

這/r,是/v,一個/m,詐騙/vn,簡訊/n,,/w,恭喜/v,您/r,中獎/v,啦/y,!/w

過濾詞

使用者還可以通過建立StopRecognition()來進行過濾,例如:

val filter = new StopRecognition()
filter.insertStopNatures("w",null) //過濾掉標點和null

使用者自定義詞庫

    自定義詞庫的好處就是可以按照你自己的方式定義詞,例如“這是一個詐騙簡訊”裡的“這是”,按照ansj原來的分詞方式,會將“這是”分為:這/r,是/v,你可以將“這是”認定為一個詞,並且可以自定義這個詞的屬性,豈不是美滋滋?

1.在resource目錄下,建立library目錄,建立userLibrary.dic檔案:

2.在檔案中寫入內容:

這是    	r    1000

 注意:中間分割付一定是\t

3.程式碼:

import org.nlpcn.commons.lang.tire.library.Library
    val forest = Library.makeForest(classOf[Nothing].getResourceAsStream("/library/userLibrary.dic")) //載入字典檔案
    val filter = new StopRecognition()
    filter.insertStopNatures("w") //過濾掉標點
    val str = "這是一個詐騙簡訊,恭喜您中獎啦!"
    val result = ToAnalysis.parse(str,forest)
      .recognition(filter)// 過濾掉標點
      .toStringWithOutNature(",")// 分詞預設會打出詞性,此語句用於不打出詞性,並且分好的詞用“,”隔開
    println(result)

結果:

這是,一個,詐騙,簡訊,恭喜,您,中獎,啦