JAVA開源中文分詞器Ansj(依賴注入+調用方式+停詞器)

Java有11大開源中文分詞器,分別是word分詞器,Ansj分詞器,Stanford分詞器,FudanNLP分詞器,Jieba分詞器,Jcseg分詞器,MMSeg4j分詞器,IKAnalyzer分詞器,Paoding分詞器,smartcn分詞器,HanLP分詞器。

不同的分詞器有不同的用法,定義的接口也不一樣,至於效果哪個好,那要結合自己的應用場景自己來判斷。

這裏我就主要介紹Ansj中文分詞器,它是一個開源的 Java 中文分詞工具,基於中科院的 ictclas 中文分詞算法,比其他常用的開源分詞工具(如MMseg4j)的分詞準確率更高,目前實現了.中文分詞. 中文姓名識別 . 用戶自定義詞典,關鍵字提取,自動摘要,關鍵字標記等功能,適用於對分詞效果要求高的各種項目。

其Github地址爲https://github.com/NLPchina/ansj_seg,上面有較詳細的說明。

1.依賴注入
首先添加ansj的maven依賴(目前最高版本是5.1.6):

  <dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.6</version>
 </dependency>

注:訪問 https://oss.sonatype.org/content/repositories/releases/org/ansj/ansj_seg/ 可查看或下載最新版 ansj_seg/

2.調用方式
1.基本分詞-BaseAnalysis
基本就是保證了最基本的分詞.詞語顆粒度最非常小的,所涉及到的詞大約是10萬左右,
基本分詞速度非常快,在macAir上.能到每秒300w字每秒,同時準確率也很高.但是對於新詞他的功能十分有限。

簡單的示例代碼:

String ruiec = "騰訊公司的員工非常多,有40678個員工,老闆是馬化騰";
System.out.println("基本分詞:"+BaseAnalysis.parse(ruiec));

輸出的結果:
在這裏插入圖片描述

可以看到分詞後會在詞語的後邊加上對應詞語的詞性
如何不輸出詞性,僅輸出詞?
可以在後面加上.toStringWithOutNature()

String ruiec = "騰訊公司的員工非常多,有40678個員工,老闆是馬化騰";
System.out.println("基本分詞:"+BaseAnalysis.parse(ruiec).toStringWithOutNature());

輸出的結果:
在這裏插入圖片描述

可以看到現在後面的詞性沒有了,只輸出了詞

2.精準分詞-ToAnalysis
它在易用性,穩定性.準確性.以及分詞效率上.都取得了一個不錯的平衡。
如果你初次賞識Ansj如果你想開箱即用.那麼就用這個分詞方式是不會錯的。

簡單的示例代碼:

String ruiec = "騰訊公司的員工非常多,有40678個員工,老闆是馬化騰";
System.out.println("精準分詞:"+ToAnalysis.parse(ruiec).toStringWithOutNature());

輸出的結果:
在這裏插入圖片描述

3.nlp分詞-NlpAnalysis
nlp的適用方式:語法實體名抽取.未登錄詞整理.只要是對文本進行發現分析等工作

簡單的示例代碼:

String ruiec = "騰訊公司的員工非常多,有40678個員工,老闆是馬化騰";
System.out.println("nlp分詞:"+NlpAnalysis.parse(ruiec).toStringWithOutNature());

輸出結果:
在這裏插入圖片描述

4.面向索引的分詞-IndexAnalysis
面向索引的分詞,故名思議就是適合在lucene等文本檢索中用到的分詞。
主要考慮以下兩點:
召回率召回率是對分詞結果儘可能的涵蓋。比如對“上海虹橋機場南路” 召回結果是[上海/ns, 上海虹橋機場/nt, 虹橋/ns, 虹橋機場/nz, 機場/n, 南路/nr]

準確率其實這和召回本身是具有一定矛盾性的Ansj的強大之處是很巧妙的避開了這兩個的衝突 。比如我們常見的歧義句“旅遊和服務”->對於一般保證召回 。大家會給出的結果是“旅遊 和服 服務” 對於ansj不存在跨term的分詞。意思就是。召回的詞只是針對精準分詞之後的結果的一個細分。比較好的解決了這個問題

簡單的示例代碼:

String ruiec = "騰訊公司的員工非常多,有40678個員工,老闆是馬化騰";
System.out.println("面向索引的分詞:"+ IndexAnalysis.parse(ruiec).toStringWithOutNature());

輸出結果:
在這裏插入圖片描述

5.四種方式比較
把四種方式的輸出合起來對比
在這裏插入圖片描述
可以得到基本分詞最耗時,面向索引分詞速度最快,四種方式功能統計如下:
在這裏插入圖片描述

3.停詞器
停用詞需求是一種及其常見的需求,好處很多很多,令人驚訝的是壞處比好處還多,所以一般情況下不要用這個,比較耗費cpu

第一步實例化停用器:

簡單的示例代碼:

StopRecognition s = new StopRecognition();

第二步調用過濾:

如下面的三種形式的過濾(用精準分詞來舉例)

1.過濾詞性(insertStopNatures())
簡單的示例代碼:

String ruiec = "匯新雲公司的員工非常優秀,約有100名員工,請問大Boss是李伽慧嗎?";

//剔除標點符號(w)
s.insertStopNatures("w");
ToAnalysis.parse(ruiec).recognition(s).toStringWithOutNature().replaceAll(","," ");

輸出的結果:
在這裏插入圖片描述

從結果可以看到句中的問號已經被剔除了
2. 過濾單詞(insertStopWords())
簡單的示例代碼:

String ruiec = "匯新雲公司的員工非常優秀,約有100名員工,請問大Boss是李伽慧嗎?";
//剔除指定的分詞
s.insertStopWords("100名");
ToAnalysis.parse(ruiec).recognition(s).toStringWithOutNature().replaceAll(","," ");

輸出的結果:
在這裏插入圖片描述

從結果可以看到100名已經被剔除了

3.支持正則表達式(insertStopRegexes())
簡單的示例代碼:

String ruiec = "匯新雲公司的員工非常優秀,約有100名員工,請問大Boss是李伽慧嗎?";
s.insertStopRegexes("請.*?");
ToAnalysis.parse(ruiec).recognition(s).toStringWithOutNature().replaceAll(","," ");

輸出的結果:
在這裏插入圖片描述

從結果可以看到“請問”已經被剔除了

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