본문 바로가기

Lucene

[about Lucene] 루씬으로 검색엔진 개발하기 - Analyzer (4) -

앞선 포스트에서는
Analyzer의 기본이 되는 Tokenizer를 구현하여 보았습니다.

다시 한번 말씀드리면 Analyzer
Reader - Tokenizer - TokenFilter - TokenFilter - TokenFilter...
이런식으로 1개의 Tokenizer와 N개의 TokenFilter로 구성이 되어있습니다.
여기서는 그 TokenFilter 중 하나를 구현해보려 합니다.

앞에서 여러개의 Filter를 말씀드렸었습니다.

기본적으로 "어미사전"으로부터 어미를 제거하는 StemFilter
"동의어 사전"으로부터 동의어를 추출하는 SynonymFilter
"명사사전"으로부터 명사를 추출하는 NounExtractFilter
"불용어사전"으로부터 불용어 처리를 하는 StopFilter
"복합명사사전"으로부터 주어진 키워드를 사전에 정의된 명사들로 추출하는 CompoundsNounExtractFilter

등이 있는데요..
이번 프로젝트에서는 불용어제거 필터와 명사사전으로부터 명사를 추출하는
NounExtractFilter 그리고 동의어를 만들어내는 동의어 필터를 만들어보겠습니다.

이 두개 필터의 구현을 보시면 다른 원하시는 필터도 얼마든지 구현이 가능하실 것이라고 생각됩니다.

심플하게 만들어볼게요..~

우선 테스트케이스를 만들어보겠습니다.

 
DevysStopFilterTest.java
여기서 제거 할 불용어는 the와 . 입니다.
the는 영어 문장에서 가장 일반적으로 불용어 리스트에 들어가는 단어입니다. (a와 an과 함께..)
그리고 앞서 만든 Tokenizer에서 "."이 추출되는 것을 보셨을텐데요
이 "."을 이 StopFilter에서 제거해보도록 하겠습니다.

 
DevysStopFilter.java
로직은 생각보다 간단합니다.
Filter들은 모두 TokenFilter를 상속받고 마찬가지로 TokenStream의 추상메서드는 incrementToken메서드를
구현해야 합니다. 여기서는 불용어 리스트를 그냥 List로 선언하였고, 생성자에서 initStopWord메서드를 통해서
우리가 불용어로 설정한 "the"와 "."을 등록하여주고 있습니다.

실제로는 이 사전을 원하시는 방법으로 관리하시면 되겠죠.

특이한것이 enablePositionIncrements 이런 필드 데이터가 있습니다.

이것은 불용어를 제거한 후 나오는 Token에 대해서
위치정보를 불용어를 포함하여 설정 할 것인지 아니면 아예 불용어가 없던 상태로 생각하여
설정 할 것인지에 대한 flag 값입니다.

예를 들어서 아래와 같은 문장이 있다고 해보겠습니다.

"나는 the 개발자다"

"the"가 불용어라고 했을 때 enablePositionIncrements가 true인경우
"나는" : 1
"the" : 제거
"개발자다" : 2
이 됩니다. 이전 추출된 키워드와의 위치정보가 2이 되는 것이구요..

false인 경우에는
"나는" : 1
"the" : 제거
"개발자다" : 1
가 됩니다. 불용어 "the"는 제거되었지만 그 다음 키워드인 "개발자다"의 위치정보는
"the"를 기준으로하여 설정되게 됩니다.

이것은 나중에 검색식에서 키워드의 위치정보를 사용하여 검색하여야 할 때
필요한 옵션입니다. 루씬에서는 일반적으로 phraseQuery라고.. 합니다.
제가 만들어나갈 Analyzer에서는 사용되지 않기 때문에 자세한 내용은
책을 보시면 좋을 것 같습니다.

다만, 이런식으로 Filter에서는 필요한 속성에 대한 조절을 할 수도 있다는 것을 보여드리기 위하여
코드에 삽입하였습니다.

전체적인 로직은 간단합니다.
Tokenizer로부터 받은 결과를 가지고 불용어 리스트와 비교하여 불용어 사전에 등록된 키워드이면
무시하고 한번 더 loop를 돌리고 불용어 사전에 없는 키워드일 경우 true를 리턴합니다.

그렇게 되면 이 다음 Filter에서도 마찬가지로 tokenStream.incrementToken메서드의 리턴값이 true일 때에 대해서만
작업을 하게 될 것이므로 불용어가 추출되지 않도록 할 수 있는 것 입니다.

https://github.com/need4spd/aboutLucene
에서 체크아웃 받으 실 수 있습니다.