




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、IKAnalyzer版本Jar包下載IKAnalyzer3.2.8_bin下載地址:下載后包含說明及API文檔(在目錄doc3.2.8中)。源碼下載IKSegmentation淺析(純IK分詞)IKSegmentation是IK中獨立的分詞器,和lucene沒有關系。不繼承,不擴展,不使用lucene相關的類。IK主分詞器構造函數/* * IK主分詞器構造函數 * param input * param isMaxWordLength 當為true時,分詞器進行最大詞長切分 */public IKSegmentation(Reader input , boolean isMaxWordLeng
2、th)this.input = input ;segmentBuff = new charBUFF_SIZE;context = new Context(segmentBuff , isMaxWordLength);segmenters = Configuration.loadSegmenter();Reader input 是一個輸入流,用于讀取文件內容。IKSegmentation的構造器,作了3個事1、 new Context(segmentBuff , isMaxWordLength) 創(chuàng)建上下文對象Contextcontext = new Context(segmentBuff ,
3、isMaxWordLength);Contex主要是存儲分詞結果集和記錄分詞處理的游標位置。2、 Configuration.loadSegmenter() 加載詞典、創(chuàng)建分詞器 Configuration.loadSegmenter() 方法實現在加載詞典,創(chuàng)建分詞器詳情如下。/* * 初始化子分詞器實現 * (目前暫時不考慮配置擴展) * return List<ISegmenter> */public static List<ISegmenter> loadSegmenter()/初始化詞典單例,如果查看getInstance()發(fā)現里面有詳細的初始化詞典的相關方
4、法Dictionary.getInstance();List<ISegmenter> segmenters = new ArrayList<ISegmenter>(4);/處理數量詞的子分詞器segmenters.add(new QuantifierSegmenter();/處理中文詞的子分詞器segmenters.add(new CJKSegmenter();/處理字母的子分詞器segmenters.add(new LetterSegmenter(); return segmenters;得到Lexeme 這是IK分詞器的語義單元對象,相當于Lucene中的Token
5、詞元對象。由于3.0版本被設計為獨立于Lucene的Java分詞器實現,因此它需要Lexeme來代表分詞的結果。調用的next()方法,會返回Lexeme 對象,如果沒有下一個分詞結果,會返回null。源碼如下/* * 獲取下一個語義單元 * return 沒有更多的詞元,則返回null * throws IOException */public synchronized Lexeme next() throws IOException if(context.getResultSize() = 0)/* * 從reader中讀取數據,填充buffer * 如果reader是分次讀入buffer
6、的,那么buffer要進行移位處理 * 移位處理上次讀入的但未處理的數據 */int available = fillBuffer(input); if(available <= 0) context.resetContext(); return null; else /分詞處理 int analyzedLength = 0; for(int buffIndex = 0 ; buffIndex < available ; buffIndex+) /移動緩沖區(qū)指針 context.setCursor(buffIndex); /進行字符規(guī)格化(全角轉半角,大寫轉小寫處理) segmen
7、tBuffbuffIndex = CharacterHelper.regularize(segmentBuffbuffIndex); /遍歷子分詞器 for(ISegmenter segmenter : segmenters) segmenter.nextLexeme(segmentBuff , context); analyzedLength+; /* * 滿足一下條件時, * 1.available = BUFF_SIZE 表示buffer滿載 * 2.buffIndex < available - 1 && buffIndex > available - BU
8、FF_EXHAUST_CRITICAL表示當前指針處于臨界區(qū)內 * 3.!context.isBufferLocked()表示沒有segmenter在占用buffer * 要中斷當前循環(huán)(buffer要進行移位,并再讀取數據的操作) */ if(available = BUFF_SIZE && buffIndex < available - 1 && buffIndex > available - BUFF_EXHAUST_CRITICAL && !context.isBufferLocked() break; for(ISegmen
9、ter segmenter : segmenters)segmenter.reset(); /System.out.println(available + " : " + buffIndex); /記錄最近一次分析的字符長度 context.setLastAnalyzed(analyzedLength); /同時累計已分析的字符長度 context.setBuffOffset(context.getBuffOffset() + analyzedLength); /如果使用最大切分,則過濾交疊的短詞元 if(context.isMaxWordLength() context.
10、excludeOverlap(); /讀取詞元池中的詞元 return buildLexeme(context.firstLexeme(); else/讀取詞元池中的已有詞元return buildLexeme(context.firstLexeme();Lexeme說明n public int getBeginPosition() 說明:獲取詫義單元的起始字符在文本中的位置 返回值:int , 詫義單元相對于文本的絕對起始位置 n public int getEndPosition() 說明:獲取詫義單元的結束字符的下一個位置 返回值:int , 詫義單元相對于文本的絕對終止位置的下一個字符
11、位置 n public int getLength() 說明:獲取詫義單元包含字符串的長度 返回值:int , 詫義單元長度 = getEndPosition getBeginPosition n public String getLexemeText() 說明:獲取詫義單元包含字符串內容 返回值:String, 詫義單元的實際內容,即分詞的結果 完整代碼示例private static void IKFenCi() FileInputStream fis;try fis = new FileInputStream("F:tmp1234.txt");InputStreamR
12、eader isr=new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); IKSegmentation ik = new IKSegmentation(br, true);Lexeme lex = null;while(lex=ik.next()!=null) System.out.println(lex.getLexemeText()+"| LexemeType ="+lex.getLexemeType() +"| TYPE_CJK_
13、NORMAL= "+lex.TYPE_CJK_NORMAL); catch (FileNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (UnsupportedEncodingException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); Lucene使用
14、IKAnalyzer分詞實例化IKAnalyzer分詞器代碼Analyzer analyzer = new IKAnalyzer(true);代碼剖析Analyzer 類是lucene的一個類org.apache.lucene.analysis.Analyzer,IKAnalyzer類繼承此類(public final class IKAnalyzer extends Analyzer)并覆蓋了tokenStream方法。IKAnalyzer構造方法說明它有一個構造方法接收一個參數isMaxWordLength,這個參數是標識IK是否采用最大詞長分詞,還是采用最細粒度切分兩種分詞算法。實際兩種
15、算法的實現,最大詞長切分是對最細粒度切分的一種后續(xù)處理,是對最細粒度切分結果的過濾,選擇出最長的分詞結果。調用tokenStream()方法返回分詞對象StringReader reader=new StringReader(“這是要分的詞”); TokenStream ts=analyzer.tokenStream("", reader);追蹤源碼查看真正的分詞對象1、類IKAnalyzer 的方法 tokenStreampublic TokenStream tokenStream(String fieldName, Reader reader) return new I
16、KTokenizer(reader , isMaxWordLength();返回一個IKTokenizer對象2、IKTokenizer類的構造器中實例化了IKSegmentation由此可見IKSegmentation才是真正的分詞實現。IKSegmentation詳見上面的說明。Lucene如何得到IKSegmentation的分詞結果1、這里要說到幾個類org.apache.lucene.analysis.TokenStreamorg.apache.lucene.analysis.Tokenizerorg.wltea.analyzer.lucene.IKTokenizer它們之間的關系如
17、下圖所示Tokenizer 擴展了 TokenStreamIKTokenizer 擴展了Tokenizer由上圖可見,IKAnalyzer類的tokenStream()方法返回的是IKTokenizer。2、 再看看IKTokenizer類作了些什么public final class IKTokenizer extends TokenizerIKTokenizer 的構造器構造器實例化了IKSegmentation用于分詞。IKTokenizer 擴展了Tokenizer覆蓋了其中的幾個方法方法incrementToken()比較重要,這個方法用于測試是否還有下一個分詞結果,并生成分詞結果。
18、它會調用Lexeme nextLexeme = _IKImplement.next();得到下一個分詞結果,如果有,會存入到屬性(private TermAttribute termAtt;)中,代碼如下:if(nextLexeme != null)/將Lexeme轉成Attributes/設置詞元文本termAtt.setTermBuffer(nextLexeme.getLexemeText();/設置詞元長度termAtt.setTermLength(nextLexeme.getLength();/設置詞元位移offsetAtt.setOffset(nextLexeme.getBeginP
19、osition(), nextLexeme.getEndPosition();/記錄分詞的最后位置finalOffset = nextLexeme.getEndPosition();/返會true告知還有下個詞元return true;分詞結果存在termAtt,那么通過什么方法得到呢。通過類org.apache.lucene.analysis.Tokenizer的getAttribute方法得到。代碼如下: TermAttribute term = ts.getAttribute(TermAttribute.class);通過循環(huán)調用incrementToken()方法可不斷得到分詞結果,代碼如下: try while(ts.incrementToken() System.out.print(term.toString()+"|&qu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 船舶生產安全會議記錄范文
- 四川省蓉城名校聯盟2025年物理高一下期末統(tǒng)考模擬試題含解析
- 安全警示教育總結100字左右
- 2025屆廣西壯族自治區(qū)普通高中物理高二第二學期期末質量檢測試題含解析
- 2025屆齊魯名校教科研協(xié)作體 山東、湖北部分重點中學高一物理第二學期期末學業(yè)質量監(jiān)測試題含解析
- 勞務工作總結與計劃
- 2025年江蘇省南通市啟東市高二物理第二學期期末統(tǒng)考試題含解析
- 湖北宜昌市示范高中協(xié)作體2025屆物理高一下期末學業(yè)質量監(jiān)測試題含解析
- 2025屆寧夏回族自治區(qū)銀川市興慶區(qū)銀川一中物理高一下期末調研模擬試題含解析
- 陜西省咸陽市2025年物理高二下期末達標檢測模擬試題含解析
- 徐州市教師業(yè)務能力測試題庫(數學)
- 2025屆甘肅省天水市秦州區(qū)天水一中高一下數學期末達標檢測試題含解析
- 互聯網導論智慧樹知到期末考試答案章節(jié)答案2024年上海第二工業(yè)大學
- 重癥??谱o士進修匯報課件
- 孕產婦兒童健康管理服務規(guī)范
- 機關大院保安服務
- 人教版五年級下冊數學1-8單元測試卷含答案(每單元2套試卷,共16卷)
- 高中3500必背單詞
- 軍訓安全教育課件
- 施工管理的施工進度問題分析與解決
- 滬科版七年級數學下冊 第二學期期末測試卷
評論
0/150
提交評論