형태소 분석기 (Information POS tagger, word segmenter)
검색과 관련된 업무(정보처리기술과 관련된 직종 또는 관련 업무)를 하게되면 어떤것을 구현하거나 어떤 데이터를 처리해야 할 때 모든 것에 기본적으로 부딪히는 문제의 첫번째가 형태소분석기입니다.
한국어의 특성상 형태소분석기가 없으면 자연어처리가 매우어렵습니다. (반면에 미국 친구들은 정말 쉽게 막가더군요. -ㅁ-)
형태소분석기는 품사를 태깅해주는(무슨 품사인지 마킹해주는)는 라이브러리라고 생각하면 편합니다.
영어로는 POS(Part of Speech) tagger라고 하고 한국과 일본에서는 Morphology Analyzer라고도 부릅니다. (의미상으로도 영어는 POS tagger가 맞고 한국어는 Morphology Analyzer가 맞는것 같습니다)
영어에서의 품사는 문장에서 위치나 말할 때 끊어 있는 띄어쓰기 단위로 되어 있기때문이고 일본어와 한국어에서는 단어를 다 잘라내야 제대로 형태소를 갈라낼 수 있습니다.
“우리는 한국인이다”에서 “우리”는 명사이고 “는”은 조사입니다. 단어를 쪼개야 하기 때문인데.
영어의 “We are Korean”에서 “We”그대로 명사이고 더 쪼갤 필요가 없기 때문입니다.
형태소분석기의 기능
형태소 분석기에서 기본적으로 제공하는 기능은 품사태깅과 띄어쓰기입니다. (띄어써야 할 곳에 여백을 만들어주고 동사, 명사, 형용사등의 사자 돌림의 것들이 뭔지 구별해주는..)
품사를 태깅하기 위해서는 띄어쓰기와 기본형 변환등의 문제를 해결해야 하는데 필연적으로 자동띄어쓰기를 지원하게 됩니다. (물론 구현체에 따라 아닌 것도 있습니다.)
워드세그멘터는 품사의 태깅없이 자동띄어쓰기만을 해주는 것을 말하는데 검색의 인덱서에 주로 사용됩니다. (인덱서는 띄어쓰기를 문법에 맞지 않게 과하게 하는 경우가 많습니다만 이게 처리할 때 유리한 점이 많이 있습니다)
보통은 형태소분석기에 품사태깅 도구와 자동띄어쓰기가 함께 포함되어 있습니다.
텍스트마이닝을 하려면 반드시 필요할까?
물론 모든 텍스트 데이터 처리나 텍스트 마이닝이라고 해서 반드시 형태소분석기가 필요한 것은 아닙니다만, 사실상 텍스트 마이닝이나 자연어처리와 관련있는 작업을 하게 되면 대부분의 경우 필요하다고 봐야 합니다.
쉽게 예를들어 오픈소스 검색엔진인 Lucene을 설치해서 뭔가 개인프로젝트나 학생인 경우에 졸업과제 같은 것을 하려고 해도 우선 걸리는 것이 형태소분석기이고, 그 외에도 조금 전문적인일으로 스팸 필터링(Spam filtering), 질의어 분류(Query categorization), 문서 중복 제거(Document Deduplication) 등은 대부분의 경우에 형태소분석기가 없으면 작업이 힘들거나 좋은 성능이나 결과를 포기해야 합니다. 더나가서는 Language Parser라 불리는 구문분석기가 필요해질 때가 있습니다. (보통 NLP에서 영어로 parser라고 하면 구문분석기를 말합니다).
형태소분석기가 없을때 대안으로 하는 것이 N-gram으로 글자(character)를 unit의 기본으로 잡고 처리하거나 하는 원초적인 방법인데 작업도 힘들고 결과물도 대게 좋지 않습니다. 설령 그와 같이 작업이 쉽게 가능하고 비슷한 품질이 나왔다고 해서 향 후에 발생할 모든 잠재적인 문제들에 대해서 미리 대비하는 해결책은 아니라서 섣불리 접근하기 힘듭니다.
보통의 정보처리회사(보통 인터넷기업이나 검색회사 또는 데이터마이닝 회사겠지요)에서는 몇 개의 형태소분석기가 이미 자체적으로 구비되어 있으므로 회사내에서의 업무라면 그냥 가져다 쓰면 되겠지만 개인적으로 하고 싶은 일에는 보통 회사자산을 가져다 쓰면 안되도록 금지 되어 있어, 개인 프로젝트를 할 때 저작권이나 사용료 지불없이 쓸만한 것이 있는지 간단하게 정보를 수집해 봤습니다. (어..논문같은 것을 쓴다거나 할때요)
은전한닢 형태소 분석기
일본어 형태소 분석기인 MeCab를 한국어 버전으로 포팅한 것으로 국내에서 가장 많이 쓰이는 오픈소스 형태소분석기입니다. 현재 가장 쉽게 쓸 수 있습니다.
꼬꼬마 형태소 분석기
세종계획 결과물을 이용해서 제작한 형태소 분석기입니다. 소스코드를 입수할 수 있고 결과물도 나쁘지 않습니다. 소스코드는 별도로 요청을 하셔야 합니다. Java로 만들어져 있습니다. 갱신이 된지 좀 오래되었습니다.
한나눔 형태소 분석기
카이스트에서 만든 형태소분석기입니다. 최근에는 연구용이나 개인용으로는 꼬꼬마 아니면 한나눔을 주로 사용하는 것 같습니다. 한나눔도 Java로 만들어져 있습니다. 최근 업데이트가 거의 없습니다.
- 링크: 한나눔 형태소 분석기 프로젝트
KISTI 검색엔진 및 형태소 분석기
실제로 사용해보지는 않았습니다만 괜찮다고 들었습니다.
- www.kristalinfo.com
- http://www.kristalinfo.com/K-Lab/idx/
http://www.kristalinfo.com/K-Lab/ma/
락끄님의 형태소분석기 데모
역시 사용해 보지 않았습니다.
- http://ids.snu.ac.kr/wiki/Morpheme_Analyzer_Demo
HAM – 강승식 교수님의 Hangul Analysis Module
국내에서는 워낙 유명한 것이라 따로 설명이 필요 없지요. 라이센스비용을 받으시는 걸로 알고 있습니다. 많이는 아니지만 사용해 봤었는데 좋았었습니다. 지금은 사용을 하지 않으므로…
- http://nlp.kookmin.ac.kr/
- http://nlp.kookmin.ac.kr/data/han-dic.html – 그밖에 다양한 text문서 자료/프로그램
- http://nlp.kookmin.ac.kr/down/data/KorStems.zip – 조사/어미 자료
모란 형태소분석기 MORAN
안써봐서 잘 모르겠습니다만 나쁘지 않다고 들었습니다.
- 링크: http://www.moransoft.co.kr/
검색엔진 및 형태소분석기 – PHP형태소 분석기
PHP의 extension인지 native인지 잘 모르겠습니다. PHP전용이라면 쪼끔 그렇습니다. 여러 시스템에 유연하게 연동하는데 불편해서 활용도가 떨어질 가능성이 있습니다. 품질은 잘 모르겠습니다.
- 링크: http://lab.zagia.com/
이상호님의 KTS
오래전에 작업을 중단하신 걸로 알고 있습니다.
- http://kldp.net/projects/kts
- http://chem.skku.ac.kr/~kle/main/KTS
포항공대 NLP연구실
- http://nlp.postech.ac.kr
- http://nlp.postech.ac.kr/~project/DownLoad/index.html – binary를 다운로드 받을 수 있습니다
- http://nlp.postech.ac.kr/DownLoad/cgi-bin/POSTAG/SKOPE99a_demo.tar.gz
이 외에도 찾아 보면 의외로 많이 있습니다.
기타 한글 및 한국어 처리에 도움이 될만한 것들
- 한글코드: http://sparcs.kaist.ac.kr/~jwjung/seminar/hangul-i18n/ko-code.html
- 한글코드: http://www.klipl.com/info/hgcode/hgcd_rpt.html
- NLP관련 링크 모음: http://borame.cs.pusan.ac.kr/ai_home/site/site1.html
선택할 때 고려사항
개인적으로 한국어 형태소분석기를 볼 때 응용개발자의 입장에서 중요하게 생각하는 것은 우선 아래 3가지를 먼저 생각하는데요.
물론 형태소분석기 자체를 개발하거나 연구하는 분들의 생각과는 많이 다를 수도 있을 것 같습니다
일관성
결과물이 일관성있게 잘 나와야 합니다. 조그만 차이에도 단어 띄어쓰기나 품사태깅이 들쭉날쭉하거나 예외에 따른 변화가 너무 많거나 후처리로 제어 해야 할 것들이 너무 많으면 후속 작업을 하기가 매우 힘듭니다. 일관성이 영 아닌 것들도 많이 있으므로 쓰기전에 테스트가 필요합니다. 기분석 사전이 얼마나 잘 생성되어 있는지에 따라 달라지는데 본인이 생성한 것이 아니면 테스트 해보기전에 알지 못하는 것이 많습니다. 보통은 알고리즘이나 구현체 문제라기 보다는 학습데이터의 부족과 사전의 부족이 아닌가 싶습니다.
속도
실행속도가 가능한 빠른것이 유리합니다. 형태소분석기의 속도가 왜 빨라야 하는지 잘 이해하지 못하겠다고 말씀하시는 분들이 있는데, 경우에 따라 다 다르겠지만 검색엔진에서 searcher, indexer로 쓰이는 것 외에도 텍스트 처리와 관련해서 서비스 형태(대몬 형태)로 응용구현체가 구동이 되는 경우가 많이 있습니다. 서비스형태의 응용구현체는 형태소분석기가 소모하는 시간이 길면 연산자원이 많이 소요되므로 그 자체로 부담이고 손해입니다. 형태소 분석기 자체가 자원소모가 꽤 많은 편이라 서비스나 운영시스템에 전개하는 것 까지 고려해야할 필요가 있습니다. 최근에는 하드웨어들이 좋아졌기 때문에 형태소분석기의 라이브러리 성능도 심하게 따지지는 않는 것 같습니다만 그럼에도 불구하고 가능하다면 최대한 빠른 것이 좋습니다. 이런 이유의 한가지로 외국산 고성능 형태소 분석기들은 여전히 C/C++로 작성되고 있는 것을 볼 수 있습니다. (다 이유가 있다는…)
유연성
유연성이란 잘못된 것 또는 변화된 상황에 빨리 대처할 수 있게 유연한 장치들을 가지고 있어야 하고 빠르게 대처할 수 있어야 한다는 것입니다. 예외사항이나 특이한 문제가 발생했을 때 사전을 수정하거나 예외 처리를 할 수 있는 각종 장치가 다 마련되어 있어야 합니다. 형태소 분석기를 사용하다보면 도메인(domain)별로 사전을 따로 관리해야 할 수 있습니다. 특히 복합명사나 도메인별로 주로 쓰는 단어에 대한 태깅이 달라지는 문제가 발생할 수 있는데 이럴때마다 형태소 분석기의 기분석 사전을 업데이트하는 것은 위험합니다. 후처리로 해결을 해야 하는데 이런 지원 기능이 내장되어 있거나 추가 구현을 쉽게 할 수 있게 되어 있어야 합니다. 보통은 후처리사전(사용자 사전)과 언어처리를 위한 유틸리티 라이브러리로 후처리를 합니다.
유연성의 또다른 측면으로 여러 응용구현체에서 가져다 쓸 수 있어야 합니다. 형태소 분석기들이 주로 C/C++로 작성되는 또 하나의 이유는 여러 랭귀지들의 패키지로 제공하기 쉽다는데 있습니다. perl, php, python, java 등입니다. 서비스나 응용 구현체를 어떤 것으로 만들지는 알 수 없으므로 가능하다면 많은 시스템에서 적용이 가능한 형태로 되어 있는 것을 쓰는 것이 나중을 대비해서 유리합니다.