본문 바로가기

Lucene

[lucene] 루씬 한글 Analyzer 복합명사 추출 로직 변경

루씬 한글 Analyzer  복합명사 추출 로직을 거의.. 확정하였습니다. (도대체 몇개월 만인지...ㅠㅠ)

일단 구조 자체는 Tokenizer에서 Token 추출 로직을 좀 만져주고..

나머지는 Filter Class에서 처리하는 방식입니다.

동의어 Filter만 적용하고

불용어나 어미제거 필터는 일단 만들어 놓고 적용은 하지 않기로 했습니다.

단순 명사추출이기 때문에 더 망가지더군요...;;;

사전 기반의 명사 추출입니다.

문서 색인용 Filter와 사용자 입력 키워드 분석용 Filter를 따로 만들었습니다.

두개의 로직이 약간 다른데요

일단 문서 색인용은

1. Token을 끝까지 탐색하여, 사전에 있는 가장 긴 명사를 추출
2. Token을 순차적으로 탐색하며, 명사를 추출
3. Token그 자체를 Return


이렇게 작동 됩니다.

예를 들어보면..

사전에
"검색" "엔진" "검색엔진" "개발자" "그룹"
이라는 단어들이 있다고 하고

[검색엔진개발자그룹] 이라는 Token을 집어 넣는다고 할때

1번에 의해서 Token을 끝까지 탐색하여
[검색엔진]을 추출합니다. 그리고 그 다음 index인 [개]부터 다시 탐색을 합니다.
그리고, 다음 긴 명사인 [개발자], 같은 로직으로 [그룹]을 추출합니다.

그리고 2번에 의해서 Token을 순차적으로 탐색하는데
[검색]이 우선 추출되고 그 다음 [엔]부터 탐색하여 [엔진]
그 다음은 [개]부터 탐색하여 [개발자] [그룹]
이런식으로 탐색을 하게 됩니다.

3번에 의해서는 [검색엔진개발자그룹] 이 자체 Token을 그대로 리턴합니다.

[검색],[검색엔진],[개발자],[그룹],[엔진],[검색엔진개발자그룹]

그 다음 동의어 필터에서 각 단어의  동의어가 존재하면
동의어를 같이 색인합니다.

이렇게 하면 중간 중간 겹치는 Token이 발생하는데 일단 이건 Set을 이용해서 중복단어를 처리하고 있습니다..

형태소 분석까지 겸하면 좋겠지만... 국어를 그렇게 잘 하지 못 합니다 -_-ㅋ

키워드 분석용 필터는 1번의 로직만을 적용합니다.

15평형 같은 단어가 만약 사전에 [평형]만 들어가 있다면

[15][평형] 으로 분리가 되는데 , 많은 사람들이 15평 이라고 검색을 하면 검색이 안 되는 경우가 존재합니다.

이것은 동의어나 그냥 사전추가를 통해 해결하기로 했습니다.

이제 문제는 튜닝인듯 합니다. 상품명을 대상으로 약 130만건을 색인하는데 2000초 정도가 소요되더군요 (optimize 시간 포함, 컬럼 20개, 쿼리 시간 포함). 좀 더 빨랐으면 하는데.. 잘 모르겠네요.

일단 이정도로 작성을 할 예정입니다..

Tokenizer에서 현재는 숫자/영어/한글 을 각각의 토큰으로 분리해 내고 있는데
숫자와 영어는 하나의 토큰으로 묶어서 나오도록 하는 것도 어떨까.. 고민중입니다..

나중에는 대상 데이터를 whitespaceanalyzer로 색인해서 Text로 뽑아놓고
거기에 존재하는 명사들을 수작업으로 뽑아내서 사전 보강하는 작업도 해야되겠죠..^^;;;


10월 17일 추가.
그리고 어미사전과 조사사전을 활용해서 일단 스페이스 단위로 Token을 만들어내고
여기서 어미제거와 조사를 제거해서 1차적으로 명사(라고 가정되는) 상태로 만들고 이것을 바탕으로
현재 데이터에서의 명사를 명사사전에 추가하는 방법으로
사전을 보강하는 방안이 괜찮을 것 같습니다.