R 한글 인코딩 문제 (KoNLP 작업 과정에서…)

처음 R CRAN에 등록하고 참 많은 것들을 해본거 같다.

가장 큰 문제였던 것들은 윈도우 머신에서 오동작 하는 문제와 json 포맷 파일을 윈도우에서 읽어 오지 못하는 문제였다. 일단 맥과 리눅스에서는 잘 돌아가는 것을 확인 했지만 결국 위 두 가지 문제를 해결하면서 맥과 윈도우도 UTF-8에서만 잘 도는 것이였음이 밝혀졌다.

일단 한글 처리 패키지이기 때문에 CJK관련 문자 인코딩에 따른 윈도우 머신의 특성 문제가 있었으며 R의 문자열 인코딩 처리 방식 그리고 자바의 인코딩 처리 방식에 대한 인터페이싱을 맞춰줄 필요가 있었다. 인코딩 문제에 관해서 다뤄본 문제들 중에서는 가장 복잡도가 큰 문제였지 않을까 싶다.

일단 자바는 유니코드 기반의 UTF-8로 통일된 인터페이싱이기 때문에 간단히 넘어갔고…

R의 경우 로케일에 따라서 문자열 인코딩을 암묵적으로 처리하게 되는데 이걸 이해하는데 시간이 좀 걸렸다.

윈도우의 경우 CP949가 한글 윈도우의 기본 인코딩이라서 이를 문자열 인코딩 하는데 사용한다.

단 문자열의 “Encoding(str)” 함수 결과값이 “unknown”일 경우에만 localeToCharset()함수를 참고해 로케일에 따른 인코딩을 잠정적으로 인지하고 문자열 디코딩을 할때 CP949로 풀어서 보여준다.

물론 UTF-8 한글 문자열도 잘 보여준다.

 

   1: > localeToCharset()

   2: [1] "CP949"

   3: > sent <- "R은 free 소프트웨어이고"

   4: > Encoding(sent)

   5: [1] "unknown"

   6: > localeToCharset()

   7: [1] "CP949"

   8: > sent2 <- iconv(sent, localeToCharset()[1], "UTF-8")

   9: > sent2

  10: [1] "R은 free 소프트웨어이고"

  11: > Encoding(sent2)

  12: [1] "UTF-8"

  13: > Encoding(sent2) <- "CP949"

  14: > sent2

  15: [1] "R\xec\x9d\u0080 free \xec냼\xed봽\xed듃\xec썾\xec뼱\xec씠怨\xa0"

  16: > Encoding(sent2)

  17: [1] "unknown"

  18: > sent == sent2

  19: [1] FALSE

  20: > Encoding(sent2) <- "UTF-8"

  21: > sent == sent2

  22: [1] TRUE

  23: > nchar(sent) == nchar(sent2)

  24: [1] TRUE

 

위 코드는 한글 윈도우에서 도는 R의 문자열의 인코딩 특징을 잘 보여주는 테스트이다.

애초에 sent문자열은 “unknown”으로 잡힌다. 무려 CP949인코딩임에도 그렇게 표현된다. 왜냐면 R에서 인코딩에 대한 구분은 latin1, UTF-8, bytes 이 세가지 이기 때문이다. 따라서 unknown으로 잡힌 것들을 어떻게 디코딩 해서 보여주느냐는 locale을 통한 예상을 통해서이다. 다행히 예제에서 localeToCharset()결과가 CP949로 나오기 때문에 인코딩 정보가 “unknown”인 문자열임에도 잘 보여준다.

이를 UTF-8로 iconv를 해서 변환하게 되면 결과적으로 Encoding()은 UTF-8이 되고 그냥 출력해도 R쉘에서는 UTF-8 문자열을 잘 보여준다.

이래서 R은은 멀티 인코딩을 지원하는 플랫폼이라고 하는거 같다.  하지만 이것을 이해하기 위해서 너무 멀리 돌아 온거 같다는 느낌이 든다.

일단 이렇게 좀 복잡하지만 규칙이 있기 때문에 문자열 처리하는게 가능하지 않았을까 한다.

이 문제와 JVM 띄울때 –Dfile.encoding=UTF-8 옵션을 주지 않아서 기본 로케일을 가지고 json 파일을 디코딩 하는 바람에 json 파일 리딩 오류가 난거(그것도 윈도우에서만…)…. 이렇게 두가지 문제 때문에 대한 해결책을 찾느라 어제 저녁 예거밤 두잔을 원샷했다. 쩝.. ㅠㅠ 

 

 

아래는 윈도머신에서 패키지가 돌아가는 화면이다…

 

image

 

이번 고생으로 인해… 이 기종 언어, OS간의 한글 인코딩 문제들에 대해서 많은 생각을 해보게 되었는데, 추후 패키지 발전을 위한 큰 밑걸음이였다고 생각한다.  

 

일단 이 패키지를 윈도우에서 사용하고자 하는 분들은 KoNLP 0.0-7.3 이상의 버전을 사용하길 추천한다.

0 0 votes
Article Rating
Subscribe
Notify of
guest

34 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Park Suhyuk

고감자님 맥에서 설치가 안되는군요 ;ㅁ;

Anonymous

아래 링크 보면 아시겠지만, 현재 고려대 cran 미러가 맛이 간 상태입니다.

일본쪽 cran 미러에서 설치하시면 됩니다. 

http://statlab.korea.ac.kr/R//bin/macosx/leopard/contrib/r-release/KoNLP_0.0-7.4.tgz

Anonymous

이 문제 확인해서 R cran 팀에 메일 보내뒀습니다. 

제 패키지 뿐만 아니라 다른 많은 패키지들이 블럭 당하고 있었네요.

고려대는 왜 이런짓을… 차라리 cran 미러 빼든가..

재연

cran 미러 관리하는 사람이 지금 외국에 나가있어서 관리가 안된다는 이야기를 언뜻 들은거 같습니다.. 에휴… ㅠㅠ

Anonymous

아 그렇군요.

그래서 제가 고려대 정보전산처에 전화해서 상황 설명하고 특정 패스 아래로 풀어달라고 이야기 했습니다. 

언제 풀릴지는 모르지만 전화상으로는 호의적인거 같았습니다. 

choi

고감자님 안녕하세요. 저는 미국에서 공부하고 있는 공대생입니다 ㅎ 제가 최근에 오피니언 마이닝에 관련된 프로젝트를 시작했는데, 이 패키지 덕분에 일이 정말 많이 수월해질 것 같네요ㅎ 감사드리고요, 혹시 한글 어휘들을 긍정/부정/중립 등으로 나눠놓은 소스가 있는 곳을 아시면 알려주실 수 있으신가요? 품사나 단어 수가 제한적이어도 괜찮고요. 일단 자료를 구할 수 있는지 알아보고 싶어서요. 감사드립니다~

Anonymous

제가 알기로는 그런 말뭉치들은 공개가 되어 있지 않을걸로 알고 있습니다. 대부분의 공개 데이터는 http://www.sejong.or.kr/ 에 있습니다만 긍정, 부정 데이터가 있을지는 모르겠네요. 
국립 국어원 쪽에 문의 해보시는것도 괜찮을거 같습니다. 

그리고 혹시 패키지 사용하시다가 건의 하실 부분 있으시면 언제든지 코멘트 주세요. 

choi

아 공개가 안되어있군요.. 세종 말뭉치는 논문들에 많이 언급이 되어 있어서 찾아봤는데 없는 것 같더라고요. 답변 감사드리고요, 패키지 애프터 서비스도 미리 감사드립니다. ㅎ

Woochang Kang

안녕하세요..KoNLP 패키지에 관해서 문의드립니다. 맥에서 R 2.14 을 사용하고 있습니다. 설치후 테스트 해 보았는데, 다음과 같은 에러가 발생하네요. 

Error in .jcall(“HannanumInterface”, “[S”, “extractNoun”, DicConfPath,  :   java.lang.OutOfMemoryError: Java heap space

혹시 R 의 기본 언어가 영어로 되어 있는 것이 문제일 수 있을까요?

Anonymous

지금 나온 에러 메시지는 Java VM 메모리가 부족해서 나오는 에러 입니다. 제가 Java VM 생성시 메모리를 정해주지않았기 때문에 256m가 기본 메모리일듯 한데요. 이를 512로 올려주면 해결이 될지는 모르겠습니다. 혹시 장문의 문장을 처리 했을때 에러가 나지 않던가요? 아니면 단문으로 쪼갠 문장들을 for문이나 while문으로 계속 사용했을때 나던가요? 

Anonymous

제가 지금 300페이지 한권짜리 한글 문서를 파싱해보고 있는데, 위와 같은 에러는 나지 않습니다. 다만 extractNoun에 인자로 전달되는 문자열이 어느정도 되는지 궁금하네요…

Woochang Kang

빠른 답변 감사드립니다. 이제 막 시작하는 거라, 그냥 한 문장(“집나가면 개고생이다.” ^^;; )을 정해 줬을 뿐입니다. Java는 해당 패키지를 설치하는 과정에서 컴퓨터가 자동으로 인터넷을 검색해서 설치했습니다. 제가 정치학 전공이라, 기본설정을 바꾸고 뭐, 이러거는 잘 못하는데, 혹시 메모리를 바꾸려면 어떻게 해야 할까요.. 

Anonymous

지금 현재 512m까지 VM을 사용할 수 있게끔 코드 수정을 완료 했습니다만 저정도의 간단한 문장이 위와 같은 에러를 뽑고 실행이 안된다는게 좀 이해가 안되네요. 

일단 
library(KoNLP) 
하신 후 
.jinit(parameters=c(“-Dfile.encoding=UTF-8”, “-Xmx512m”))

위 명령어를 실행 후 테스트 해보시길 바랍니다. 

Woochang Kang

여전히 안 되는군요. 혹시 도움이 되실 지 몰라 화면을 캡쳐했습니다. 감사합니다. 

[R.app GUI 1.42 (5933) i386-apple-darwin9.8.0]

[History restored from /Users/woochangkang/.Rapp.history]

> library(KoNLP) 
Loading required package: rJava
> .jinit(parameters=c(“-Dfile.encoding=UTF-8”, “-Xmx512m”))
[1] 0
> send extractNoun(send)
Error in .jcall(“HannanumInterface”, “[S”, “extractNoun”, DicConfPath,  : 
  java.lang.OutOfMemoryError: Java heap space

Anonymous

제가 에러를 재현해 보기 위해서 회사분의 맥에다 설치하고 해봤는데, 그런 에러는 나지 않았습니다.

아래는 맥에서의 설치/실행 로그 입니다.

—————————————

R version 2.14.0 (2011-10-31)Copyright (C) 2011 The R Foundation for Statistical ComputingISBN 3-900051-07-0Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)R은 free 소프트웨어이고, [완전하게 무보증]입니다.일정한 조건에 따르면, 자유롭게 이것을 재배포할수가 있습니다.배포 조건의 상세한것에 대해서는 ‘license()’ 또는 ‘licence()’ 라고 입력해주십시오R는 많은 공헌자에의한 공동 프로젝트입니다더 자세한것에 대해서는 ‘contributors()’라고 입력해 주십시오.또는, R나 R의 패키지를 출판물로 인용할때의 형식에 대해서는 ‘citation()’라고  입력해주십시오’demo()’라고 입력하면, demos를 볼수가 있습니다.’help()’라고 한다면, on-line help가 나옵니다.’help.start()’로 HTML 브라우저에 의한 help가 보여집니다’q()’라고 입력하면 R를 종료합니다[R.app GUI 1.42 (5933) x86_64-apple-darwin9.8.0]install.packages(“KoNLP”)이 세션으로 사용에 CRAN mirror를 선택해 주십시오also installing the dependency ‘rJava’URL ‘http://cran.nexr.com/bin/macosx/leopard/contrib/2.14/rJava_0.9-2.tgz’를 시도하고 있습니다Content type ‘application/x-gzip’ length 795617 bytes (776 Kb)열린  URL==================================================downloaded 776 KbURL ‘http://cran.nexr.com/bin/macosx/leopard/contrib/2.14/KoNLP_0.0-7.4.tgz’를 시도하고 있습니다Content type ‘application/x-gzip’ length 4572757 bytes (4.4 Mb)열린  URL==================================================downloaded 4.4 Mb다운로드된 패키지는 /var/folders/v9/gz0kjv2n7678zlg13r1sxmjr0000gp/T//Rtmpc9LmtR/downloaded_packages에있습니다library(KoNLP)요구된 패키지 rJava를 로드중입니다extractNoun(“R는 많은 공헌자에의한 공동 프로젝트입니다”)[1] “R”            “공헌자에의한” “공동”         “프로젝트”    extractNoun(“R는 많은 공헌자에의한 공동”)[1] “R”            “공헌자에의한” “공동” 

Anonymous

아무래도 맥에서 자바 설정을 다시 해보심이 어떤가요? 

Woochang Kang

음.. 자바설정을 다시 한다는 것이 무엇을 뜻하는지 잘 모르겠습니다. 그리고, 보내 주신 예문을 보니, 기본언어가 한글로 설정이 되어 있던데, 저는 기본언어가 영어거든요. 이러한 차이 때문에 에러가 발생할 가능성은 없는 건가요? 감사합니다. 

Anonymous

아마 맥에서는 기본 인코딩이 UTF-8로 별도의 설정이 없어도 한글 문자열 처리가 잘 됩니다. 
> localeToCharset()이걸 쳐보시면 UTF-8이 출력될껍니다.

문제는 자바 VM이 메모리 부족 현상을 호소한다는건데요. 이 부분은 제 패키지하고는 별도로 설치된 자바 VM 자체의 문제로 보입니다만 그게 아니라면 로컬 메모리가 너무 부족해서 VM이 요구하는 메모리 할당을 못하는 것일수도 있을거 같습니다. 

유휴 시스템 메모리를 확인해 보심을 추천합니다. 

Woochang Kang

안녕하세요. 자바도 다시 설치해 보고, 또 R에서 java heap size 도 바꿔보고 했는데, 계속 동일한 에러가 나서 잊고 있었습니다. 오늘 우연히 R64에서 동일한 작업을 수행했는데, 이번에는 문제가 없네요. 혹시 다른 분들꼐 도움이 될까 해서 글 남깁니다. 감사합니다. 

Anonymous

일단 머신이 64비트이시면 R 64비트를 쓰시는게 더 나은건 사실입니다만, R32도 문제가 없을텐데, 저도 이유가 뭔지 궁금하네요. 
여튼 팁 공유해주셔서 감사드립니다. 

[…] R 한글 인코딩 문제 (KoNLP 작업 과정에서…) – http://freesearch.pe.kr/archives/2655 오라클·EMC·IBM·SAP·MS…빅 데이터 전쟁의 승자는 누구될까 – […]

고영혁 (Dylan Ko)

고감자님 안녕하세요. 자체서비스의 분석툴로 R의 KoNLP를 살펴보고 있는 R입문자 고영혁입니다. 우선 너무나 좋은 라이브러리 만들어주셔서 감사드리며, 앞으로 정말 알차게 쓰도록 하겠습니다. 그런데 시작부터 좀 막히고 있는데 도움부탁드리러 왔습니다.

이런저런 삽질은 거두절미하고, 라이브러리 로드한 다음에 아래 명령을 실행하면 아래와 같은 에러메시지가 떠서 더이상 진행을 못하고 있습니다.

> extractNoun(“R는 많은 공헌자에 의한 공동 프로젝트 입니다.”)
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
다음에 오류가 있습니다`Encoding<-`(`*tmp*`, value = "UTF-8") :
a character vector argument expected
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at kr.ac.kaist.swrc.jhannanum.hannanum.Workflow.analyzeInSingleThread(Workflow.java:835)
at kr.ac.kaist.swrc.jhannanum.hannanum.Workflow.analyze(Workflow.java:534)
at kr.pe.freesearch.jhannanum.comm.HannanumInterface.extractNoun(HannanumInterface.java:141)

어떻게 해결해야 할까요? ㅠㅠ

일단 이것부터 해결이 되야 이 다음의 여러가지를 시도해볼 수 있을텐데요…

고영혁 (Dylan Ko)

혹시나해서 윈도우7 64bit 환경에서 해봤는데 문제 없이 잘 되네요;;;; 아래와 같은 에러가 나올 때 맥에서는 대체 어떤 부분이 문제가 되고 어떻게 해결해야 하는지 궁금합니다. ㅠㅠ

gogamza

아마도 맥에서 32비트 R과 64비트 R 바이너리가 모두 설치가 되지 않나요?

64비트 바이너리를 실행하시고 Java VM역시 64비트용으로 실행이 되어야 됩니다.
두 버전 모두가 설치가 되어 환경설정상 잘못된 자바를 불러오면서 생기는 문제로 생각되네요.

고영혁 (Dylan Ko)

체크해보겠습니다~ 감사합니다!!

고영혁 (Dylan Ko)

Mac 은 Core i7 기반이고, OSX 10.8.3 이 설치되어 있습니다.

터미널에서 자바 버전을 확인해보면,

java version “1.6.0_43”
Java(TM) SE Runtime Environment (build 1.6.0_43-b01-447-11M4203)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01-447, mixed mode)

으로 나오고, 어제 질문드릴 때는 오라클의 1.7 64비트 버전이었는데 혹시나 해서 제거하고 산사자 순정 상태로 다시 만들어 놓았구요.

R은 현재 최신버전인 3.0.0 을 설치했고 이 녀석은 32비트 64비트 따로 다운로드하는 것이 아니라 기본으로 64비트인 것 같던데…

역시 다음과 같은 에러가 나옵니다.

> extractNoun(“R는 많은 공헌자에 의한 공동 프로젝트입니다”)

다음에 오류가 있습니다`Encoding<-`(`*tmp*`, value = "UTF-8") :
a character vector argument expected
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at kr.ac.kaist.swrc.jhannanum.hannanum.Workflow.analyzeInSingleThread(Workflow.java:835)
at kr.ac.kaist.swrc.jhannanum.hannanum.Workflow.analyze(Workflow.java:534)
at kr.pe.freesearch.jhannanum.comm.HannanumInterface.extractNoun(HannanumInterface.java:141)

해결책이 없을까요? 일단 KRUG에도 올려보도록하겠습니다.

gogamza

이 문제는 아마도 R 3.0 맥 바이너리만의 문제가 아닐까 합니다. 윈도나 리눅스 그리고 이전 버전에서는 모두 이상이 없으니 말입니다.

고요한고흐

안녕하세요 한글 인코딩 문제로 이곳저곳 찾아보다가 이런게 있길래 써봤는데

패키지 rJava를 로드중입니다
Error : .onLoad failed in loadNamespace() for ‘rJava’, details:
call: inDL(x, as.logical(local), as.logical(now), …)
error: 공유된 객체 ‘C:/Program Files/R/R-2.15.3/library/rJava/libs/x64/rJava.dll’를 불러올 수 없습니다:
LoadLibrary failure: 지정된 모듈을 찾을 수 없습니다.

에러:패키지 ‘rJava’ 는 로드될 수 없습니다

이런 에러를 내고 있네요 ㅠㅠ
어떤게 혹시 문제 인지 아시나요??

gogamza

아마도 자바가 설치되지 않았거나 JAVA_HOME 환경변수가 64비트 버전의 자바 환경으로 되어 있지 않아서 문제가 생긴 경우로 보입니다.
환경을 확인 하셔야 될듯 하네요.

고요한고흐

자바 환경변수 설정하니 되네요 ㅎㅎ
지금 R 초보라서 궁굼한거 하나 질문 드려도 되나요??
제가 온라인에서 JSON형태로 받아온걸 처리하려고 하는데
한글 파일이 들어있으면 꺠져서 나오는데….KoNLP를 사용해서
이를 해결할 수 있는건가요??

계량

고감자님 안녕하세요, 이번에 텍스트 마이닝 쪽을 새로이 공부하고 있는 입문자입니다.
실습을 겸해서 트위터를 분석하는 일도 병행하고 있는데… R의 twitteR 패키지를 이용하여 유저들의 트윗글들을 받아오는 처리까지는 진행하고 있습니다.
다만 userTimeline이나 searchTwitter 함수를 이용했을 때 한글이 깨지는 문제가 발생하여… 이에 대해서 찾아보다가 KoNLP 패키지를 알게 되었네요 ㅎㅎ 많은 예제들을 찾아보니 패키지의 뛰어남을 충분히 느껴볼 수 있었습니다… 그리고 이 곳에 고감자님이 올리신 분석 글들을 보며 저 혼자 탄성을 연발하고 있네요 ㅎㅎ
그런데 제가 입문자라서 그런지 ㅠㅠ KoNLP 패키지를 정확히 사용하고 있지 못한 것 같습니다. 여러 예제를 살펴보니 userTimeline이나 searchTwitter 함수를 사용하기 전에 library(KoNLP) 명령을 통해 패키지를 불러오는 일 외에는 별다른 명령을 입력하지 않아도 한글이 깨지는 문제를 잘 해결해주는 것 같던데요…
저의 경우 예제들을 따라서 library(KoNLP)와 library(twitteR)을 불러오고 중간에 OAuth를 얻는 모든 과정을 거친 후 userTimeline이나 searchTwitter 함수를 이용해보았는데 여전히 한글이 깨지는 문제가 발생합니다… 혹시나 해서 미국 오바마 대통령의 트윗이라든가 영어로 되어있는 트윗 계정의 글들을 받아와봤는데, 이는 잘 되더군요… 받아오는 과정 자체에는 문제가 있는 것 같지 않습니다. 다만 제가 R에서 KoNLP 패키지를 정확히 적용시키는 방법을 잘 숙지하고 있지 못하여 발생하는 문제인 듯 합니다..ㅠㅠ 윈도우 7 32bit 64bit 모두에서 해보고 있습니다.
KoNLP 패키지의 사용에서 제가 놓치고 있는 부분이 있다면 그에 대해 여쭙고 싶습니다… 말씀 부탁드립니다..

gogamza

KoNLP의 문제가 아니라 twitteR이 버전업을 하면서 나온 문제입니다.

이런 문제는 대부분의 경우 리눅스나 맥 버전의 R에서는 잘 동작하나 윈도우에서 문제들이 자주 발생하죠…KoNLP의 경우 윈도우 리눅스 모두 잘 동작하게 만들었으나 다른 영어권 패키지의 경우 CJK는 거의 변방의 문자일 뿐이겠죠… twitteR 저자에게 직접 연락을 해보시는게 제일 빠른 방법입니다.

Joseph Kang

안녕하세요 고감자님

youtube에 업로드하신 인코딩 설명 영상을 보고 인코딩 변환 작업을 R에서 시도해보았는데요.

ASCII 코드를 iconv함수를 이용하여 UTF-8로 변환하려고 했는데 잘 되지 않아서 질문드립니다.

(aaaa.csv가 ASCII 코드로 작성된 csv 파일입니다.

f <- file("aaaa.csv")
ff <- readLines(f)
Encoding(ff[3])

여기까지 실행하면 "unknown" 이라는 결과값이 확인되는데요.

영상을 통해 알려주신 것처럼

fff <- iconv(ff[3], "ASCII", "UTF-8")
fff == ff[3]

을 실행하면 TRUE 가 나옵니다.

ASCII 코드로 작성된 ff[3]가 UTF-8로 변환되었다면

false로 나와야할텐데요. 어떤 이유에선지

TRUE로 나오고 fff를 실행해도 ASCII 코드로 작성되었기 때문에

한글로 표시가 되지가 않습니다.

시간 되실 때 한번 확인해주시면 좋겠습니다. 감사합니다.

lalala G

안녕하세요? 저는 R입문자로 윈도우 64비트 사용하고 있고 R studio 3.4.0을 사용하고 있습니다. 텍스트 분석을 하려고 KoNLP 패키지를 설치하고 txt 파일을 불러왔는데 콘솔창에서 한글이 깨지는데ㅠㅠ 이건 어떻게 해결하면 좋을지 알려주시면 정말 감사하겠습니다!!