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의 목적과 방향을 다시 설정할 수 있었던 소중한 시간이었다.

0 0 votes
Article Rating
Subscribe
Notify of
guest

33 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Rose

Warning in install.packages :
package ‘KoNLP’ is not available (for R version 3.2.4 Revised)
라는 에러가 뜨는데 어떻게 해결하면 좋을까요?

Sanghoon Lee

안녕하십니까 텍스트마이닝을 공부하는 학생입니다. 현재 업데이트된 KoNLP 0.8에 NIADic을 적용시킬 경우 , length가 큰 데이터에서 오류가 발생합니다.
(Error in .jcall(get(“HannanumObj”, envir=.KoNLPEnv), “[s”, “extractNoun”, : method extractNoun with signature (Ljava/lang/string;[Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String; not found)
확인 부탁드립니다.

gogamza

죄송하지만 제가 에러를 재현할 수 있는 코드와 데이터 그리고 환경을 알려주셔야 확인 가능합니다.

length가 큰 데이터에서 오류는 사용자 사전을 큰것을 별도로 넣었을때 인지 아니면 NIADic의 사전을 활용할 때 문제인지 글만 봐서는 감이 잘 오지 않네요.

SeokJu Park

진행하면서 가장 흔히 있었던 원인으로는
입력하신 텍스트 데이터가 하나의 문장이 아니라 다수의 character vector 형태일 때 단순히 MorphAnalyzer(txt)와 같이 실행하는 경우였습니다.

character vector를 paste(txt, sep=”, collapse=”)를 이용해서 하나의 문장으로 만들어주거나, sapply 명령어를 사용해서 각 벡터 단위로 MorphAnalyzer가 실행되도록 해보셔야 할 것 같습니다.
속도 면에서는 전자보다는 후자를 추천드립니다.

gogamza

아무래도 입력 되는 문서의 크기가 클 경우가 이런 현상이 일어나는 것으로 판단되네요. 내부적으로 큰 문서가 들어왔을때 쪼개서 실행하는 로직이 필요할듯 합니다.

답변 감사드립니다.

Hae-in Oh

comment image
KoNLP 패키지가 원래는 잘 됐었는데, 어느 순간부터 library로 로드하고 보니
저런 메시지밖에 안뜨면서, KoNLP패키지 내에 있던 extractNoun 등의 functions가
Value로 올라가버리더니 제대로 작동이 안되네요ㅠㅠ
어떻게 해야하나요..?

Hae-in Oh

기존에 필요로 했던 rJava, hash, tau, Sejong과 같은 패키지를 따로 설치해서 활성화 한뒤에 해도 extractNoun 기능은 살아나질 않더군요ㅠㅠ..

gogamza

세션을 다시 리스타트 해보는건 어떨지요?

Hae-in Oh

세션 리스타트를 해보고 패키지도 계속 재설치해보는데 같은 상황이네요….ㅠㅠ

gogamza

세션을 다시 시작하고 실행했던 코드를 줘보시면 테스트 해보겠습니다.

Hae-in Oh

comment image

코드는.. 그냥 install.packages(“KoNLP”) 하고 library(KoNLP) 두개만 썼습니다. 혹시 수동으로 패키지 설치했던 코드를 말씀하시는건가요??

gogamza

에러는 어떤게 나오는건가요? 이미지 에서는 에러가 없어서..

Hae-in Oh

에러가 난다기 보다는 제대로 로드가 안되는것 같아요..
패키지 부착이 잘 안 되는 것 같은데,, 제 PC뿐만 아니라 학교 PC실에 있는 다른 PC에서도 같은 문제가 발생해서 이렇게 글을 남겨봅니다ㅠㅠ

gogamza

그 문제가 뭔지 잘 이해가 되지 않아서 그렇습니다. 함수가 제대로 동작하면 되는거 아닌지요?

Hae-in Oh

extractNoun이 어제까지는 화면상 밑에 Functions로 들어가 있어서 잘 작동했었는데, 현재는 위의 Values에 들어가있어서 제대로 작동이 안되고 있습니다 . .

gogamza

그럼 실행을 해보시고 그 작동 안한다는 상황을 보여주세요. 그리고 RStudio 옆 패널에 보여주신것은 KoNLP 패키지 함수 리스트 입니다. Values가 아니구요.. 잘 확인해 보세요..

Hae-in Oh

파일을 잘못 다루다가 오류가 났었던 것 같습니다..
간단한 파일로 다시 해보니까 되네요…
library로 활성화하는 단계에서 기존에 보던 문구들 (필요한 패키지가 부착되었습니다~등)이 보이지 않아서 잘못 생각했던 것 같습니다,, 죄송합니다 ㅠㅠㅠㅠ

업데이트 이전부터 잘 쓰던 패키지라 갑작스러운 상황에서 당황했어요.. 새로 업데이트 해주신 부분에 대해서 보다 잘 숙지하고 활용할 수 있도록 하겠습니다ㅠㅠ 좋은 패키지 감사드리고 다시 한번 죄송합니다…

gogamza

네…기존 부착 메시지에 익숙하셔서 그랬던거 같네요. 다른 분들도 헷갈리지 않으시게 잘 안내해 주시기 바랍니다. ^^

Dae-kwang Park

안녕하세요. 키워드 추출을 실습하던 중, 막히는 내용이 있어서 문의 드립니다.

1) 아래와 같이 사용자 사전을 추가하여 명사 키워드 추출을 실행할경우, ‘명사 키워드 추출’ 단계에서 “read_dic:tag error”라는 메시지가 출력되면서 사전이 제대로 적용되지 않습니다. 해결방법이 있을까요?

2) 사용자 사전에 “여성 혐오”와 같이 띄어쓰기가 포함된 단어를 설정하면, “여성 혐오”라고 하나의 키워드로 추출이 가능한지 궁금합니다.

#### 라이브러리 로딩
library(rJava)
library(KoNLP)
library(tm)

#### 사전 설정
useSejongDic()
proWords <- c("한미동맹", "한국", "중국", "미국", "지금", "동반자관계", "모델")
userDic <- data.frame(proWords, c("ncn"))
buildDictionary(ext_dic = "sejong", user_dic = userDic, replace_usr_dic = T)

#### 텍스트 읽어오기
data1<-readLines("abstract3.txt", encoding = "UTF-8")

#### 명사 키워드 추출
data2 <- sapply(data1,extractNoun,USE.NAMES = F)

gogamza

KoNLP:::KtoS 를 보시면 KoNLP에서 입력 가능한 태그셋들이 보입니다. 이 데이터로 체크하는것이니 확인해보시면 될듯 합니다.

그리고 위 예제는 모두 실행이 되는 것으로 보입니다. ncn 태그는 잘 입력이 됩니다.

한국어 텍스트 분석의 경우 어절 단위에서 형태소 단위로 추출을 하는 과정을 거치게 됩니다. 즉 어절은 띄어쓰기 기준의 단위입니다. 따라서 말씀하신 “여성 혐오” 명사구의 경우 구 단위의 구문분석을 하지 않으면 알 수 없는 단위입니다.

후처리를 통해 간접적으로 할 수 있는 방법이 있는데, 한 문장 안에서 두 단어의 연관관계를 통해서 확인하는 방안도 하나의 방법이라 생각됩니다.

Dae-kwang Park

네, 정상 실행 확인 하였습니다. 명사구에 대해선 말씀해주신 방법을 더 알아봐야겠어요. 답변 감사합니다.

[…] KoNLP패키지가 업데이트도 되었고, 사전도 추가되어서 이를 사용하여 분석을 […]

정민호

고감자님 안녕하세요. 혹여 문장에 마침표(.)가 포함되어있지 않을 경우 형태소 분석 결과가 달라지는 현상에 대한 이유를 간략하게나마 설명해주실 수 있나요? 현 버전에서 마침표가 들어간 문장과 그렇지 않은 문장의 형태소 분석 결과가 틀리게 작용되는 것을 확인하고 궁금함에 여쭤봅니다.

gogamza

마침표도 품사중에 하나로 역할을 수행합니다. 그리고 그 마침표 주변에는 그에 적합한 품사들이 출현하기 나름이구요, 따라서 마침표가 있고 없고는 그 결과의 차이가 날 수 밖에 없습니다.

정민호

혹여 이런 사항들이 현버전부터 반영된 것 인가요? 이전 버전을 사용했을때는 이런 결과를 발견하지 못한것 같아 여쭤봅니다.

Dong Hun Kim

library(KoNLP)
Building dictionary structures.

Error : .onAttach failed in attachNamespace() for ‘KoNLP’, details:
call: .jcall(“kr/pe/freesearch/KoNLP/KoNLPUtil”, “[S”, “readZipDic”,
error: RcallMethod: cannot determine object class
Error: package or namespace load failed for ‘KoNLP’
이 메세지는 오류 메세지인가요? 패키지 설치는 잘 됐는데 이상하네요. .

오승영

감사히 잘쓰겠습니다.

Sojin Ko

안녕하세요, 텍스트 마이닝을 하고 있는데.. 안되는게 있어서 여쭤봅니다.
낙찰이란 단어가 있음에도 불구하고 낙찰받다라고 입력을하면
낙찰받/ncn 으로 쪼개져서 받다를 ncn, pvg등 으로 단어를 buildDictionary로 추가 했는데도 .. 안되더라구요.
혹시 낙찰 받다 이렇게 하는거 이외에 낙찰받다를 낙찰/ncn + 받다.. 로 잘 나눠지게 하는 방법 있을까요?!
감사합니다.

gogamza

이 부분은 문장의 구조에 따라 다른 동작을 하게 되는 알고리즘 특성상 처리 결과를 기반으로 원하시는 방향으로 후처리 하시는걸 추천드립니다.
버전업 때마다 해당 부분을 항상 고민하는데, 강제한다는게 사이드 이펙트가 있을걸로 예상이 되어 고민하는 기능입니다.

gogamza

앞으로 이슈가 있을 경우 아래에 등록해 주시면 감사하겠습니다.

https://github.com/haven-jeon/KoNLP/issues

위 경로로 강제하는 이유는 이슈에 대한 질/답이 잘 관리되고 있지 않아서 입니다. 서로 다른 분들이 같은 이슈로 질문하는 경우가 많아서 입니다.

따라서 앞으로 블로그에 올라온 KoNLP관련 질문은 답변하지 않겠으니, 위 링크에 올려주세요.

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

Hoyoung Jeong

안녕하세요! 텍스트 마이닝을 공부하는 학생입니다.
comment image
말뭉치를 정제를 어느정도 하고 품사를 분석해서 단순명사만 추출해서 빈도행렬을 만드려고 하는데 simplepos22함수부분에서 아래와 같은 오류가 나타나는데 이게 어떻게 어떤 원인으로 일어나는지 알수가 없네요… 반복문안에서 말뭉치중 몇개 파일만 빈도행렬이 만들어지고 나머지 오류나는 부분은 빈도행렬파일안에 “x”내용물만 있습니다.
돌아가는게 있고 안되는게 있어서…아시는게 있으시면 답변 부탁드립니당

김우녕

안녕하세요 텍스트 마이닝을 학습하는 사람입니다.
다름이 아니라, 용어 사전에 영어를 등록해서 사용하고 싶은데
등록까지는되나 그냥 skip 현상이 발생하는것 같아서 글을 남겨봅니다.
꼭 한글만 가능한가요?