Java开源分词系统IKAnalyzer学习(八) 基于词库分词

分词操作:

 

Lexeme l = null; while( (l = ikSeg.next()) != null){ System.out.println(l); } 

 

相关流程

 

 

 

 

 

 

 

 

词典匹配的关键代码:

/** * 匹配词段 * @param charArray * @return Hit */ public Hit match(char[] charArray){ return this.match(charArray , 0 , charArray.length , null); } /** * 匹配词段 * @param charArray * @param begin * @param length * @return Hit */ public Hit match(char[] charArray , int begin , int length){ return this.match(charArray , begin , length , null); } /** * 匹配词段 * @param charArray * @param begin * @param length * @param searchHit * @return Hit */ public Hit match(char[] charArray , int begin , int length , Hit searchHit){ if(searchHit == null){ //如果hit为空,新建 searchHit= new Hit(); //设置hit的其实文本位置 searchHit.setBegin(begin); }else{ //否则要将HIT状态重置 searchHit.setUnmatch(); } //设置hit的当前处理位置 searchHit.setEnd(begin); Character keyChar = new Character(charArray[begin]); DictSegment ds = null; //引用实例变量为本地变量,避免查询时遇到更新的同步问题 DictSegment[] segmentArray = this.childrenArray; Map<Character , DictSegment> segmentMap = this.childrenMap; //STEP1 在节点中查找keyChar对应的DictSegment if(segmentArray != null){ //在数组中查找 for(DictSegment seg : segmentArray){ if(seg != null && seg.nodeChar.equals(keyChar)){ //找到匹配的段 ds = seg; } } }else if(segmentMap != null){ //在map中查找 ds = (DictSegment)segmentMap.get(keyChar); } //STEP2 找到DictSegment,判断词的匹配状态,是否继续递归,还是返回结果 if(ds != null){ if(length > 1){ //词未匹配完,继续往下搜索 return ds.match(charArray, begin + 1 , length - 1 , searchHit); }else if (length == 1){ //搜索最后一个char if(ds.nodeState == 1){ //添加HIT状态为完全匹配 searchHit.setMatch(); } if(ds.hasNextNode()){ //添加HIT状态为前缀匹配 searchHit.setPrefix(); //记录当前位置的DictSegment searchHit.setMatchedDictSegment(ds); } return searchHit; } } //STEP3 没有找到DictSegment, 将HIT设置为不匹配 return searchHit; } 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Java开源分词系统IKAnalyzer学习(八) 基于词库分词)