중화사전망 - 영어 사전 - Ictclas4j 사용자 사전을 사용자 정의하는 방법

Ictclas4j 사용자 사전을 사용자 정의하는 방법

Ictclas4j 를 다운로드하여 소스 코드를 보십시오. 나는 예를 하나 찾고 있다. Org.ictclas4j.run.SegMain 을 실행할 수 있습니다. 분사의 핵심 논리는 org.ictclas4j.segment.Segment 의 split(String src) 메서드에서 SegMain 을 실행한 결과 일련의 문자 (품사성 마크업 포함) 가 나왔다. Segment 와 org.ictclas4j.bean.SegResult 를 자세히 보면 잘 나누어진 단어가 보이지 않는다. 이것은 Lucene 의 분사 시스템으로 확장하기 어렵게 한다. 555, 우리 검게 합시다.

Hack 브레이크의 최종 결과는 SegResult 클래스의 최종 결과 필드에 기록됩니다. Segment.split(String src) 에서 생성됩니다. 코드를 천천히 보고 outputresult (ArrayList

1. 세그먼트 수정:

1) 원래 outputResult(ArrayList<

//분사 경로를 기준으로 분사 결과를 생성합니다

전용 문자열 outputresult (ArrayList < SegNode & gtwrList, ArrayList & lt 문자열> 단어) {

문자열 결과 = null

String temp = null

Char [] pos = new char [2];

If (wr 목록! = null & ampamp & ampampwrlist.size () > 0) {

결과 = "";

For(int I = 0;; 나 & ltwrlist.size (); I++) {

Segnodesn = wrlist.get (I);

If (sn.getPos ()! = POSTag 입니다. Sen _ begin & ampamp & ampampsn.getpos ()! = POSTag 입니다. SEN_END) {

Inttag = math.abs (sn.getpos ());

Pos [0] = (char) (태그/256);

Pos[ 1] = (char) (레이블% 256);

Temp = ""+pos [0];

If(pos[ 1]>0)

Temp+= ""+pos [1];

Result+= sn.getsrcword ()+"/"+temp+"";

만약! = null) {//chenlb add

Words.add (sn.getsrcword ());

}

}

}

}

결과를 반환합니다.

}

2) 원래 출력 결과 (ArrayList<

//chenlb output result 로 이동 (ArrayList < SegNode & gtwrList, ArrayList & lt 문자열> 단어)

전용 문자열 outputresult (ArrayList < SegNode & gt 경고 목록) {

OutputResult(wrList, null) 를 반환합니다.

}

3) outputresult (배열 목록) 수정 및 호출

Public seg result split (string src) {

SegResult Sr = 새로운 seg result (src); //분사 결과

문자열 finalResult = null

만약 (src! = null) {

FinalResult =

Intindex = 0;

String midResult = null

Sr.setrawcontent (src);

Sentence seg ss = new sentence seg (src);

ArrayList & lt 문장 & gtsens = ss.getsens ();

ArrayList & lt 문자열 & gtwords = new ArrayList & lt 문자열> (); //chenlb 추가

For(sens:sens){

Logger.debug (sen);

Longstart = system.currenttimemillis ();

Midresult Mr = new midresult ();

Mr.setindex (index++);

Mr.setsource (sen.getcontent ());

If (sen.isSeg()) {

//원자 분사

Atomsegas = newatomseg (sen.getcontent ());

Arraylist & lt atom & gtatoms = as.getatoms ();

SetAtoms (원자);

System.err.println ("[atomtime]:"+(system.currenttimemillis ()-start));

Start = system.currenttimemillis ();

//분사표를 생성하고, 먼저 초기 분사를 하고, 최적화한 다음, 마지막으로 품사성을 표시한다.

Seggraph seggraph = graphgenerate.generate (atoms, coredict);

Mr.setsegraph (seggraph.getsnlist ());

//이진 분사 차트 생성

Seggraphbiseggraph = graphgenerate.bigenerate (seggraph, coreDict, bigramdict);

SetBiSegGraph 씨 (biseggraph.getsnlist ());

System. err. println("[ 그래프 시간]: "+(system.currenttimemillis ()-start));

Start = system.currenttimemillis ();

//n 개의 최단 경로 발견

Nshortpath NSP = newnshortpath (biseggraph, segpathcount);

ArrayList & ltArrayList & lt 정수> & gtbipath = nsp.getpaths ();

세트비파스 (비파스);

System.err.println("[NSP 시간]: "+(system.currenttimemillis ()-start));

Start = system.currenttimemillis ();

For(ArrayList & lt;; 정수> 단방향: 양방향) {

//주 분사 경로 가져오기

Arraylist & ltsegnode & gtsegpath = getsegpath (seggraph, onepath);

Arraylist & ltsegnode & gt firstpath = adjust seg.first adjust (segpath);

String first result = output result (first path);

AddFirstResult 씨 (first result);

System. err. println("[ 첫 번째]: "+(system.currenttimemillis ()-start));

Start = system.currenttimemillis ();

//등록되지 않은 단어를 처리하여 초기 분사 결과를 최적화합니다.

Seggraph optseggraph = new seggraph (first path);

Arraylist & ltsegnode & gtsns = clone (firstpath);

Persontagger.recognition (optseggraph, SNS);

Transpersontagger.recognition (optseggraph, SNS);

Placetagger.recognition (optseggraph, SNS);

Mr.setoptseggraph (optseggraph.getsnlist ());

System. err. println("[ 알 수 없는 시간]: "+(system.currenttimemillis ()-start));

Start = system.currenttimemillis ();

//최적화 결과에 따라 이진 분사 테이블을 재생성합니다.

Seggraphoptbiseggraph = graphgenerate.bigenerate (optseggraph, coreDict, bigramdict);

SetOptBiSegGraph 씨 (optbiseggraph.getsnlist ());

//n 개의 최단 경로 다시 찾기

Nshortpath opt NSP = new nshortpath (optbiseggraph, segpathcount);

ArrayList & ltArrayList & lt 정수> & gtoptbipath = optnsp.getpaths ();

SetOptBipath 씨 (optbipath);

//최적화된 분사 결과를 생성하고, 품사성을 표시하고, 마지막으로 결과를 최적화합니다.

Arraylist & ltsegnode & gtadjresult = null

For(ArrayList & lt;; 정수 & gtoptOnePath: optBipath) {

Arraylist & ltsegnode & gtoptsegpath = getsegpath (optseggraph, optonepath);

Lextagger.recognition (optsegpath);

String opt result = output result (optsegpath, words); //chenlb 가 변경되었습니다

AddOptResult 씨 (optresult);

Adjresult = adjustseg.finaadjust (optsegpath, personTagger, place tagger);

Stringadjrs = output result (adjresult);

System. err. println("[ 마지막]: "+(system.currenttimemillis ()-start));

Start = system.currenttimemillis ();

If (midResult == null)

MidResult = adjrs

깨뜨리다

}

}

Sr.addmidresult (Mr);

} 그렇지 않으면 {

Midresult = sen.getcontent ();

Words.add (midresult); //chenlb 추가

}

최종 결과+= 중간 결과;

MidResult = null

}

Sr.setWords (단어); //chenlb 추가

Sr.setFinalResult (최종 결과);

Debugutil.output2 html (Sr);

Logger.info (final result);

}

Sr 을 반환합니다

}

4) 4) 세그먼트 구성 방법에서 사전 경로 분리는 "/"로 변경할 수 있습니다

5) 누락 된 단어의 버그도 수정되었습니다. Ictclas4j 의 버그를 보세요.

2. 세그먼트 결과를 수정합니다.

다음을 추가합니다.

개인 배열 목록< 문자열> 단어; //단어 세분화 후 단어 결과 기록, chenlb add

/* *

* 항목을 추가합니다.

* @param word null 이 추가되지 않았습니다.

* @ authorchenlb2009-1-21오후 05:0 1:25

*/

Public void addWord (문자열) {

If(words == null) {

Words = new ArrayList & lt 문자열> ();

}

만약! = null) {

Words.add (word);

}

}

공용 배열 목록< 문자열 & gtgetWords() {

대답;

}

Public void set words (ArrayList < 문자열> 단어) {

This.words = 단어;

}

다음은 ictclas4j 를 생성하는 Lucene analyzer 입니다.

1, 새 ICTCLAS4jTokenizer 클래스를 만듭니다.

패키지 com.chenlb.analysis.ictclas4j;

Java.io.ioexception 을 가져옵니다.

Java.io.reader 가져오기

Java.util.arraylist 가져오기

Org.apache.lucene.analysis.token 을 임포트합니다

Org.apache.lucene.analysis.tokenizer 를 임포트합니다

Org.ictclas4j.bean.segresult 를 임포트합니다

Org.ictclas4j.segment.segment 를 임포트합니다.

/* *

* ictclas4j 단어 절단

*

* @ 저자 chenlb 2009- 1-23 오전 1 1:39: 10

*/

공용 클래스 ICTCLAS4jTokenizer 는 Tokenizer {

개인 정적 세그먼트

Privatestringbuilder sb = new stringbuilder ();

개인 배열 목록< 문자열> 단어;

Private int startoff est = 0;;

Private intlength = 0;

Private int word idx = 0;;

공용 ICTCLAS4jTokenizer() {

Words = new ArrayList & lt 문자열> ();

}

공용 ICTCLAS4jTokenizer (리더 입력) {

수퍼 (입력);

Char [] buf = new char [8192];

Int d =-1;

시도 {

While((d=input.read(buf))! =-1) {

Sb.append(buf, 0, d);

}

} catch (IOException e) {

E. printstacktrace ();

}

SegResult Sr = seg () 입니다. Split (sb.tostring ()); //분사

Words = sr.getwords ();

}

공용 토큰 next(Token reusableToken) 가 IOException {

어설 션 reusableToken! = null

길이 = 0;

토큰 토큰 = null

If(word idx<;; Words.size()) {

Stringword = words.get (word idx);

길이 = word.length ();

Token = reusabletoken.reinit (word, startOffest, start off est+length);

Wordid x++;

Startoff est+= length;;

}

토큰을 반환합니다.

}

개인 정적 세그먼트 seg() {

If (세그먼트 = = null) {

세그먼트 = 새 세그먼트 (1);

}

세그먼트로 돌아가기

}

}

2. 새 ICTCLAS4jFilter 클래스를 만듭니다.

패키지 com.chenlb.analysis.ictclas4j;

Org.apache.lucene.analysis.token 을 임포트합니다

Org.apache.lucene.analysis.tokenfilter 를 임포트합니다

Org.apache.lucene.analysis.tokenstream 을 임포트합니다

/* *

* 문장 부호 등. , 너무 많은 우려.

*

* @ 작성자 chenlb 2009- 1-23 오후 03 시 06 분 00 분

*/

공용 클래스 ICTCLAS4jFilter 확장 토큰 필터 {

보호된 ictclas4j 필터 {

수퍼 (입력);

}

공용 최종 토큰 next (최종 토큰 reusableToken) 가 java.io.IOException {

어설 션 reusableToken! = null

For (token next token = input.next (reusable token); 넥스트 토큰! = null nexttoken = input.next (reusable token)) {

Stringtext = nexttoken.term ();

Switch (character.gettype (text.charat (0)) {

사례 인물. 소문자:

사례 인물. 대문자:

//영어 단어/태그는 1 자보다 커야 합니다.

If (text.length () > 1) {

NextToken 으로 돌아가기

}

깨뜨리다

사례 인물. 십진수:

사례 인물. 기타 _ 문자:

//한자를 한자로 삼다.

//중국어 단어 추출은 뒤에 여기에 추가됩니다.

NextToken 으로 돌아가기

}

}

Null 을 반환합니다

}

}

3. 새 ICTCLAS4jAnalyzer 클래스를 만듭니다.

패키지 com.chenlb.analysis.ictclas4j;

Java.io.reader 가져오기

Org.apache.lucene.analysis.analyzer 를 임포트합니다

Org.apache.lucene.analysis.lowercasefilter 를 임포트합니다

Org.apache.lucene.analysis.stopfilter 를 임포트합니다

Org.apache.lucene.analysis.tokenstream 을 임포트합니다

/* *

* ICT glas 4j 용 Lucene 분석기

*

* @ 저자 chenlb 2009- 1-23 오전 1 1:39:39

*/

공용 클래스 ICTCLAS4jAnalyzer 확장 분석기 {

Private static final long serialversionuid =1l;

//더 많은 급한 단어를 사용자 정의할 수 있습니다 (고주파 단어는 별로 유용하지 않음).

개인 정적 최종 문자열 [] STOP_WORDS = {

And, yes, as, in, yes, 하지만, from,

인, 인, 인, 인, 인, 예, 인,

"아니오", "아니오", "의", "위", "또는", "이런",

"저", "저", "그들의", "그리고", "저기", "이것들",

"그들", "이것", "예", "한 번", "곧", "같은",

"네"

}

공용 토큰 스트림 토큰 스트림 (문자열 필드 이름, 판독기 리더) {

Token stream result = new ictclas 4 jtokenizer (reader);

Result = new ictclas 4jfilter (new stop filter (new lower case filter (result), STOP _ WORDS)););

결과를 반환합니다.

}

}

분사의 효과를 시험해 봅시다.

텍스트 내용:

경화 타임즈 65438+ 10 월 23 일 어제 시베리아 중부에서 온 강한 찬 공기의 영향으로 본 도시에 강풍이 일어나 기온이 내려가고 있다고 보도했다. 낮 최고기온은 영하 7 도에 불과하며 6-7 급 북풍이 동반된다.

원래 단어 세분화 결과:

경화 /nz 타임즈 /ng 신문 /v 65438+ 10 월 /t 23 일 /t 보도 /v 어제 /T, /w 영향 /v I /m 주 /q 시작 /v 중/; /w 주간 /t 최고 /a 온도 /n /d /v 음수 /s 7/m 섭씨 /q, /w 동시 /c 동반/v/v/v 6/m~ /v 7/m /q /u

분석기:

[경화] [시간] [신문] [65438+ 10 월 ][23 일] [보도] [어제] [받은] [한 부] [중국]