중화사전망 - 영어 사전 - Ictclas4j 사용자 사전을 사용자 정의하는 방법
Ictclas4j 사용자 사전을 사용자 정의하는 방법
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 일] [보도] [어제] [받은] [한 부] [중국]