版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、IKAnalyzer 版本Jar包下載IKAn alyzer3.2.8_b in下載地址:http:/code.google.eom/p/ik-a nalyzer/dow nl oads/detail ?n ame=IKA nalyzer3.2.8%20bin. zip&can=2&q=陰礙E工am共拿新理文件夫 Tiffin (G).“新(D:j7新h聘(ejj 新怖巻(FJME (GJ二DVD RW呃刃 盤eD-ROM盟沏二 Ml 2rrdoc3J.s8extstopword.di圜TKAnalyzer3,2-8- 伽TKAnalyeiP 立5*a*V32.Eft 用手冊” P出下載后包含
2、說明及API文檔(在目錄 doc3.2.8 中)。源碼下載http:/eode.google.eom/p/ik-a nalyzer/dow nl oads/detail ?n ame=IKA nalyzer3.2.8%20so urce.zip&can=2&q=苕畫tXJT山rl邑,曰疋乂壯炭山nTKAnalyzer3,2.S sourc.Index of /pub/scftware/,/zerLAikiIssuesSdurcE Export to GitHub for1.1 MBWhst this?rzor3.2.8 源碼starred this downloadSearchIKSegmen
3、tation 淺析(純 IK 分詞)IKSegmentation 是IK中獨(dú)立的分詞器,和lucene沒有關(guān)系。不繼承,不擴(kuò)展,不使用lucene 相關(guān)的類。IK主分詞器構(gòu)造函數(shù)* IK主分詞器構(gòu)造函數(shù)* paraminput* paramisMaxWordLength當(dāng)為true時(shí),分詞器進(jìn)行最大詞長切分*/public IKSegme ntati on( Reader in put , boolea n isMaxWordLe ngth) this .in put = in put ;segmentBuff = new char BUFF_SIZEcon text = n ewC on t
4、ext( segme ntBuff , isMaxWordLe ngth); segme nters = Con figurati on.loadSegme nter();Reader in put是一個(gè)輸入流,用于讀取文件內(nèi)容。IKSegmentation的構(gòu)造器,作了 3個(gè)事1、new Con text( segme ntBuff , isMaxWordLe ngth)創(chuàng)建上下文對(duì)象 Con text con text = n ewC on text( segme ntBuff , isMaxWordLe ngth);Con tex主要是存儲(chǔ)分詞結(jié)果集和記錄分詞處理的游標(biāo)位置。2、Conf
5、iguration. loadSegmenter ()加載詞典、創(chuàng)建分詞器/*Configuration. loadSegmenter()方法實(shí)現(xiàn)在加載詞典,創(chuàng)建分詞器詳情如下。初始化子分詞器實(shí)現(xiàn)(目前暫時(shí)不考慮配置擴(kuò)展)return List vISegmenter*/public static List loadSegme nter()/初始化詞典單例,如果查看get In sta nee ()發(fā)現(xiàn)里面有詳細(xì)的初始 化詞典的相關(guān)方法Dicti on ary. getl nsta nee ();List segme nters = n ewArrayList(4);/處理數(shù)量詞的子分詞器se
6、gmenters.add( newQuantifierSegmenter();/處理中文詞的子分詞器segmenters.add( newCJKSegmenter();/處理字母的子分詞器segmenters.add( newLetterSegmenter();return segme nters;得至U Lexeme這是IK分詞器的語義單元對(duì)象,相當(dāng)于Lucene中的Token詞元對(duì)象。由于3.0版本被設(shè)計(jì)為獨(dú)立于Lucene的Java分詞器實(shí)現(xiàn),因此它需要Lexeme來代表分詞的結(jié)果。調(diào)用的next()方法,會(huì)返回Lexeme對(duì)象,如果沒有下一個(gè)分詞結(jié)果,會(huì)返回null。源碼如下/*獲取下
7、一個(gè)語義單元* return沒有更多的詞元,則返回null* throws IOException*/public synchronized Lexeme next()throws IOException if (context .getResultSize() = 0)/*從reader中讀取數(shù)據(jù),填充 buffer*如果reader是分次讀入buffer的,那么buffer要進(jìn)行移位處理*移位處理上次讀入的但未處理的數(shù)據(jù)*/ int available = fillBuffer( in put );if (available = 0)con text .resetCo ntext(); r
8、eturn null ; else /分詞處理int an alyzedLe ngth = 0;for (int buffIndex = 0 ; buffIndex available ;buffI ndex +)/移動(dòng)緩沖區(qū)指針con text .setCursor( buffI ndex );/進(jìn)行字符規(guī)格化(全角轉(zhuǎn)半角,大寫轉(zhuǎn)小寫處理)segmentBuff buffIndex = CharacterHelper. regularize (segmentBuffbuffindex );/遍歷子分詞器for (ISegmenter segmenter : segmenters)segme
9、nter. nextLexeme( segme ntBuff , con text );an alyzedLe ngth +;/*滿足一下條件時(shí),* l.available = BUFF_SIZE 表示 buffer 滿載* 2.buffIndex available-BUFF_EXHAUST_CRITICAL示當(dāng)前指針處于臨界區(qū)內(nèi)* 3.!context.isBufferLocked()表示沒有 segmenter 在占用 buffer*要中斷當(dāng)前循環(huán)(buffer要進(jìn)行移位,并再讀取數(shù)據(jù)的 操作)*/ if (available = BUFF_SIZE& buffIndex availab
10、le - BUFF_EXHAUST_CRITICAL& ! con text .isBufferLocked()break;for (ISegmenter segmenter : segmenters)segme nter.reset();/System.out.pri ntln( available + : + buffi ndex);/記錄最近一次分析的字符長度con text .setLastA nalyzed(an alyzedLe ngth );/同時(shí)累計(jì)已分析的字符長度con text .setBuffOffset(con text .getBuffOffset() +analyz
11、edLength );/如果使用最大切分,則過濾交疊的短詞元if (context .isMaxWordLength()con text .excludeOverlap();/讀取詞元池中的詞元return buildLexeme( con text .firstLexeme(); else /讀取詞元池中的已有詞元return buildLexeme( con text .firstLexeme();Lexeme說明public int getBegi nPositi on()說明:獲取詫義單元的起始字符在文本中的位置返回值:int ,詫義單元相對(duì)于文本的絕對(duì)起始位置public int g
12、etE ndPositi on()說明:獲取詫義單元的結(jié)束字符的下一個(gè)位置返回值:int ,詫義單元相對(duì)于文本的絕對(duì)終止位置的下一個(gè)字符位置public int getLe ngth()說明:獲取詫義單元包含字符串的長度返回值:int ,詫義單元長度=getEndPosition- getBeginPositionpublic Stri ng getLexemeText()說明:獲取詫義單元包含字符串內(nèi)容返回值:String ,詫義單元的實(shí)際內(nèi)容,即分詞的結(jié)果完整代碼示例private static void IKFenCi()FileInputStream fis;try fis = new
13、 FileI nputStream( F:tmp1234.txt);InputStreamReader isr=new InputStreamReader(fis, UTF-8);BufferedReader br =new BufferedReader(isr);IKSegme ntati on ik =new IKSegme ntati on(br,true);Lexeme lex =null ;while (lex=ik.next()!=null )System.out .pr intln (lex.getLexemeText()+| LexemeType=+lex.getLexemeT
14、ype() +| TYPE_CJK_NORMAL= +lex. TYPE_CJK_NORMAL catch (FileNotFoundException e) / TOD8uto-ge nerated catch blocke.pri ntStackTrace(); catch (UnsupportedEncodingException e) / TOD8uto-ge nerated catch blocke.pri ntStackTrace(); catch (IOException e) / TODOuto-ge nerated catch blocke.pri ntStackTrace(
15、);Lucene 使用 IKAnalyzer 分詞實(shí)例化IKAnalyzer分詞器代碼Analyzer analyzer =new IKAnalyzer(true );代碼剖析Analyzer 類是 lucene 的一個(gè)類 org.apache.lucene.analysis.Analyzer, IKAnalyzer類繼 承此類 (public final class IKAnalyzer extends Analyzer ) 并覆蓋了 tokenStream 方法。IKAn alyzer構(gòu)造方法說明它有一個(gè)構(gòu)造方法接收一個(gè)參數(shù)isMaxWordLength,這個(gè)參數(shù)是標(biāo)識(shí)IK是否采用最大詞長
16、分詞,還是采用最細(xì)粒度切分兩種分詞算法。實(shí)際兩種算法的實(shí)現(xiàn),最大詞長切分是對(duì)最細(xì) 粒度切分的一種后續(xù)處理,是對(duì)最細(xì)粒度切分結(jié)果的過濾,選擇出最長的分詞結(jié)果。* IK分詞器L頤朗g Analyzern5Jl類* param isMaxWordLength當(dāng)為trueE,分詞器迸行最犬詞長切分 */public IKAnalyzer(boolean IsMaxWordLength)super();this * 5EtMaxWord Length(isMaxWard Length);)1調(diào)用tokenStream()方法返回分詞對(duì)象Str in gReader reader=new Stri ngR
17、eader(這是要分的詞”);TokenStream ts=analyzer.tokenStream( , reader);追蹤源碼查看真正的分詞對(duì)象1、類 iKAnalyzer 的方法 tokenStreampublic TokenStream tokenStream(StringfieldName , Reader reader) return n ewIKToke ni zer( reader , isMaxWordLe ngth();返回一個(gè)IKTokenizer對(duì)象2、IKTokenizer 類的構(gòu)造器中實(shí)例化了 IKSegmentation/TK分詞器實(shí)現(xiàn) private IKSe
18、gmentation _lKlmplement;/伺元文本屬性=private Tc戶mAtermAtt;/伺元檢移屬性 private OffsetAttribute offsetAtt; /記錄盤后一個(gè)詞元的誌東位畫 private int finalOffset;LuceneToken i適凱器類枸itlll埶* param in.iparam isMaxWordLength當(dāng)為七廣皿時(shí),分訶55遍行最尢詞悵切分;豈為fak電是,采用最細(xì)粒度*public IKTokenizer(Readier in t boolean isMaxWordLength) super(in);offset
19、Att = addAttribute(Of卡芻己七Attribute.ulmws); termAtt = add/Vtl:廣ibuizE (丁匚口和心士七 rdbutc!. ulmss);TKImplement = new IKSegmentation(in , isMaxWordLength);由此可見IKSegmentation 才是真正的分詞實(shí)現(xiàn)。IKSegmentation 詳見上面的說 明。Lucene如何得到IKSegmentation 的分詞結(jié)果i這里要說到幾個(gè)類org.apache .lucen e.a nalysis.Toke nStream org.apache.luce
20、ne.a nalysis.Toke nizer org.wltea.a nalyzer.luce ne.l KToke nizer 它們之間的關(guān)系如下圖所示二 ava * lein口 * 皿二 z匸tagac:匕牡-1 口c:己口己* anal丁呂丄呂.工ok皀nS匸MEairI org. apach住-lucene . analysis. Token! zerTokenizer 擴(kuò)展了 TokenStreamj ava.lang.0bj ectI orgapache lucene util.AutributeSourceI org. apache lucene. analysis.Tcken
21、StreaicI arg apache Lucene.analysis.TokenizerI 5宀曰魚*311&1址曰匕-1口匚呂nm -工IFTok總niz曰rIKTokenizer 擴(kuò)展了 Tokenizer(Overridepublic TokenSt己日皿 tokenStream(String fieldName, Reader reader) return new IKTokenizer(reader isMaxWordLength();由上圖可見,iKAnalyzer_類的tokenStream ()方法返回的是KTokenizer_。2、再看看IKTokenizer_類作了些什么
22、public final class IKTokenizer extends TokenizerIKToke nizer 的構(gòu)造器* Lucene Tokenizer適配器類構(gòu)詹函數(shù)* parm in* wmni isMaxWordLength當(dāng)為trua時(shí),分詞器遊行最大訶長切知 當(dāng)jfalse,乘用最卿 */public IKTokenizer(Reader in , boolean isMaxWordLength) super(in);offsetAtt = addAttribute(OffsetAttribute.class);termAtt =日birte (Tu廠僭Attribut
23、e * ulmsw);IKImplement = new IKSegmentationf in , isMaxWor-dLength);構(gòu)造器實(shí)例化了 IKSegmentation用于分詞。IKTokenizer 擴(kuò)展了 Tokenizer覆蓋了其中的幾個(gè)方法方法in creme ntToke n()比較重要,這個(gè)方法用于測試是否還有下一個(gè)分詞結(jié)果, 并生成分詞結(jié)果。它會(huì)調(diào)用 Lexeme nextLexeme =KImplement.next(); 得到下一個(gè)分詞結(jié)果, 如果有,會(huì)存入到屬性(private TermAttribute_ termAtt ;)中,代碼如下: if (nextL
24、exeme != null )/ 將 Lexeme轉(zhuǎn)成 Attributes/設(shè)置詞元文本termAtt .setTermBuffer( nextLexeme.getLexemeText();/設(shè)置詞元長度termAtt .setTermLength( nextLexeme.getLength();/設(shè)置詞元位移offsetAtt .setOffset( n extLexeme.getBegi nPositi on(),n extLexeme.getE ndPositio n();/記錄分詞的最后位置fin alOffset= n extLexeme.getE ndPositio n();/返
25、會(huì)true告知還有下個(gè)詞元return true ;分詞結(jié)果存在termAtt,那么通過什么方法得到呢。通過類 org.apache.lucene.analysis.Tokenizer的 getAttribute方法得至嘰代碼如下:TermAttribute term = ts.getAttribute(TermAttribute.class);通過循環(huán)調(diào)用in creme ntToke n()方法可不斷得到分詞結(jié)果,代碼如下:try while (ts.incrementToken()System.out .print(term.toString()+|); catch (lOExcepti
26、on e) / TODOAuto-ge nerated catch blocke.pri ntStackTrace();完整代碼/* LUCENE使用IK分詞*/private static void LuceneJIKFenCi()String text=基于java語言開發(fā)的輕量級(jí)的中文分詞工具包 /創(chuàng)建分詞對(duì)象Analyzer anal=new IKAnalyzer(true );Strin gReader reader=n ewStri ngReader(text);/分詞class );TokenStream ts=anal.tokenStream( , reader);TermAttribute term = ts.getAttribut
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 光學(xué)儀器的質(zhì)譜分析技術(shù)原理與應(yīng)用考核試卷
- 搪瓷制品的耐干燥性能分析與應(yīng)用考核試卷
- 乳制品業(yè)特種垃圾管理辦法
- 鐵路工程管井施工合同
- 拍賣公司鑒定師聘用合同范本
- 鐵路工程款結(jié)算書
- 旅游景區(qū)道路建設(shè)協(xié)議
- 機(jī)場建設(shè)腳手架工程分包協(xié)議
- 學(xué)校樁基建設(shè)項(xiàng)目招標(biāo)文件
- 城市供氣主體勞務(wù)施工合同
- 脫發(fā)知識(shí)課件
- 新部編版小學(xué)三年級(jí)上冊語文第三單元基礎(chǔ)過關(guān)卷(單元測試)
- 康復(fù)治療技術(shù)生涯發(fā)展展示
- 《哈腰掛》的音樂手法
- 轉(zhuǎn)正述職報(bào)告?zhèn)€人簡介
- 公開課中國式績效管理精彩回顧
- (完整版)家具報(bào)價(jià)單模板
- 低空經(jīng)濟(jì)產(chǎn)業(yè)園定位
- 小學(xué)科學(xué)名師工作室工作計(jì)劃
- 某年衛(wèi)生監(jiān)督協(xié)管工作總結(jié)
- 高二挑戰(zhàn)與突破
評(píng)論
0/150
提交評(píng)論