형태소 분석기 |
---|
1. 한국어 형태소 분석의 개요
1.1. 형태소 분석이란
형태소 분석이란 자연 언어 분석의 첫 단계로서 단어(한국어의 경우 어절)를 구성하는 각각의 형태소들을 인식하고 불규칙 활용이나 축약, 탈락 현상이 일어난 경우 원형을 복원하는 과정을 말한다(강승식 저).
1.2. 형태소의 정의
형태소란 단어(어절)을 구성하고 있는 최소한의 언어 요소라고 할 수 있다. 가장 쉽게 생각할 수 있는 것이 '명사', '대명사', '수사' 등의 체언, '형용사', '동사' 등의 '용언', '부사', '관형사', '감탄사' 등의 독립언, '조사', '어미', '선어말어미', '접사' 등의 기능어가 있다.
형태소는 실질적인 의미를 가지고 있는 실질형태소와 기능적 요소를 담당하고 있는 기능형태소로 크게 양분되며, 색인어 추출을 위한 형태소 분석시 이 둘을 분리하는 과정이 우선시 된다. 한마디로 형태소는 더 이상 별개의 의미나 기능으로 분리할 수 없는 최소한의 언어 요소라고 보면 될 듯 하다.
1.3. 한국어 형태소 분석
우리가 검색엔진 제작시 형태소 분석에 봉착할 수 밖에 없는 이유가 있다. 바로 우리가 다루는 언어가 한국어이기 때문이다.
영어를 보면 소년이라는 의미의 'boy'가 복수로 변하기 위해서는 끝에 '-s'를 첨가하면 된다. 'boys'가 바로 그것이다. 특별히 단어의 형태가 크게 변한다거나 다양한 기능어가 붙지 않는다. 그러나 한국어는 다르다.
한국어의 '소년'이라는 명사에는 '소년의', '소년은', '소년들', 소년인가요', '소년아' 등 각종 기능어 및 접사, 용언화 과정 등이 가능하다. 따라서 이러한 언어적 변화 현상을 찾아내어 최종의 형태소를 인식해야 한다. 그 규칙을 찾아내기란 쉽지 않고 이를 기계적으로 구현하는 것 역시 만만치 않다.
1.4. 형태소 분석의 필요성
그렇다면 한국어에 왜 형태소 분석이 필요할까. 바로 색인어 추출을 위해서이다. 우리가 사용하는 색인어 및 검색어는 주로 명사 위주이다. 이런 명사를 추출하기 위해서는 불행히도 각종 기능어와 타 품사, 형태 변형 등의 인식이 필요하게 된다. 물론 형태소 분석없이 별도의 색인어 추출 방법을 사용하게 된다면 관심을 가지지 않아도 되는 것은 당연하다.
검색엔진에 있어 색인 DB의 구조와 랭킹 알고리즘 역시 중요하나 가장 적합하고 확실한 색인어가 저장되어 있어야만 그 성능이 탁월할 수 있다. 한국어 텍스트를 단순히 공백(어절)으로 나눠 색인하게 되면 초라한 검색 결과를 보게 되는 이치이다.
2. 사전지식
형태소 분석을 위해서는 PHP 등 웹언어를 이용한 프로그래밍적 지식으로는 부족하다. 문자열에 대한 분석과 국문학적 지식, 그리고 자료구조에 대한 지식 등이 필요하다.
2.1. 한글 코드
한글 코드에 대해서는 어느 정도 지식이 있으리라고 여겨진다. 형태소 분석에서 한글 코드가 등장하는 이유는 한글이 초성, 중성, 종성으로 구성되어 있기 때문이다. 한글은 2byte 코드로 총 16bit로 되어 있다. 불행히도 이 16bit를 3등분 해야 하는 과정에서 한글 코드가 필요하게 된다.
PHP 언어에서 한글 코드는 완성형을 지원한다. 완성형 한글 코드는 총 2,350글자에 각자의 코드를 부여한 것이다. 따라서 하나의 음절을 초성, 중성, 종성으로 분리하기 위해서는 조합형 한글 코드로 변환하는 과정이 필수적이다. 유니코드에 대해서는 언급하지 않겠다.
문자열을 처리할 때 1byte짜리 문자는 숫자, 영문자, 제어문자이다. 2byte짜리 문자는 한글, 한자, 일본어, 특수문자를 포함한다. 한글의 경우 2byte 중 상위코드는 25개, 하위코드는 92개로 구성되어 있음을 항상 염두해 두어야 한다.
2.2. 어절의 문자열 유형
어절(단어)의 문자열 유형이란 하나의 어절이 한글, 한자, 영문자, 숫자, 특수기호 등 어느 것을 포함하고 있느냐를 가지고 분류한 것이다. 예를 들어 '색인어'라는 어절(단어)은 한글로만, 'search'라는 어절은 영문자만, 'MP3'는 영문자와 숫자, 'MP3폰'은 영문자와 숫자와 한글, '文化민족'은 한자와 한글, '우리(We)는'은 한글과 기호와 영문자로 구성되어 있다.
어절의 문자열 유형이 중요한 이유는 영문자와 숫자, 특수기호, 한자 등도 색인어로서 무시할 수 없기 때문이다. 특히 'MP3'같은 단어는 중요 색인어 및 검색어이다. 따라서 각 문자열 유형별 색인어 추출 기준을 세워야 한다.
제안하는 기준은 다음과 같다.
-> 특수문자 및 기호의 경우 : 무조건 공백으로 치환한다(C++, C#, A+, 100% 등의 단어가 문제된다)
-> 영문자와 숫자를 포함한 문자열 : 인접한 영문자와 숫자가 개별적으로 3음절 이상이 아니면 분리하지 않는다. 따라서 'MP3'의 경우 분리되지 않는다. 그러나 'BEA123'은 'BEA'와 '123'으로 분리된다.
-> 영문자 또는 숫자와 한글이 포함된 문자열 : 인접한 영문자와 한글, 또는 숫자와 한글 중 영문자와 숫자가 2음절 이상이면 한글과 분리한다. 한글 역시 2음절 이상인 경우에만 분리한다. 따라서 'LG상사'는 분리되지만 'e비즈니스'의 경우에는 분리되지 않는다.
-> 한글과 한자를 포함한 문자열 : 한자는 2byte 문자로 숫자와 영문자와는 무조건 분리한다. 또한 한글과도 무조건 분리한다.
-> 한글로만 구성된 문자열 : 별다른 분리없이 형태소 분석을 하게 된다.
2.3. 자료구조
대부분의 검색엔진은 C언어로 구성되어 있다. 그래서인지 자료를 저장하고 탐색하고, 삽입/수정/삭제에서 별도의 자료구조를 가지게 된다. PHP의 경우에도 이를 모방한 자료구조가 필요하다. 예를 들어 전자사전을 구성할 때 사전에 들어갈 각 단어를 'Tree' 구조나 'Trie' 구조로 저장하고 탐색해야 한다.
PHP에서는 다중배열의 사용이 용이하므로 다중배열을 이용하여 C언어와 유사한 자료구조를 취한다. 이에 대해서는 독창적인 알고리즘을 고안해 내야 할 것이다.
2.4. 품사의 체계
형태소 분석을 위해서는 어절에 포함된 형태소의 품사를 결정해 놓아야 한다. 크게 체언(명사, 대명사, 수사), 용언(형용사, 동사), 독립언(부사, 관형사, 감탄사), 기능어(조사, 어미, 선어말어미, 접사 등)로 나늬며, 더욱 세세하게 구분되는 경우도 있다.
2.5. 어절 전이 현상
어절 전이 현상이란 한글 어절의 형성 과정이다. 국문학적 지식이 필요하다. 예를 들어 체언 뒤에는 조사가 붙는다든지, 용언 뒤에는 어미가 붙는다든지 하는 규칙이다. 체언과 용언 뒤에 조사와 어미, 선어말어미, 접사 등의 기능어가 붙어 어절의 성격이 달라지게 되는 현상이다.
3. 형태소 분석기의 기능
형태소 분석기가 가져야 할 기능은 크게 문자열 유형의 파악 및 이에 따른 분리 과정, 전자사전의 탐색 기능, 각종 규칙 연산(체언 판단, 용언 판단, 품사 전이 판단 등), 복합명사 처리 등이다.
3.1. 문자열 유형의 파악
형태소 분석기는 우선 공백을 기준으로 텍스트를 나눠 배열에 담는다. 이를 우리는 쉽게 '어절'이라 부른다. 위에서 언급한 대로 어절의 문자열 유형을 파악한다. 그런 후 일정 기준에 따라 색인어로서의 어절을 분리한다.
한글을 포함한 어절일 경우 본격적인 형태소 분석 과정에 들어간다.
3.2. 전자사전의 구성 및 탐색 기능
형태소 분석을 위해서 국내의 상용 제품들은 크게 세가지 방식을 사용한다. 하나는 모든 형태소 어휘와 일정 규칙을 사전에 담아 놓고 이를 탐색하여 결과를 반환하는 '사전 베이스', 별도의 전자사전 없이 무수한 오토마타 등 규칙의 연산을 통해 결과를 반환하는 '규칙 베이스', 그리고 이를 적절히 조화한 '절충형'이다.
알고 있는 바로는 엠파스의 경우 철저히 '사전 베이스 형태소 분석기'를 사용한다. 이는 성신여대 심광섭 교수의 작품이다. 각종 명사 및 동사, 형용사, 기능어 등의 어휘와 각 어휘별, 음절별 규칙을 전자사전에 모두 담아 놓고 사전 탐색만으로 결과를 반환한다.
그러나 대부분의 형태소 분석기는 명사나 독립언, 동사와 형용사, 조사와 어미 등 어휘와 그 문법적 표지를 저장한 사전의 탐색과 이를 위주로 한 규칙의 연산을 통한다. 네이버의 경우가 대표적일 것이다.
그렇다면 전자사전이란 무엇인가. 전자사전이란 사람이 읽어서 이해하는 것이 아니라 기계인 컴퓨터가 이해할 수 있는 사전이다. 저장 장소의 최적화와 탐색 속도의 향상을 위한 것으로 PHP로는 다중배열을 이용한 반음절 Trie 구조가 가장 적합하다는 생각이다.
3.3. 규칙의 연산
특정 어절이 체언이라면 이는 명사, 수사, 또는 대명사와 기능어인 조사의 결합일 것이다. 만일 동사라면 어미와 동사 형태소의 결합으로 이루어져 있을 것이다. 이러한 판단을 하기 위한 특정 조건의 규칙이 필요하며, 최소한의 연산으로 속도 향상을 꾀해야 한다.
3.4. 복합명사 처리
별도의 글에서 상세히 정리해 보겠지만, 한글 명사, 특히 색인어로서 가치가 있는 명사는 주로 고유명사와 복합명사이다. 특히 고유명사 중에는 유난히 복합명사가 많다. 이를 단일명사로 하나 하나 분리해 내야만 탁월한 성능의 색인어 추출기가 될 수 있다.
'기본 카테고리' 카테고리의 다른 글
번지점프를 하다!!! bungee jumping (0) | 2008.05.12 |
---|---|
게임프로그래밍전문가자격증사진 (1) | 2008.05.12 |
한글 코드에 대하여 (0) | 2008.05.12 |
점프 투 파이썬 (0) | 2008.05.12 |
[MFC/인터페이스] 버튼의 동적 생성과 메시지를 처리하는 방법.. (0) | 2008.05.08 |