본문 바로가기

한글analyzer

[lucene] Analyzer와 Filter (lucene 1.4.X) 루씬의 Analyzer는 아래와 같은 구조로 되어있습니다. public TokenStream tokenStream(String fieldName, Reader content) { return new GSKoreanSynonymFilter( new GSKoreanStopWordFilter( new GSKoreanSeperatorWordFilter( new GSKoreanSeperatorNameWordFilter( new GSKoreanTokenizer(content){} //GSKoreanTokenizer ) // GSKoreanSeperatorNameWordFilter ) //GSKoreanSeperatorWordFilter ), engine); } TokenStream을 만들고 정규화를 시키는 Toke.. 더보기
[lucene] 루씬 한글 Analyzer 복합명사 추출 로직 변경 루씬 한글 Analyzer 복합명사 추출 로직을 거의.. 확정하였습니다. (도대체 몇개월 만인지...ㅠㅠ) 일단 구조 자체는 Tokenizer에서 Token 추출 로직을 좀 만져주고.. 나머지는 Filter Class에서 처리하는 방식입니다. 동의어 Filter만 적용하고 불용어나 어미제거 필터는 일단 만들어 놓고 적용은 하지 않기로 했습니다. 단순 명사추출이기 때문에 더 망가지더군요...;;; 사전 기반의 명사 추출입니다. 문서 색인용 Filter와 사용자 입력 키워드 분석용 Filter를 따로 만들었습니다. 두개의 로직이 약간 다른데요 일단 문서 색인용은 1. Token을 끝까지 탐색하여, 사전에 있는 가장 긴 명사를 추출 2. Token을 순차적으로 탐색하며, 명사를 추출 3. Token그 자체를 .. 더보기
[lucene] 복합명사 추출. Filter Class 일단 이름 Term을 사전에서 찾아내고 그 다음에 하는 일이 명사를 추출하는 것이다. 어케 보면 별거 없는데 이따 참으로 고민을 많이했다. 일단 명사 사전이 있다 치고, 과연 어떻게 만족스러운 명사 추출을 할 것인가... 대표적인 예가.. "검색엔진개발자" 라는 단어가 있고 사전에는 "검색" , "엔진", "개발자" 라는 단어들이 있다고 하자.. 원하는 결과는 "검색엔진개발자" , "검색", "엔진" ,"개발자", "검색엔진", "엔진개발자" 이런식의 결과가 나오기를 원했다. 처음에는 앞에서 부터 하나씩 서치해가는 방식이었는데.. 즉.. 검 검색 검색엔진 검색엔진개... . . 색 색엔 색엔진 색엔진개.. 이런식.. 이게 너무 하나의 단어에 대해서 loop를 많이 돌고 결정적으로 위의 경우에서 사전에 ".. 더보기
[lucene] Dictionary Class. CharTokenizer에 이어서 한글 Analyzer를 만들기 위해 작성한 사전 클래스입니다. 이 클래스는 루씬에서 제공되는 클래스는 아니고 제가 필요에 의해서 작성한 클래스입니다. 기본적인 틀은 루씬 인 액션에 있는 소스를 참고하였고 세부적인 내용은 제가 작성을 하였습니다. 참고해주시구요.. 사전을 몇개 만들었다. 명사사전/ 이름사전/ 불용어사전/ 동의어사전/ 어미제거사전 자..이렇게 해놓고 모든걸 적용시켜보니.. 일단 색인어 추출을 (not 형태소분석) 하는데 있어서 어미제거가 되어버리면 , 단어가 너무 많이 망가지는 현상이 발생하여 현재는 어미제거는 하지 않고 있다. 위 사전들을 적용한 클래스를 앞으로 하나하나 작성을 해볼텐데.. 일단 기본이 되는 사전 클래스.. 사전 클래스는 어렵게 구현하지는 .. 더보기
[lucene] 오랜만에 진행중인 상황 올려봅니다. 커.. Analyzer하나 만드는게 장난 아닙니다. 전에 올렸듯이.. Tokenizer는 기본적으로 스페이스,특수문자,영어&숫자 와 한글 분리 로 토큰을 만들어 내는 방식을 고수하고 있습니다. 문제는 이제 저렇게 해서 나온 TokenStream을 받아서 어떻게 색인어를 추출하느냐.. 마땅히 어디서 구할 사전도 없고 해서 정말 아는 것도 없는 놈이 막코딩을 하고 있습니다..ㅠㅠ 일단 기본적인 명사 사전을 가지고.. 들어온 Token에서 명사를 추출해야 하는데.. 현재는 이런 방식을 쓰고 있습니다. String target_term = "언어로배우는자바디자인패턴"; for(int i=0; i < target_term.length(); i++) { for(int j=i; j < target_term.lengt.. 더보기