개발중인 소프트웨어에 형태소 분석 및 품사태깅 기능이 필요하여 몇가지 품사태깅 솔루션을 테스트 중에 있는데, 진행상황 블로그에 간략히 공유합니다.
S/W 테스트 전에 자체적으로 요구사항을 만들어 해당사항이 충족되는 솔루션 위주로 테스트 제품군을 선정하였는데, 자체 요구사항은 다음과 같습니다.
1. 오픈소스 여부
2. 사용자 사전 지원 여부
상기 2가지 요구사항을 충족하는 솔루션으로 서베이를 진행하였고 서베이 결과 아래의 제품군들로 압축되었습니다.
위의 솔루션은 모두 오픈소스(Apache, GPL)이며, 사전기반으로 작동하기 때문에 커스텀 사전을 제작할수 있다는데 의미가 있습니다.
각 솔루션별로 장단점을 파악해 볼까요?
MeCab 은 2006년 일본어 형태소 분석기에서 시작되어 2013년 한국어 분석기로 fork 되었습니다.
지원 기능은, 형태소 파싱, 품사태깅, 개체명 추출 입니다.
개발 환경은 아래와 같습니다.
지원 OS : Linux, Windows
개발언어 : C++
사전형식 : csv
개발 언어가 C++ 인데 Java 기반인 Lucene 검색엔진에서 어떤식으로 동작하느냐..저도 처음엔 이것이 궁금하여 소스를 들여다 보았는데, 의외로 답은 간단하더군요.
MeCab-Ko 는 Solr 와 Elastic Search 형태소 분석기에 JNI(Java Native Interface)를 사용합니다.
미리 mecab 시스템 라이브러리가 OS 에 설치되어 있어야 합니다.
개발자분이 Linux 용 configure, make tool 등을 모두 만들어 두었더군요. 소스 컴파일 하여 설치하면 됩니다.
단점이라면, Linux 시스템에 익숙하지 않은 사용자는 사용하는데 어려운점이 있을수 있겠군요.
그럼 이번엔 카이스트에서 개발한 HanNanum 분석기를 볼까요?
한나눔에서 이야기하는 특징은 아래와 같습니다.
지원 OS : Platform independent
개발언어 : Java
사전형식 : txt
지원 기능은, 형태소 파싱, 품사태깅, 명사 추출 입니다.
사용자 사전은 보시면 알겠지만, 매우 간단한 구조로 구성되어 있어 커스텀 제작에 편리하게 되어있습니다.
개발언어로 Java를 사용하다 보니 간단히 Eclipse 에 프로젝트 포팅이 가능합니다.
여기까지 각 S/W의 기술적인 백그라운드를 살펴보았고,
다음은 우리 모두가 궁금해 하는, 정확도에 대해 테스트 해보겠습니다.
제가 형태소 분석기를 테스트 할때 가장 먼저 시험 해보는 문장이 있습니다.
"아버지가방에들어가신다."
위 문장에 대해 정확한 형태소 분석을 하려면 어떤식으로 진행하여야 할까요?
아마도 언어학자는 위 문장의 형태소 분석 방법 만으로도 논문 몇편은 쓰고도 남을 것입니다. :)
다음은 테스트 결과 입니다.
1. MeCab
>> input 아버지가방에들어가신다
<< output
아버지 NNG,*,F,아버지,*,*,*,*,*
가 JKS,*,F,가,*,*,*,*,*
방 NNG,*,T,방,*,*,*,*,*
에 JKB,*,F,에,*,*,*,*,*
들어가 VV,*,F,들어가,*,*,*,*,*
신다 EP+EC,*,F,신다,Inflect,EP,EC,시/EP+ㄴ다/EC,*
2. HanNanum
>> input 아버지가방에들어가신다
<< output
아버지가방에들어가/unk+이/jp+시/ep+ㄴ다/ef
두 분석기에 대한 결과가 사뭇 다르게 나옵니다. 위의 결과로만 봐서는 MeCab 의 정확도가 HanNanum 에 비해 압승입니다. (주) 품사정의는 아래 링크 참조
그러나 당연한 이야기지만 정확도는 위처럼 간단한 문장만으로 판단해서는 안됩니다.
다양한 매체들로 다면 분석을 한후 평균치를 측정해야 하므로 여러번에 걸쳐 테스트를 진행합니다. 1차 분석대상은 뉴스와 블로그로 선정해보았습니다.
뉴스는 IT 관련 뉴스(지디넷 포스팅)로 블로그는 IT 와 관련이 없는 내용으로 분석을 해보았습니다.
아래는 데이터 샘플 입니다.
1. 지디넷 뉴스 (분석결과는 사람이 읽기 쉽게 일부 가공하였습니다)
원문 |
상용분석기 (S사) |
MeCab |
HanNanum |
한국에서 IT분야 '남초현상'은 당연하게 여겨진다. 남자들만 우글거리는 사무실은 종종 유머의 소재로도 다뤄진다. 남초현상은 개발자 세계에서 더욱 두드러진다. |
한국:한국:NNP
에서:에서:GAC
IT:IT:ASCII
분야:분야:NN
':':PUNC
남초:남초:NN
현상:현상:NN
':':PUNC
은:은:GAX
당연하게:당연하다:AJ
여겨:여기다:VB
진다:지다:VB
.:.:PUNC
남자:남자:NN
들:들:GAX
만:만:GAX
우글거리는:우글거리다:VB
사무실:사무실:NN
은:은:GAX
종종:종종:AD
유머:유머:NN
의:의:GAC
소재:소재:NN
로:로:GAC
도:도:GAX
다뤄:다루다:VB
진다:지다:VB
.:.:PUNC
남초:남초:NN
현상:현상:NN
은:은:GAX
개발자:개발자:NN
세계:세계:NNP
에서:에서:GAC
더욱:더욱:AD
두드러진다:두드러지다:VB |
한국 NNP,지명,T,한국,
에서 JKB,*,F,에서,
IT SL,,*,*,*
분야 NNG,*,F,분야,
' SY,,*,*,*
남초 NNG,*,F,남초,
현상 NNG,*,T,현상,
' SY,,*,*,*
은 JX,*,T,은,
당연 XR,*,T,당연,
하 XSA,*,F,하,
게 EC,*,F,게,
여겨진다 VV+EC+VX+EF,*,F,여겨진다,
. SF,,*,*,*
남자 NNG,*,F,남자,
들 XSN,*,T,들,
만 JX,*,T,만,
우글거리 VV,*,F,우글거리,
는 ETM,*,T,는,
사무실 NNG,*,T,사무실,Compound,*,*,사무+실,
은 JX,*,T,은,
종종 MAG,성분부사/시간부사,T,종종,
유머 NNG,*,F,유머,
의 JKG,*,F,의,
소재 NNG,*,F,소재,
로 JKB,*,F,로,
도 JX,*,F,도,
다뤄진다 VV+EC+VX+EF,*,F,다뤄진다,
. SF,,*,*,*
남초 NNG,*,F,남초,
현상 NNG,*,T,현상,
은 JX,*,T,은,
개발자 NNG,*,F,개발자,Compound,
세계 NNG,*,F,세계,
에서 JKB,*,F,에서,
더욱 MAG,성분부사/정도부사,T,더욱
두드러진다 VV+EF,*,F,두드러진다,
. SF,,*,*,* |
한국에서
한국/unk+에서/jca
IT분야
IT/f+분야/ncn
'남초현상'은
'남초현상'/unk+은/jxc
당연하게
당연/ncps+하/xsms+게/ecs
여겨진다
여기/pvg+어/ecx+지/px+ㄴ다/ef
.
./sf
남자들만
남자들/ncn+만/jxc
우글거리는
우글거리/pvg+는/etm
사무실은
사무실/ncn+은/jxc
종종
종종/mag
유머의
유머/ncn+의/jcm
소재로도
소재/ncn+로/jca+도/jxc
다뤄진다
다루/pvg+어/ecx+지/px+ㄴ다/ef
.
./sf
남초현상은
남초현상/unk+은/jxc
개발자
개발자/ncn
세계에서
세계/ncn+에서/jca
더욱
더욱/mag
두드러진다
두드러지/paa+ㄴ다/ef |
분석결과중 눈에 띄는것 위주로 살펴보겠습니다. 우선 복합명사(Compound noun) 분석결과 부터 볼까요.
상기 원문에서 '남초현상' 이라는 단어가 눈에 띕니다. 대표적인 복합명사로서 형태소 추출과 품사태깅이 어떤식으로 진행되었는지 살펴봅시다.
상용분석엔진 : 남초(일반명사:NN), 현상(일반명사:NN)
MeCab : 남초(일반명사:NNG), 현상(일반명사:NNG)
HanNanum : 남초현상(미등록 명사:unk)
상용분석엔진(이하 S엔진)의 형태소 분석기와 MeCab은 '남초' 와 '현상'의 두 형태소를 일반명사로 분석한 반면, HanNanum 분석기는 '남초현상'에 대해 미등록명사(unk)라는 결과를 출력 합니다.
HanNanum 은 사전에 있지 아니한 단어일 경우, 명사일것이라 추측하는 단어에 대해 미등록 명사(unknown) 태깅을 합니다. (주) HanNanum 플러그인 중, UnknownMorphProcessor 를 사용하면, 미등록명사(unk)를 자체적으로 판단하여 일반명사 와 고유명사로 태깅하여 출력함.
위의 경우 어떤결과가 맞는걸까요.
분석을 진행하고자 하는 Domain 별로 S엔진,MeCab의 결과가 정답이 될수도 있고, 또는 HanNanum의 결과가 정답일 수도 있습니다.
예를 들면, 문서를 색인하여 검색결과를 제공하는 검색엔진의 경우는 '남초현상' 이라는 단어가 문서내에 있을때 사용자가 '남초현상' 을 검색 하였을때 해당 문서가 검색결과로 나오는것은 당연한것입니다.
또한 '남초' 나 '현상' 으로 검색을 하여도 '남초현상'이 포함된 문서가 출력이 되어야 바람직 할것입니다.
그러기에 위의 S엔진,MeCab 분석기의 결과처럼, 복합명사인 '남초현상'을 형태소 단위로 쪼개어 '남초' 와 '현상', '남초현상' 3개의 단어로 색인하는 것이 검색엔진 입장에선 바람직합니다.
그러나, Domain 이 검색엔진이 아니라 특정 키워드에 대한 일자별 변화 추이를 살펴봐야 한다던지, 키워드 자체에 대한 분석을 요구하는 domain 일 경우, HanNanum 결과가 좀더 바람직합니다.
예를들면 후자의 경우, 상기 원문에서 의미있는 키워드 및 분석대상은 '남초현상' 그 자체 이지, 형태소 분석된 '남초' 나 '현상' 은 분석 대상에서 제외하는게 바람직합니다.
포털사이트 실시간 검색어 랭킹을 automated 한다고 하였을때 1위에 '남초현상' 이 있고, 2위에 '남초' 3위에 '현상' 이 있다고 생각해보세요 :(