상세 컨텐츠

본문 제목

[KIWI] 좋아, 형태소 분석기를 만들어봅시다. - 0

프로그래밍/NLP

by ∫2tdt=t²+c 2017. 3. 26. 21:55

본문

2월 말부터 갑자기 시작한 일이 있는데, 한국어 형태소 분석기를 직접 만들어 보는 일이었습니다. 처음에는 과연 할 수 있을까 싶기도 해서 블로그에 기록을 안 남기고 조용히 진행하고 있었습니다. 근데 기록을 남기지 않으니 시간이 갈 수록 헤매게 되는거 같아서 어느 정도 틀이 잡힌 시점에서 차곡차곡 기록을 남겨가며 프로젝트를 진행하기로 결심했습니다.


(이미지 출처: http://akarui-japan.deviantart.com/art/Kiwi-Icon-100334949)


뜬금없이 왜 형태소 분석기를..?

형태소 분석기를 만드는 삽질을 하게 된 이유를 구구절절히 풀자면 길어질거 같아서 짧게 정리하도록 할게요. 시작은 작년 초에 만들었던 KorpuSQL(http://bab2min.tistory.com/473) 이었습니다. 군생활하면서 말뭉치 처리를 쉽게 할 수 있도록 Corpus Query Language를 구상하다가, 기존의 관계형 DB에 말뭉치를 입력하는 것으로 방향을 전환하면서 만들게 된 것이죠. 그래서 비전공자들도 (나름대로는 쉽게) 말뭉치에서 각종 통계를 추출할 수 있도록 프로그램을 만들었습니다. 당연히 C++ 애호가로써 C++로 프로그램을 짰었지요.


KSQL의 한계는 사전에 형태소가 분석된 파일만을 입력으로 받을 수 있다는 것이었습니다. 즉 임의의 원시 말뭉치를 가지고 형태소 분석 후 각종 작업을 하기 위해서는 외부에서 형태소를 분석하고, 그 결과를 KSQL에 넣는 번거로운 작업을 해야했지요. 그래서 이미 개발된 형태소 분석기를 연동해서 원시 말뭉치를 입력받아도 자동으로 형태소 분석해주고 각종 처리를 할 수 있게 만들어야겠다고 생각을 해서 오픈된 형태소 분석기를 찾아봤습니다. c/c++계열로 개발된 것으로 보이는 U모 형태소 분석기가 있었으나, 분석기를 라이브러리 형태로 제공해주지 않을뿐더러 소스를 공개해주겠다는 말을 보고 연락을 주었으나, 협약 같은거 없이는 소스를 공개해줄 수 없다고 까였습니다. (게다가 유니코드 지원도 부실했구요)

그래서 하릴없이 Java로 작성된 Komoran과 Kkma를 붙이게 되었는데, 망할 JNI 녀석이 생각보다 불안정하고 환경에 따라 자주 뻗는 일이 많아서 결국 계획은 두동강나서 가라앉아버렸습니다. 그렇게 잊고선 1년을 잘 살다가...


올해 2월에 국문과 대학원 선배를 만나게 됐는데, 한국어 말뭉치 처리 프로그램이 대체로 빈약하다는 이야기를 듣고 공감하며 다시 한 번 뭔가 만들어봐야겠다는 의지가 불타오르게 됐습니다. 그리고 마침 아호-코라식 알고리즘을 공부하고 있었고, 또 마침 오랫동안 C++ 작업을 하지 않아 뭐라도 C++로 짜봐야겠다는 생각을 하고 있었고, 또 과연 제가 형태소 분석기를 만들수 있을만큼 실력이 되는지를 확인해보고 싶기도 햇구요... 모든게 맞아 떨어져서 바로 2월 말부터 코딩을 시작하게 되었습니다.


개발 계획

일단 핵심부분이 되는 형태소 분석기 부분은 속도를 위해 c++로 짜기로 결정했고, 이 분석기가 사용할 모델을 생성하는 것은 간편한 코딩을 위해 Python을 사용하기로 했습니다. 모델 생성에는 세종 계획 말뭉치를 사용하기로 했구요. 엄청난 걸 만들기보다는 가장 기본적인 걸 만들고 싶었기 때문에, 모델에는 일단 가장 흔히 사용되는 베이즈 추론을 사용하기로 했습니다. 따라서 계획은 다음과 같이 되겠습니다.


  1. 세종 계획 말뭉치를 Python으로 처리하여 형태소 등장 확률, 품사 간 전이확률, 형태소가 특정 품사일 확률을 추출한다.
  2. 어미 등이 동사에 붙어 형태가 변할 수 있으므로 그 변이규칙을 작성하고, Python 코드로 가능한 모든 결합형태를 나열한다.
  3. C++로 아호-코라식 알고리즘을 구현하여, 특정 한글 텍스트가 어떤 형태소로 분할될 수 있는지 나열하도록 한다.
  4. 1번에서 계산된 베이즈 확률 모델을 가지고 입력 텍스트가 해당 형태소 조합으로 분할될 확률을 추론하여 가장 큰 녀석을 반환한다.
  5. Profit!!!

프로젝트 이름 짓기

처음에 프로젝트 이름으로 생각한것들은 하나같이 밋밋해서, 뭔가 참신하면서도 친근한 이름을 붙여주고 싶었습니다. 고민하고 있을때 마침 뉴질랜드로 교환학생을 간 후배로부터 연락이 와서 이야기를 나누다가 키위 얘기를 듣게 되었어요. 그래서 Kiwi..? 생각을 하다가 Kiwi 단어에 뜻을 끼워맞춰 프로젝트 이름으로 정하게 되었습니다.


Korean Intelligent Word Identifier

(한국어 지능형 단어 식별기)


사실 지능형이니 뭐니 다 거짓말이고 제일 단순하고 전통적인 모델을 사용하는 형태소 분석기입니다. 그냥 키위가 좋아서 저렇게 지은것일뿐.


초창기에 겪었던 시행착오에 대해서는 다음 글에서 적도록 하겠습니다.

관련글 더보기

댓글 영역