KoNLP v.0.80.0 버전 업(on CRAN now)

KoNLP v.0.80.0 릴리즈 on CRAN

3년 5개월만의 업데이트다. 금번 업데이트에서 가장 큰 변화는 기존 36만에서 약 120만 형태소 사전을 탑재했다는 것이고, 이들 사전을 사용자들이 원하는 형태로 사용할 수 있게 하는데 방점을 두었다. 총 66개의 카테고리 사전을 보유하고 있으며 사용자들의 분석 대상에 맞게 카테고리 사전을 선택해 조합하여 사용할 수 있게 하였다.

내부적으로는 0.80 이전까지는 압축된 텍스트 파일 사전을 기반으로 동작했으나 이번 릴리즈에는 사전의 종류와 양이 늘어 이들을 데이터베이스로 관리하게 하였으며, 기존의 로직도 최대한 이쪽을 바라볼 수 있게 코드를 대폭 수정하였다.

과거 버전에서 고질적으로 노출되었던 out of memory 이슈의 경우 최대 120만 사전을 메모리에 가지고 있게 하기 위해서는 선결해야 될 과제였다. 이를 위해 사용자 사용 패턴을 기반으로 가장 빈번하게 사용하는 패턴을 가장 빠르고 효율적으로 구동될 수 있게 수정 하였고, 이 과정을 통해 메모리를 효과적으로 관리할 수 있는 방안을 찾았다. 결과적으로 각각 서로 다른 분석함수(SimplePos22, extractNoun 등등)을 번갈아 가면서 호출할때는 다소 느리나 한 함수를 지속적으로 반복적으로 호출하는 경우엔 매우 빠른 동작을 수행하게 하였고, 이를 통해 메모리 사용 효율화도 이끌 수 있게 하였다(첫 실행에서 느리기 때문에 체감상 느리게 느낄 수 있으나 반복적인 작업에서는 그렇지 않는다는 걸 느낄 수 있을 것이다).

odroid
심지어는 120만 단어를 사용하는 example 코드가 휴대폰에 들어가는 CPU와 2G의 메모리만을 가진 손바닥만한 머신에서도 잘 동작한다(해당 머신은 필자가 마인크래프트 서버로 활용하는 머신인데, 이번에 리눅스에서 테스트 하는데 큰 역할을 수행했다).

최대 120만 사전을 로딩해 분석하기 위해서는 heap memory를 최소 700Mb 이상 잡아서 분석하는걸 추천한다. 따라서 별도의 메모리 설정을 사용자가 하지 않는다면 KoNLP는 -Xmx768M옵션을 잡게 하였다. 더 많은 사전을 직접 만들어 올리지 않는 이상 주어진 사전을 최대한 활용하기엔 부족함이 없을 것이다. 물론 768Mb보다 작은 힙 메모리를 설정상 보유하고 있으면 여기에 따른 안내 메시지도 도출되게끔 했다.

Tutorial

백문이 불여일견 인데.. 직접 사용을 해보도록 하자!

# 몇몇 마이너한 버그가 수정된 패키지를 원한다면 개발버전을 설치해도 좋다.
# 참고로 예시는 개발버전으로 수행하도록 한다. 
#devtools::install_github('haven-jeon/KoNLP', build_vignette=T)

install.packages("KoNLP")

금번 버전부터 Scala로 플러그인을 작성할 수 있게 환경을 만들었고, 실제 기존보다 더 나은 문장경계인식 플러그인과 비정상 어절 필터 같은 플로그인을 만들어 적용을 하였다. CRAN에서 미리 컴파일 된 버전을 제공하는 Windows, Mac에서는 런타임이 포함되어 있어 배포가 되며 만일 소스코드 그대로 설치를 하게 되면 별도의 Scala 런다임 라이브러리를 자동으로 다운받아 설치하는 모습을 볼 수 있을 것이다. 따라서 외부 네트웍이 되지 않는 곳에서는 안내되는 메시지를 따라 별도의 설정 작업이 필요하다.

library(KoNLP)
## Checking user defined dictionary!
library(ggplot2)
## Find out what's changed in ggplot2 at
## http://github.com/tidyverse/ggplot2/releases.
library(data.table)
## data.table 1.9.6  For help type ?data.table or https://github.com/Rdatatable/data.table/wiki
## The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
#HTML Vignette 보기(한글이 포함된 vignette를 보게 될 줄이야.......@.@) 
vignette("KoNLP-API") 

#일단 시스템 사전만 사용해본다. 
useSystemDic()
## Backup was just finished!
## 283949 words dictionary was built.
txt <- '미국 싱크탱크 전략국제문제연구소의 빅터 차 한국석좌는 9일 미국의 제45대 대통령으로 당선된 도널드 트럼프가 전시작전통제권(전작권)을 한국에 조기에 넘길 가능성이 있다고 전망했다.'

system_res <- MorphAnalyzer(txt)

sum(sapply(system_res, length))
## [1] 102

이제 NIADic을 기반으로 다양한 사전 데이터를 활용해보자!

#추가된 NIADic 사전 패키지
useNIADic()
## Backup was just finished!
## 983012 words dictionary was built.
niadic_res <- MorphAnalyzer(txt)

sum(sapply(niadic_res, length))
## [1] 288
morph_cnts <- rbind(data.table(eojeol=names(system_res), cnts=sapply(system_res, length), kind='시스템 사전'),
                    data.table(eojeol=names(niadic_res), cnts=sapply(niadic_res, length), kind='NIA 사전'))

ggplot(morph_cnts, aes(eojeol, cnts)) + geom_bar(stat='identity', aes(fill=kind), position='dodge') + coord_flip() + ggtitle("어절별 형태소 분석 결과 빈도")

plot of chunk unnamed-chunk-3

기본 시스템 사전을 사용하는 것보다 NIADic을 사용해서 분석하는게 약 2.5배 더 풍성한 형태소 분석 결과를 보여준다.

#자신의 머신이 -Xmx512m 정도의 힙 메모리를 쓰고 있다면,
# woorimalsam 사전만 올려서 아래와 같이 분석 가능함
# options('java.parameters') 명령어로 설정 확인 가능 

#category_dic_nms 파라메터로  '정치(political)' 관련 카테고리 사전을 더 부가할 수 있다. 
#?buildDictionary 메뉴얼 확인! 
buildDictionary(ext_dic = c('woorimalsam'), category_dic_nms=c('political'),
                user_dic=data.frame(term='전작권', tag='ncn'))
## 631100 words dictionary was built.
woori_res <- MorphAnalyzer(txt)

사전 데이터 활용

NIADic 패키지의 사전은 사실 KoNLP만을 위한 사전은 아니다. 따라서 아래와 같은 방식으로 형태소 사전 파일을 텍스트 형태로 내려받을 수 있고, 수정해 다른 형태소 분석기에 활용을 할 수 있다.

다운로드 가능한 사전은 ‘sejong’, ‘woorimalsam’, ‘insighter’이다.

사전의 Copy Right은 CC BY이며, 저작자 표기만 하면 상업적으로 활용이 가능하다. 인용에 대한 정보는 citation('NIADIc')을 참고하면 된다.

library(NIADic)
## Successfully Loaded NIADic Package.
citation('NIADic')
## 
## NIA(National Information Society Agency) and Jeon H (2016).
## _NIADic: NIA(National Information Society Agency) Korean
## Dictionaries_. R package version 0.0.1, <URL:
## https://github.com/haven-jeon/NIADic>.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Manual{,
##     title = {NIADic: NIA(National Information Society Agency) Korean Dictionaries},
##     author = {{NIA(National Information Society Agency)} and Heewon Jeon},
##     year = {2016},
##     note = {R package version 0.0.1},
##     url = {https://github.com/haven-jeon/NIADic},
##     licence = {CC BY},
##   }
woori_dic <- get_dic("woorimalsam")

woori_dic <- data.table(woori_dic)

#품사별 빈도
woori_dic_cnt  <- woori_dic[,.N,tag][order(-N)]
ggplot(woori_dic_cnt, aes(reorder(tag,N),N)) + geom_bar(stat='identity')

plot of chunk unnamed-chunk-5

#카테고리별 빈도 
woori_dic_cnt  <- woori_dic[,.N,category][order(-N)]
ggplot(woori_dic_cnt, aes(reorder(category,N),N)) + geom_bar(stat='identity') + coord_flip()

plot of chunk unnamed-chunk-6

write.csv(woori_dic, file='woori_dic.csv', row.names=F, fileEncoding='UTF-8')

좀더 자세한 내용은 KoNLP-APIvignette을 참고하기 바란다.

차주 초나 금주 말에 몇몇 마이너 버그를 해결하고 다시한번 CRAN에 업데이트를 할 예정이다. 혹시 사용중 이슈가 있으면 이곳에 올려주면 감사하겠다(물론 한글로 올려도 좋다).

ps.
마지막으로 3년 5개월만에 KoNLP를 업그레이드 할 수 있던 동기를 부여해 주셨던 NIA 빅 데이터 센터에 감사의 말을 전하고 싶다. 이곳에서 마련해준 사전 데이터가 아니였으면 KoNLP의 버그수정/기능개발은 커녕 방향도 고민하지 못했을 거라는 생각을 다시한번 해보게 된다. 다시 코드를 보고 개발을 시작하면서 피곤하지만 굉장한 재미가 있었고, KoNLP의 목적과 방향을 다시 설정할 수 있었던 소중한 시간이었다.

CC BY-NC 4.0 KoNLP v.0.80.0 버전 업(on CRAN now) by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.