IK 분사 소스 분석 연재 (二) -- 서브 분사 기
http://blog.chinaunix.net/uid-20761674-id-3424176.html
제1 편
IK 분사 소스 코드 분석 연재 (一) -- 메 인 프로 세 스
IK 분사 의 주요 절차 와 기능 을 개요 적 으로 설명 하 였 으 며, 세부 적 인 부분 에 들 어가 야 합 니 다. 이번 에는 IK 의 세 개의 분사 기 를 상세 하 게 소개 합 니 다: CJKSegmenter (중국어 분사), CNQuantifierSegmenter (수량 어 분사), LetterSegmenter (자모 분사).
이 세 개의 단어 기 는 코드 가 매우 유사 합 니 다. 사고방식 은 모두 같 습 니 다. 사전 트 리 (CJK 사용) 나 다른 간단 한 데이터 구조 (CN Quantifier Segmenter 와 Letter Segmenter) 를 사용 하여 텍스트 의 현재 문 자 를 일치 시 키 고 일치 하 는 문 자 를 단어 후보 집합 에 추가 합 니 다.
여기 서 CJKSegmenter 를 상세 하 게 소개 하고, 기타 두 단어 기 는 CJKSegment 와 다른 것 만 설명 하면 된다.
상위 코드:
public void analyze(AnalyzeContext context) {
if(CharacterUtil.CHAR_USELESS != context.getCurrentCharType()){
// tmpHits hit
if(!this.tmpHits.isEmpty()){
//
Hit[] tmpArray = this.tmpHits.toArray(new Hit[this.tmpHits.size()]);
for(Hit hit : tmpArray){
hit = Dictionary.getSingleton().matchWithHit(context.getSegmentBuff(), context.getCursor() , hit);
if(hit.isMatch()){
char[] date = context.getSegmentBuff();
//
Lexeme newLexeme = new Lexeme(context.getBufferOffset() , hit.getBegin() , context.getCursor() - hit.getBegin() + 1 , Lexeme.TYPE_CNWORD);
context.addLexeme(newLexeme);
if(!hit.isPrefix()){// ,hit ,
this.tmpHits.remove(hit);
}
}else if(hit.isUnmatch()){
//hit ,
this.tmpHits.remove(hit);
}
}
}
//*********************************
//
Hit singleCharHit = Dictionary.getSingleton().matchInMainDict(context.getSegmentBuff(), context.getCursor(), 1);
if(singleCharHit.isMatch()){//
//
Lexeme newLexeme = new Lexeme(context.getBufferOffset() , context.getCursor() , 1 , Lexeme.TYPE_CNWORD);
context.addLexeme(newLexeme);
//
if(singleCharHit.isPrefix()){
// hit
this.tmpHits.add(singleCharHit);
}
}else if(singleCharHit.isPrefix()){//
// hit
this.tmpHits.add(singleCharHit);
}
}else{
// CHAR_USELESS
//
this.tmpHits.clear();
}
//
if(context.isBufferConsumed()){
//
this.tmpHits.clear();
}
//
if(this.tmpHits.size() == 0){
context.unlockBuffer(SEGMENTER_NAME);
}else{
context.lockBuffer(SEGMENTER_NAME);
}
}
<span style="font-family: ;font-size:18px;"></span>
한 마디 한 마디 로 분석 하 다.
if(CharacterUtil.CHAR_USELESS != context.getCurrentCharType())
Hit singleCharHit = Dictionary.getSingleton().matchInMainDict(context.getSegmentBuff(), context.getCursor(), 1);
public class DictSegment implements Comparable<DictSegment>{
// ,
private static final Map<Character , Character> charMap = new HashMap<Character , Character>(16 , 0.95f);
//
private static final int ARRAY_LENGTH_LIMIT = 3;
//Map
private Map<Character , DictSegment> childrenMap;
//
private DictSegment[] childrenArray;
//
//private Character nodeChar;
public Character nodeChar;
// Segment
//storeSize <=ARRAY_LENGTH_LIMIT , , storeSize >ARRAY_LENGTH_LIMIT , Map
private int storeSize = 0;
// DictSegment , 0 , 1
private int nodeState = 0;
if(singleCharHit.isMatch()){//
//
Lexeme newLexeme = new Lexeme(context.getBufferOffset() , context.getCursor() , 1 , Lexeme.TYPE_CNWORD);
context.addLexeme(newLexeme);
//
if(singleCharHit.isPrefix()){
// hit
this.tmpHits.add(singleCharHit);
}
else if(singleCharHit.isPrefix()){//
// hit
this.tmpHits.add(singleCharHit);
}
if(!this.tmpHits.isEmpty()
핵심 사고방식 은 사실 간단 하 다, CNQuantifier Segmenter 와 Letter Segmenter 의 단어 코드 는 더 이상 상세 하 게 설명 하지 않 습 니 다. 코드 는 CJK 와 유사 합 니 다. 주요 차이 점 은 다음 과 같 습 니 다.
1. CN_Quantifier Segmenter 의 사전 출처 두 곳: 1. quantifier. dic 파일, 양사 2. 수 사 를 포함 하여 Chn NumberChars 류 에 직접 썼 습 니 다. 내용 은 다음 과 같 습 니 다.
2. Letter Segmenter 는 각각 세 개의 유사 한 프로세서 가 있 는데 그것 이 바로 자모, 숫자, 자모 와 숫자의 조합 이다.
3. 처리 의 기본 적 인 사 고 는 똑 같은 유형의 문자 와 일치 하 는 것 이다. 서로 다른 유형의 문자 가 나타 날 때 까지 한 단 어 를 자 르 는 것 이다. 예 를 들 어 LetterSegmenter 가 문자열 에 대한 '중국어 abc 영어' 처리 방식 은 바로 연속 적 인 알파벳 문자열 abc 와 일치 하 는 것 이다. 한 단어 로 자 르 고 절 사 결 과 는 중국어 abc 영어 이다.
절 사 는 이해 하기 어렵 지 않 죠? 뒤에 또 다른 핵심 내용 으로 들 어 갑 니 다. 잘못된 의미 로 처리 합 니 다.
IK 분사 소스 분석 연재 (三) -- 잘못된 의미 처리
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.