您好,登錄后才能下訂單哦!
這篇文章主要講解了“基于java的中文分詞工具ANSJ怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“基于java的中文分詞工具ANSJ怎么使用”吧!
ANSJ
這是一個基于n-Gram+CRF+HMM的中文分詞的java實現.
分詞速度達到每秒鐘大約200萬字左右(mac air下測試),準確率能達到96%以上
目前實現了.中文分詞. 中文姓名識別 . 用戶自定義詞典,關鍵字提取,自動摘要,關鍵字標記等功能
可以應用到自然語言處理等方面,適用于對分詞效果要求高的各種項目.
分詞的目的是創建一個高穩定可用的中文分詞工具,可以利用到各種需要文字處理的場景中下面簡單介紹一下Ansj中文分詞的主要算法及特點.
數據結構
高度優化Trie樹
在用戶自定義詞典以及各種類似于Map的場景中,大量使用的一個工具,眾所周知,Trie具有高速的文本掃描能力,和較低的內存占用率,是最好的AC機之一,弦外之音,在我的認知范圍內,貌似沒有之一.相比其它結構在性能和構造上做到了很好的平衡,但是在java中,大量構建map尤其是hashmap,是一個非常昂貴的操作,通過對于一個map放入大量的key也注定其在自動拆箱裝箱,以及解決沖突,大量hash匹配上做了過多的小消耗,雖然多數人認為,這種消耗屬于納秒級別的,但是對于動不動就上GB的文本來說,這個消耗是不可忽略的,所以作者在這里使用了首字母hash次字二分的方式來避免過多的消耗內存,也正應為有了這個機制.可以保證Ansj加載更多的用戶自定義詞典,有人問我具體的數字.大約500萬詞,1Gde 內存.在這里作者強烈推薦這個小家伙,你可以通過nlp-lang包來獲取這個小工具,居家神器.
三數組trie樹
三數組trie樹,好吧我知道你們會吐槽我明明用的DAT(Double Array Tree),為什么在這里改成了TAT(Tree Array Tree)。我也不想如此,但是為了嚴謹一些真實的還原算法,的確是用了三個數組來實現的DAT的,主要是為了在判斷詞語之后避免一次無謂的倒退,算是空間換取時間的一個策略吧,具體感興趣的可以參見nlp-lang中DAT的創建。對于DAT算法,個人覺得。如非必要,勿用,其在構造和修改上具有很多不確定性,不符合簡單可依賴的理念,有興趣的人可以了解下。在我小時候的博客中寫了幾篇關于DAT的文章,雖然很水。據說也有幾個人看明白了。
機器學習
隱馬爾科夫 語言模型 最短路徑 ansj中和ngram一起使用.通過兩個詞語之間的關聯來確定,用來做語義消歧.
TF/IDF 詞袋模型 關鍵詞抽取中用到.用來確定一個詞的重要程度.同時利用關鍵詞對文章進行自動摘要
CRF 類似CRF的上下文基于詞的標注 用來實現新詞發現功能,同時新詞發現也服務于關鍵詞抽取
ToAnalysis 精準分詞
精準分詞是Ansj分詞的***店長推薦款***
它在易用性,穩定性.準確性.以及分詞效率上.都取得了一個不錯的平衡.如果你初次嘗試Ansj如果你想開箱即用.那么就用這個分詞方式是不會錯的.
DicAnalysis 用戶自定義詞典優先策略的分詞
用戶自定義詞典優先策略的分詞,如果你的用戶自定義詞典足夠好,或者你的需求對用戶自定義詞典的要求比較高,那么強烈建議你使用DicAnalysis的分詞方式.
可以說在很多方面Dic優于ToAnalysis的結果
NlpAnalysis 帶有新詞發現功能的分詞
nlp分詞是總能給你驚喜的一種分詞方式.
它可以識別出未登錄詞.但是它也有它的缺點.速度比較慢.穩定性差.ps:我這里說的慢僅僅是和自己的其他方式比較.應該是40w字每秒的速度吧.
個人覺得nlp的適用方式.1.語法實體名抽取.未登錄詞整理.主要是對文本進行發現分析等工作
IndexAnalysis 面向索引的分詞
面向索引的分詞。顧名思義就是適合在lucene等文本檢索中用到的分詞。 主要考慮以下兩點
召回率 * 召回率是對分詞結果盡可能的涵蓋。比如對“上海虹橋機場南路” 召回結果是[上海/ns, 上海虹橋機場/nt, 虹橋/ns, 虹橋機場/nz, 機場/n, 南路/nr]
準確率 * 其實這和召回本身是具有一定矛盾性的Ansj的強大之處是很巧妙的避開了這兩個的沖突 。比如我們常見的歧義句“旅游和服務”->對于一般保證召回 。大家會給出的結果是“旅游 和服 服務” 對于ansj不存在跨term的分詞。意思就是。召回的詞只是針對精準分詞之后的結果的一個細分。比較好的解決了這個問題
BaseAnalysis 最小顆粒度的分詞
基本就是保證了最基本的分詞.詞語***顆粒度最非常小***的..所涉及到的詞大約是***10萬***左右.
基本分詞速度非常快.在macAir上.能到每秒300w字每秒.同時準確率也很高.但是對于新詞他的功能十分有限.
功能統計
String str = "潔面儀配合潔面深層清潔毛孔 清潔鼻孔面膜碎覺使勁擠才能出一點點皺紋 臉頰毛孔修復的看不見啦 草莓鼻歷史遺留問題沒轍 臉和脖子差不多顏色的皮膚才是健康的 長期使用安全健康的比同齡人顯小五到十歲 28歲的妹子看看你們的魚尾紋" ;
System.out.println(BaseAnalysis.parse(str));
潔/ag,面/q,儀/k,配合/v,潔/ag,面/q,深層/b,清潔/a,毛孔/n, ,清潔/a,鼻孔/n,面膜/n,碎/a,覺/v,使勁/v,擠/v,才能/v,出/v,一/m,點點/v,皺紋/n, ,臉頰/n,毛孔/n,修復/v,的/u,看/v,不見/v,啦/y, ,草莓/n,鼻/ng,歷史/n,遺留/vn,問題/n,沒轍/v, ,臉/n,和/c,脖子/n,差不多/l,顏色/n,的/u,皮膚/n,才/d,是/v,健康/a,的/u, ,長期/d,使用/v,安全/an,健康/a,的/u,比/p,同齡人/n,顯/v,小/a,五/m,到/v,十/m,歲/q, ,28/m,歲/q,的/u,妹子/n,看看/v,你們/r,的/u,魚尾紋/n
System.out.println(ToAnalysis.parse(str));
潔/ag,面/q,儀/k,配合/v,潔/ag,面/q,深層/b,清潔/a,毛孔/n, ,清潔/a,鼻孔/n,面膜/n,碎/a,覺/v,使勁/v,擠/v,才能/v,出/v,一/m,點點/v,皺紋/n, ,臉頰/n,毛孔/n,修復/v,的/u,看/v,不見/v,啦/y, ,草莓/n,鼻/ng,歷史/n,遺留/vn,問題/n,沒轍/v, ,臉/n,和/c,脖子/n,差不多/l,顏色/n,的/u,皮膚/n,才/d,是/v,健康/a,的/u, ,長期/d,使用/v,安全/an,健康/a,的/u,比/p,同齡人/n,顯/v,小/a,五/m,到/v,十歲/mq, ,28歲/mq,的/u,妹子/n,看看/v,你們/r,的/u,魚尾紋/n
System.out.println(DicAnalysis.parse(str));
潔/ag,面/q,儀/k,配合/v,潔/ag,面/q,深層/b,清潔/a,毛孔/n, ,清潔/a,鼻孔/n,面膜/n,碎/a,覺/v,使勁/v,擠/v,才能/v,出/v,一/m,點點/v,皺紋/n, ,臉頰/n,毛孔/n,修復/v,的/u,看/v,不見/v,啦/y, ,草莓/n,鼻/ng,歷史/n,遺留/vn,問題/n,沒轍/v, ,臉/n,和/c,脖子/n,差不多/l,顏色/n,的/u,皮膚/n,才/d,是/v,健康/a,的/u, ,長期/d,使用/v,安全/an,健康/a,的/u,比/p,同齡人/n,顯/v,小/a,五/m,到/v,十歲/mq, ,28歲/mq,的/u,妹子/n,看看/v,你們/r,的/u,魚尾紋/n
System.out.println(IndexAnalysis.parse(str));
潔/ag,面/q,儀/k,配合/v,潔/ag,面/q,深層/b,清潔/a,毛孔/n, ,清潔/a,鼻孔/n,面膜/n,碎/a,覺/v,使勁/v,擠/v,才能/v,出/v,一/m,點點/v,皺紋/n, ,臉頰/n,毛孔/n,修復/v,的/u,看/v,不見/v,啦/y, ,草莓/n,鼻/ng,歷史/n,遺留/vn,問題/n,沒轍/v, ,臉/n,和/c,脖子/n,差不多/l,顏色/n,的/u,皮膚/n,才/d,是/v,健康/a,的/u, ,長期/d,使用/v,安全/an,健康/a,的/u,比/p,同齡人/n,顯/v,小/a,五/m,到/v,十歲/mq, ,28歲/mq,的/u,妹子/n,看看/v,你們/r,的/u,魚尾紋/n
System.out.println(NlpAnalysis.parse(str));
潔/ag,面儀/nw,配合/v,潔面/nw,深層/b,清潔/a,毛孔/n, ,清潔/a,鼻孔/n,面膜/n,碎覺/nw,使勁/v,擠/v,才/d,能/v,出/v,一點點/nw,皺紋/n, ,臉頰/n,毛孔/n,修復/v,的/u,看/v,不/d,見/v,啦/y, ,草莓/n,鼻歷史/nw,遺留/vn,問題/n,沒轍/v, ,臉/n,和/c,脖子/n,差不多/l,顏色/n,的/u,皮膚/n,才/d,是/v,健康/a,的/u, ,長期/d,使用/v,安全/an,健康/a,的/u,比/p,同齡人/n,顯/v,小/a,五/m,到/v,十歲/mq, ,28歲/mq,的/u,妹子/n,看看/v,你們/r,的/u,魚尾紋/n
停用詞過濾
停用詞需求是一種及其常見的需求,好處很多很多,令人驚訝的是壞處比好處還多,所以一般情況下不要用這個破玩意.我覺得主要是古時候,計算能力有限,大家不想對于無畏的字符串,計算太多,放給處女座程序員,一般覺得,tmd有個家伙沒用一直在耗費我的cpu,刪了丫的,好吧,我真不是處女座黑.反正這個功能也得有,并且已經將這個功能移位了.調用如下.
1.實例化一個過濾器
StopRecognition filter = new StopRecognition();
filter.insertStopNatures("uj"); //過濾詞性
filter.insertStopNatures("ul");
filter.insertStopNatures("null");
filter.insertStopWords("我"); //過濾單詞
filter.insertStopRegexes("小.*?"); //支持正則表達式
調用過濾
Result modifResult = ToAnalysis.parse(str).recognition(fitler); //過濾分詞結果
測試例子
String str = "歡迎使用ansj_seg,(ansj中文分詞)在這里如果你遇到什
么問題都可以聯系我.我一定盡我所能.幫助大家.ansj_seg更快,更準,更自由!" ;
StopRecognition filter = new StopRecognition();
filter.insertStopWords("我"); //過濾單詞
filter.insertStopWords("你");
filter.insertStopWords("的");
filter.insertStopWords(")");
filter.insertStopWords("(");
System.out.println(ToAnalysis.parse(str).recognition(filter));
System.out.println(ToAnalysis.parse(str).recognition(filter));
歡迎/v,使用/v,ansj/en,_,seg/en,,/w,ansj/en,中文/nz,分詞/v,在/p,這里/r,如果/c,遇到/v,什么/r,問題/n,都/d,可以/v,聯系/v,./w,一定/d,盡/v,所能/v,./w,幫助/v,大家/r,./w,ansj/en,_,seg/en,更快/d,,/w,更/d,準/a,,/w,更/d,自由/a,!/w
歡迎/v,使用/v,ansj/en,_,seg/en,,/w,ansj/en,中文/nz,分詞/v,在/p,這里/r,如果/c,遇到/v,什么/r,問題/n,都/d,可以/v,聯系/v,./w,一定/d,盡/v,所能/v,./w,幫助/v,大家/r,./w,ansj/en,_,seg/en,更快/d,,/w,更/d,準/a,,/w,更/d,自由/a,!/w
感謝各位的閱讀,以上就是“基于java的中文分詞工具ANSJ怎么使用”的內容了,經過本文的學習后,相信大家對基于java的中文分詞工具ANSJ怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。