Python 환경에서한글형태소분석기패키지 KoNLPy 사용법 Guide of KoNLPy for Korean Morpheme Analyzer with Python 박보국 부산대학교전자전기컴퓨터공학과 limited10@pusan.ac.kr Abstract Python은자연언어처리에서굉장히인기있는언어중하나다. Python에는 NLTK(The Natural Language Toolkit) 이라고하는강력한자연언어처리패키지가있다. 이도구는형태소분석기, 수십종류의말뭉치, 기계학습알고리즘, Topic추출알고리즘, 연어 (Collocation) 등자연언어처리에서기본적으로다루는대부분의주제에대해서기능을제공한다. 그러나 NLTK에는한국어형태소분석기가없고, 현재 Python으로작성된한국어형태소분석기가없다. 따라서 NLTK라는매우우수한도구가있음에도 Python을사용하여자연언어처리를하기에번거롭다. 본보고서에서는최근발표된 KoNLPy(Korean NLP in Python) 패키지를소개한다. 이패키지는기존에 C/C++, JAVA로개발된형태소분석기를파이썬에서사용할수있도록처리하였다. 이패키지를설치하기만하면 Python에서형태소분석기를수행할수있어간편하게개발환경구축이가능하다. 먼저 KoNLPy의개요및설치방법에대해알아본다. 그리고주어진문자열에대해명사추출, 형태소분석, POS Tagging분석예제를보인다. 마지막으로형태소분석기와 NLTK를사용하여 bi-gram을추출하는예제를보인다. KoNLPy와 NLTK를같이사용하면손쉽게강력한자연언어처리개발환경을구축할수있다. Keywords: Python, KoNLPy, 형태소분석기 1 서론 자연언어의분석과정은일반적으로형태소분석 (Morphology Analysis), 통사분석 (Syntactic Analysis), 의미분석 (Semantic Analysis) 그리고화용분석 (Pragmatic Analysis) 의네단계로 나눌수있다. 일련의분석과정중기본이되는형태소분석은입력된문자열을분석하여형태 1
소라는뜻을가진가장작은말의단위로분류하는것이다. 문자열에서이를자동으로분석하기 위한도구로써형태소분석기가있다 [1]. 한국어정보처리를위한오픈소스형태소분석기는 1995 년부터 KTS 를시작으로다수의 프로젝트가개발되고배포되었다. 주요한국어형태소분석기는표 1 와같다. 그중대다수는 C/C++, Java 등으로개발되었다. 이렇게개발된형태소분석기를 Python 에서사용하기위해 서는다른언어로생성된형태소분석기를 Python 으로포팅작업을해야한다. 이러한번거로운 과정을줄이기위해 KoNLPy 패키지가개발되었다.KoNLPy 패키지를설치하기만하면 Python 에서한국어형태소분석기를호출하여사용할수있도록구현하였다 [2]. 현재는 KoNLPy 를 통해서세개의형태소분석기를사용할수있다. 본보고서에서는 KoNLPy 를설치하고, 이를통해 Python 에서형태소분석기를실행하는 예제에대해서살펴본다. 또한형태소분석기와 NTLK 의 collocation 과관련된기능을이용하여 bi-gram 을추출하는예시도보인다. 이 KoNLPy 를사용하므로써생산성이매우우수한 Python 을통해언어처리를할수있게되어, 자연언어처리에대한장벽을낮추었다. 추후에형태소 분석기를신문기사를분석하는연구에사용할계획이다. 표 1: 오픈소스한국어형태소분석기와개발언어. 이름년도언어라이선스사이트 http://kldp.net/ KTS 1995 C/C++ GPL v2 projects/kts 한나눔 1999 Java GPL v3 http://hannanum.sourceforge.net http://cs.sungshin.ac.kr/ shim/ MACH 2002 C/C++ custom demo/mach.html Arirang 2009 Java Apache v2 http://cafe.naver.com/korlucene http://kkma.snu.ac.kr/documents/ 꼬꼬마 2010 Java GPL v2 index.jsp KoNLP 2011 R GPL v3 https://github.com/haven-jeon/ KoNLP MeCab-ko 2013 C/C++ GPL v2, LPGL, BSD https://bitbucket.org/eunjeon/ mecab-ko http://www.shineware.co.kr/ KOMORAN 2013 Java custom?page id=835 2 KoNLPy 소개및설치 KoNLPy는서울대학교산업공학과에서개발한형태소분석기 Wrapper 패키지다. KoNLPy는이미개발된한글형태소분석기를 Python에서바로사용할수있도록하였다. 현재총세개의형태소분석기꼬꼬마, 한나눔, Mecab을지원해주고있다. 각형태소분석기마다제공해주는기능은약간차이가있으나공통적으로형태소추출, 명사추출,POS(PartOfSpeech) 추출기능이있다. 이프로젝트는최근 (2014년 7월 ) 에처음선보였다. 이패키지는 PIP(Package Manager) 2
표 2: konlpy 설치명령어 sudo apt-get install openjdk-7-jdk python-dev python-pip sudo pip install jpype==0.5.4.2 vi ~/.bashrc #.bashrc 에 JAVA_HOME 환경변수추가 export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64" source ~/.bashrc sudo pip install konlpy 를통해서내려받을수있다. KoNLPy의실행가능환경은 OS의경우 Windows, Linux에서실행가능하다. Python버전의경우형태소분석기에따라 Python3을지원하지않는경우가있다. 현재 Mecab형태소분석기는 Python3을지원하지않는다. 필자가실행한환경은 Ubuntu 12.04 LTS, Python 2.7 이다. 설치는표 2와같이쉘에명렬어를순서대로입력함으로써패키지를설치할수있다. 다음장에서는네가지명사추출, 형태소분석, POS Tagging, Bi-gram추출예제를통해형태소분석기사용법을알아본다. 3 KoNLPy 를이용한자연언어처리 3.1 문자열에대해명사추출 KoNLPy를통해꼬꼬마형태소분석기를이용하여한글문자열로부터명사를얻을수있다. 표 3는문자열로부터명사를추출하는프로그램의예이다. Line 5에서꼬꼬마분석기클래스인스턴스를만들고, Line 6에서명사추출함수에인자로분석하고자하는문자열을넘겨준다. 아버지가방에들어가신다. 그방에는내동생이있다. 에대해명사추출함수를수행한결과 [ 아버지, 방, 내, 동생 ] 이추출되었다. 1. 명사추출입력데이터아버지가방에들어가신다. 그방에는내동생이있다. 2. 명사추출수행결과아버지, 방, 내, 동생 3
표 3: 텍스트에서명사추출소스코드예 1 # -*- coding: utf-8 -*- 2 from konlpy.tag import Kkma 3 from konlpy.utils import pprint 4 5 kkma = Kkma() 6 pprint (kkma.nouns(u" 아버지가방에들어가신다. 그방에는내동생이있다.")) 3.2 문자열에대해형태소분석 KoNLPy를통해꼬꼬마형태소분석기를이용하여한글문자열로부터형태소분석결과를얻을수있다. 표 4는문자열로부터형태소분석을하는프로그램의예이다. Line 5에서꼬꼬마분석기클래스인스턴스를만들고, Line 6에서형태소분석함수를분석하고자하는문자열을넘겨준다. 수행결과는아래와같다. 표 4: KoNLPy를이용하여텍스트에서형태소분석소스코드예 1 # -*- coding: utf-8 -*- 2 from konlpy.tag import Kkma 3 from konlpy.utils import pprint 4 5 kkma = Kkma() 6 pprint (kkma.morphs(u" 아버지가방에들어가신다. 그방에는내동생이있다.")) 1. 형태소분석입력데이터아버지가방에들어가신다. 그방에는내동생이있다. 2. 형태소분석수행결과아버지, 가, 방, 에, 들어가, 시, ㄴ다,., 그, 방, 에, 는, 내, 동생, 이, 있, 다,. 3.3 문자열에대해 POS( 품사 ) Tagging KoNLPy를통해꼬꼬마형태소분석기를이용하여한글문자열로부터 POS Tagging 정보를알수있다. 표 5는문자열로부터 POS Tagging을수행하는프로그램의예이다. Line 5에서꼬꼬마분석기클래스인스턴스를생성하고, Line 6에서 POS Tagging함수에분석하고자하는문자열을넘겨준다. 수행결과는아래와같다. 1. POS Tagging 입력데이터 아버지가방에들어가신다. 그방에는내동생이있다. 4
표 5: KoNLPy 를이용하여텍스트에서 POS Tagging 소스코드예 1 # -*- coding: utf-8 -*- 2 from konlpy.tag import Kkma 3 from konlpy.utils import pprint 4 5 kkma = Kkma() 6 pprint (kkma.pos(u" 아버지가방에들어가신다. 그방에는내동생이있다.")) 2. POS Tagging 수행결과 ( 아버지, NNG), ( 가, JKS), ( 방, NNG), ( 에, JKM), ( 들어가, VV), ( 시, EPH), ( ㄴ다, EFN), (., SF), ( 그, MDT), ( 방, NNG), ( 에, JKM), ( 는, JX), ( 내, NP), ( 동생, NNG), ( 이, JKS), ( 있, VV), ( 다, EFN), (., SF) 3.4 형태소분석기와 NLTK를이용하여 bi-gram 및 tri-gram 추출 KoNLPy를통해사용할수있는꼬꼬마형태소분석기와 NLTK패키지를이용하여 bi-gram 및 tri-gram을추출을할수있다. 아래코드는 bi-gram을추출하기위한소스코드다. 참고로본보고서에서는 bi-gram에대해서만예시를보이고, tri-gram 구현은소스코드상에서 bigram을 trigram으로수정하기만하면동작한다. NLTK에서는 n-gram과관련하여제공하는 measure로 chi square, Dice s coefficient, phisquare, PMI 등 10개이상을제공하고있다. 이번예제에서는 PMI(Pointwise Mutual Information) 를 bi-gram 판단의척도로써사용하였다. 입력된문자열은 KoNLPy에내장되어있는대한민국헌법을입력으로하였다. Line 10은 KoNLPy에서제공하는헌법말뭉치를읽어온다. 출력은세종류로첫째, Line 15에서 Line 17은태깅된단어를기준으로 bi-gram을추출한결과를출력한다. 둘째, Line 19 Line 24는단어만을가지고추출한 bi-gram이다. 셋째, Line 26 Line 28은 Tag만을이용하여추출한 bi-gram을출력하였다. 1 # -*- coding: utf-8 -*- 2 3 from konlpy.tag import Kkma 4 from konlpy.corpus import kolaw 5 from konlpy.utils import pprint 6 from nltk import collocations 7 8 bigram_measures = collocations.bigramassocmeasures() 5
9 10 doc = kolaw.open( constitution.txt ).read() 11 pos = Kkma().pos(doc) 12 words = [s for s, t in pos] 13 tags = [t for s, t in pos] 14 15 print( \ncollocations among tagged words: ) 16 finder = collocations.bigramcollocationfinder.from_words(pos) 17 pprint(finder.nbest(bigram_measures.pmi, 10)) # top 10 n-grams with highest PMI 18 19 print( \ncollocations among words: ) 20 ignored_words = [u 안녕 ] 21 finder = collocations.bigramcollocationfinder.from_words(words) 22 finder.apply_word_filter(lambda w: len(w) < 2 or w in ignored_words) 23 finder.apply_freq_filter(3) # only bigrams that appear 3+ times 24 pprint(finder.nbest(bigram_measures.pmi, 10)) 25 26 print( \ncollocations among tags: ) 27 finder = collocations.bigramcollocationfinder.from_words(tags) 28 pprint(finder.nbest(bigram_measures.pmi, 5)) 1. tagged word 기준으로 bi-gram 추출 Collocations among tagged words: [(( 가부, NNG), ( 동수, NNG)), (( 강제, NNG), ( 노역, NNG)), (( 경자, NNG), ( 유전, NNG)), (( 고, ECS), ( 채취, NNG)), (( 공무, NNG), ( 담임, NNG)), (( 공중, NNG), ( 도덕, NNG)), (( 과반, NNG), ( 수가, NNG)), (( 교전, NNG), ( 상태, NNG)), (( 그러, VV), ( 나, ECE)), (( 기본적, NNG), ( 인권, NNG))] 2. words 기준으로 bi-gram 추출 Collocations among words: [( 현행, 범인 ), ( 형의, 선고 ), ( 내부, 규율 ), ( 정치적, 중립성 ), 6
( 누구, 든지 ), ( 회계, 연도 ), ( 지체, 없이 ), ( 평화적, 통일 ), ( 형사, 피고인 ), ( 지방, 자치 )] 3. tag 기준으로 bi-gram 추출 Collocations among tags: [(XR, XSA), (JKC, VCN), (EPT, EPT), (VCN, ECD), (ECD, VX)] 3.5 한글이외의문자에대한실험 이절에서는 KoNLPy 에서사용할수있는세가지한글형태소분석기를이용하여한글이외의 문자열과예외사항에대해형태소분석능력을실험하였다. 실험은명사를추출하는작업을수 행하였고, 실험결과를명사가모두추출되었는지비교하여평가하였다. 표 6 은실험에사용한 문자열이다. 실험문자열은한자, 영어, 외국어, 외래어, 기호, 신조어, 띄어쓰기가안된문장에 대해테스트할수있도록구성하였다. 실험문자열들에대해각형태소분석기를이용하여 명사추출을수행한결과는표 7 과같다. 이것을종합하여표 8 에정리하였다. 동그라미는실험 결과가주어진문장에서명사를모두추출한것이고, 세모는일부가누락된것이다. 그리고 가위표는전혀추출이불가능했음을의미한다. 실험결과정제된한글문서에는꼬꼬마형태소 분석기가비교적성능이좋을것으로판단된다. 표 6: 실험에사용한아홉가지문자열 실험번호실험문자열 1 南北이르면오늘軍事회담연다 TV 조선화면캡처對北전단 NLL 긴장완화등의제에오를듯 2 Ministry of Education said Monday that some 3 그사이로 765 kv 154 kv등각종송전탑과송전선로가어지럽게이어져있다. 4 실제로는문후보 1469 만표득표. 5 사우디아메리카 ( 미국이셰일혁명을통해세계최대에너지생산국이될것이라는전망 ) 는과장광고다. 6 한국인 NPC 가 이런병신새끼! 외의대사를하기도한다. 7 마지막이데이곱게말로할때가제이ㅋㅋㅎㅎㅋ 8 얼라인먼트알고리즘은다양한분야에사용된다. 9 아버지가방에들어가신다. 4 결론및향후활용방안 그동안많은형태소분석기가개발되었지만 Python 에서직접사용하기위해서는복잡한포팅 과정을거쳐야했다. 그러나최근에발표된 KoNLPy 패키지를설치하기만하면여타설정없이 바로사용할수있다. 본보고서의결론은다음과같다. 7
표 7: 실험문자열에대해각형태소분석기를이용하여명사추출을수행한결과 실험번호실험목적꼬꼬마 Mecab 한나눔 1 한자, 외국어 [ 오늘, 회담, 조선, [ 南北, 軍事, 회담, [ 南北, 오늘, 軍 화면, 캡, 캡처, 처, 조선, 화면, 캡처, 事, 회담, TV, 전단, 긴장, 긴장완對北, 전단, 긴장, 조, 화, 캡처對北전 화, 완화, 등, 의제, 듯 ] 완화, 등, 의제, 듯 ] 단 /NLL, 긴장완화, 등, 의제, 듯 ] 2 영어 [] [] [Ministry, of, Education, said, Monday, that, some] 3 영어 [ 사이, 765, 765kV, kv, 154, 154kV, 등, 각종, 송전, 송전탑, 탑, 송전선로, 선로 ] 4 숫자 [ 실제, 문, 후보, 1469, 1469만표, 만, 표, 득표 ] 5 신조어 [ 사우디, 메리, 메리 카, 카, 미국, 셰일, 혁명, 세계, 최대, 에너지, 생산국, 전 망, 과장, 과장광고, 광고 ] 6 영어 [ 한국인, 병신, 병 신새끼, 새끼, 외의, 대사 ] 7 방언 [ 마지막, 데이, 말, 때, 가제이, 제이, ㅋ ] 8 외래어, 외국어 [ 얼, 얼라인먼트, 라 인, 먼트, 알고리즘, 다양, 분야, 사용 ] 9 띄어쓰기 [ 아버지, 아버지가 방, 가방 ] [ 사이, 등, 각종, 송전탑, 송전, 선로 ] [ 문, 후보, 만, 표, 득표 ] [ 사우디, 아메리카, 미국, 셰일, 혁명, 세계, 최대, 에너지, 산국, 것, 전망, 과장, 광고 ] [ 한국인, 병신, 새끼, 외, 대사 ] [ 마지막, 이데이, 말, 때, 가제 ] [ 인먼, 트, 알고리즘, 분야, 사용 ] [ 사이, 765kV /154kV, 등, 각종, 송전탑, 송전선 ] [ 실제로, 후보, 1469, 만, 표, 득표 ] [ 사우디아메리카 ( 미국, 셰, 혁명, 세계, 최대, 에너지, 생산국, 것, 전망, 과장광고 ] [ 한국인, NPC, 병신, 새끼, 외, 대사 ] [ 마지막이데, 말, 때, 가제, ㅋㅋ, ㅎㅎ, ㅋ ] [ 얼라인먼트, 알고리즘, 다양, 한, 분야, 사용 ] [ 아버지, 방 ] [ 아버지가방에들어가 ] 표 8: 명사추출실험결과를표로정리한것. 동그라미는모두추출, 세모는일부추출, 가위표는추출못함 실험목적꼬꼬마 Mecab 한나눔 한글 O O 외래어 O X O 외국어 O X 영어 X X O 한자 X O O 방언 O O 숫자 O X 기호 X X X 신조어 X X X 8
1. 지금까지는 Python 개발환경에서한글형태소분석기를사용하기어려웠지만 KoNLPy 를사용하면여타설정없이바로사용할수있다. 2. 기존의 NLTK와함께사용하면 n-gram추출등강력하지만손쉬운자연언어처리기를만들수있다. 또한본보고서에서살펴본도구를활용하여다음과같은추가연구를진행할수있을것으로판단된다. 1. 기존에단문텍스트에대해감정을분석할수있는연구가있다. 이는감정과관련된단어와어떤명사가동시에출현할확률을이용하여감정을예측하는연구가있다 [3]. 2. 신문기사를이용한분석도많이진행되고있다 [4]. 이논문은대선기간직전 2년간신문기사를토대로진보및보수신문사별로기사작성시키워드간관계를분석하여특정단어들이어떤단어들과같이빈번하게사용되는지분석하였다. 3. 쇼핑몰과각종커뮤니티의글및댓글은누가작성하였는지특정하기어려운점이있다. 반면에신문기사의경우대부분기사맨하단에기자의이름과 e-mail주소를명시하는데, 이를이용하면작성자를특정지을수있다. 이를이용하여기자를중심으로하는키워드및단어에대한성향을분석할수있을것으로기대된다. References [1] M. Kim and H.-C. Kwon, 한국어어휘의미망의의미관계를이용한어의중의성해소, in in Proc. of the 38th Annual Conference on Software and Applications, pp. 554 564, 2011. [2] E. L. Park and S. Cho, Konlpy: Korean natural language processing in python, in in Proc. of the 26th Annual Conference on Human & Cognitive Language Technology, (Chuncheon, Korea), October 2014. [3] T. C. S. Y. Hyunwoo Kim, Sungyoung Lee, Emotion recognition based on short text using semantic orientation, in 한국컴퓨터종합학술대회, pp. 375 377, 2012. [4] W. J. Beomil Kang, Min Song, Study on opinion mining of newspaper texts based on topic modeling, 한국문헌정보학회지, vol. 47, no. 4, pp. 315 334, 2013. 9