본문 바로가기

Lucene

Lucene 3.0 TokenStream. 그리고 Attribute.

예전에 만들었던 한글 명사 추출 Analyzer를 공개하려고 하다가
그 Analyzer의 core 버전이 2.4.0 base여서 이것을 최신 루씬 버전인
3.0으로 컨버팅 하려고 했는데... 바뀐게 한두가지가 아니라서.. 일단 바뀐 부분부터 공부를
해야겠다 싶었다. -_-;

제일 당황스러운 부분이...
TokenStream.next(Token token) 메서드가 사라진 것이었다. -_-;

이 부분이 TokenStream.incrementToken() 메서드를 대체가 되었는데 이건 조만간 다시 포스팅 하기로 하고..
일단, 기존에 사용되던 Token이란 클래스가 남아있기는 한데..
대부분 Attribute 클래스에 기초한 놈들로 변경이 된 것 같다.

예전에 하나의 String에서 Analyzer로 분석 된 Term 리스트를 얻으려는 소스는
아래와 같았다.


TokenStream의 next 메서드로 다음 Analyzer로 분석 된 Token들을 하나씩 얻어내고
거기서 Token의 term을 사용해서 단어를 얻거나 offset등의 데이터들을 모두 얻어낼 수 있었는데
이 next() 메서드가 사라진 것이다. -_-;

그 대신 Attribute 클래스를 상속한 TermAttribute 혹은 OffsetAttribute등의 클래스를 이용해서 위의 작업을 대신 할 수 있다.
다른 Attribute도 많이 존재한다.
결국, 예전에 Token 클래스가 가지고 있던 속성들이 각각의 클래스로 분리 되서 나온 것이라고 보면 정확 할 것 같다.


TokenStream으로부터 Attribute인 TermAttribute와 OffsetAttribute를 얻어내고 이것을 통해서 단어와 위치 정보를
보여주고 있다.
그리고, incrementToken 메서드를 사용해서 다음 Term으로의 접근을 하고 있다.

결국, 이전 버전의 Tokenizer나 TokenFilter에서 next메서드가 하는 일을
incrementToken 메서드가 대신 하고 있는 것이다. 다만, 리턴을 해주는 것이 아니라
내부적으로 Attribute에 set을 하고 있는 것.. 그리고 이것을 그냥 가져다 쓰는 방식.

이게 왜 이렇게 바뀌었나 살펴보면.. TokenStream 메서드 중에
현재 상태를 capture하는 등의 메서드가 추가 된 것이 보이는데 이것을 위해서
Attribute들이 전부 멤버로 들어갔나 싶다.. 아직 자세히 못 들여다봐서..

결국, 내가 만들었던 Analyzer의 Filter들과 모듈을 거의 전부
뜯어 고쳐야 한다는 얘기가 나온다.. 어휴.... -.-

그외 다른 것도 모르는 것 천지.. 하나하나 이것저것 해보는 수 밖에.. ㄷㄷ;;

이전에 사용되던 Token 클래스도
TokenStream.addAttributeImpl 메서드를 통해서 사용 할 수 있는 것 같기는 한데
이건 구현되어있는 Tokenizer에 따라서 다른 것 같다.

그 Tokenizer가ㅏ AttributeImpl에도 값을 set 해주면 값이 들어갈 것이고..
아니면 안 들어갈 것이고..

참고로 가장 많이 사용되는 (루씬 analyzer에서.)
charTokenizer는
incrementToken메서드가 아래와 같이 구현 되어 있다.


이전 버전과 비교해보면 하는 일은 거의 같다.
다만 메서드 이름이 바뀌고 Token에 추출 된 결과를 넣어 주는 것이 아니라
TermAttribute와 OffsetAttribute에 넣어주는 것...

그러면, 이 Tokenizer가 도대체 어떤 Attribute와 AttributeImpl을 가지고 있는지 알아야 할 텐데..
보니까 TokenStream에 두 클래스에 대한 Iterator를 얻을 수 있는 메서드가 있다.
그걸 사용하면 될 듯..