언어처리

POS(Part of speech) tagger

고요한하늘... 2008. 3. 8. 13:21

 

형태소 분석기의 일부 모듈중에 다른 모듈에 비해 중요성이나 크기가 상대적으로 크기 때문에 분리해서 이야기하는 모듈이 두가지 있다.

그 첫번째는 복합명사 분해 모듈이고 두번째는 태거이다.

 

복합명사 분해 모듈은 말 그대로 (명사+명사+명사)로 이뤄진 형태를 '명사/명사/명사'의 형태로 잘게 쪼개는 작업을 하는 모듈을 말한다.

그러면 태거가(여기서 태거는 pos태거를 의미한다)하는 기능은?

 

형태소 분석과정에서 여러개의 분석 후보가 생성될수 있다.

더군다나 분석단위가 어절이라면 더욱 많은 분석 후보가  만들어진다.(정보부족)

 

가장 대표적인 '나는'의 경우만 보아도

앞뒤에 출현하는 문맥 정보 없이 '나는'은 '날다(fly)'의 의미일 수도 있고 '나(I)의 의미일 수도 있다.

 

이렇게 분석 후보가 한가지 이상일 때 앞 뒤 문맥이나 태그 정보를 활용해서 '날다(fly)'인지 나(I)인지를 결정해주는 역할을 하는 것이 태거이다.

 

'하늘을 나는 새'의 경우에는 '날다(fly)'일 것이고

'그대와 나는 어울리지 않아'에서는 '나(I)가 될것이다.

 

그러면 태거는 검색에서 어떻게 사용될수 있을까.

만약 검색어로 '가야'라는 단어가 들어왔을 경우

십중팔구 이것은 명사 '가야'를 찾기 위함일 것이다.

그런데 아타깝게 대부분의 검색엔진에서 '가야'로 검색하면 그것이 명사 '가야'인지 가다의 활용형 '가야'인지 구분하지 못한다.

입력으로 들어온 쿼리 '가야'가 명사라고 할지라도 문서에 나타나는 '가야'가 동사인지 명사인지를 구분하지 않기 때문이다.

이런 문제를 해결하기 위해 사용하는 기술이 태깅이다.

 

그러면 왜 검색에 태깅을 사용하지 않는 것일까...

 

앞서 이야기 한것처럼 동사 '가야'와 명사 '가야'를 구분해서 저장해야 한다

검색엔진에서는 검색 시간 단축을 위해서 역색인이라는 것을 만든다.

역색인이라는 것은 키워드당 문서로써 어떤 키워드가 어떤 문서에 있는지를 저장해 놓은 형태의 자료구조이다.

 

간단히 예를 들면

 

문서1: 학교에 가야 한다(형태소 분석 : 학교, 가야) - '가야'가 명사인지 동사인지 구분하지 못함

문서2: 가야문명(형태소 분석 : 가야/문명)

 

역색인1

학교 : 문서1

가야 : 문서1, 문서2

문명 : 문서2

 

위와 같이 역색인이 만들어지는데

동사 '가야'와 명사 '가야'를 태거를 사용해서 구분하면

역색인 엔트리가 달라진다.

 

역색인2

학교/명사 : 문서1

가야/동사 : 문서1

가야/명사:  문서2

문명/명사 : 문서2

 

앞쪽에 있는 키워드에 부가적인 정보가 추가되었고 색인어수도 앞쪽에 3개에 비해서 1개가 늘어났다.

 

결론적으로 태깅을 이용해서 색인어에 identity를 부여해서 역색인을 만들면 역색인의 크기가 커진다.

그런데 이렇게 문제가 간단하지 않다.

최근의 검색엔진은 검색 정확도를 위해서 모든 색인어에 대해서 위치정보를 저장한다.

역색인3

학교/명사 : 문서 1 : 1

가야/동사 : 문서 1 : 2

가야 명사 : 문서  2 : 1

문명/명사 : 문서 2 : 2

 

포지션 정보가 추가되면 위와 같이 역색인이 만들어지는데 역색인 1에 비해 역색인 3은 가지고 있는 정보가 훨씬 많아 졌다.

 

역색인이 커지는 문제는 단순히 파일 사이즈가 커지는 문제가 아니고

한번에 역색인이 메모리 상에 올라갈수 있느냐 없느냐의 문제로 바뀐다.

왜냐하면 메모리상에 올라가지 않는다면 페이징이 발생하고 이것은 검색 속도에 막대한 영향을 주기 때문이다.

 

더군다나 최근의 경향은 거의 모든 형태소 분석결과를 색인어로 추출하는 상태이다. 이전과 같이 명사만을 추출할때에 비해서 색인어수가 배이상 증가하는 추세이고, 데이터 크기도 다음카페검색의 경우 4G가 된다고 한다.

 

만약 카페검색 문서의 평균 크기가 2K라고 하면

단위 byte

1k = 1024

1m = 1024k

1g = 1024m

1g = 1024*1024*1024 = 1073741824

4G = 4 * 1073741824

2k = 2048

2048 * 4 * 1073741824 = 8796093022208 =~ 8테라

8테라의 데이터를 처리해야한다.

 

이야기가 두서 없이 전개되었다...ㅡㅡ;

대용량 데이터를 색인하는 구조에서 더군다나 full포지션 정보를 저장하면서 추가적으로 정보를 담는것은 결코 쉬운일이 아닌 것 같다.

 

 

 

'언어처리' 카테고리의 다른 글

etri(에트리) tagset(태그셋)  (0) 2008.03.13
동의어 처리...( 검색에서 )  (0) 2008.03.09
세종(sejong) 태그셋(tagset)  (0) 2008.02.26
띄어쓰기의 어려움 bigram 2-1  (0) 2008.02.03
띄어쓰기  (0) 2008.01.16