R에서 입력되는 문서나 데이터셋의 인코딩을 알아내는 작업은 상당히 귀찮은 작업이다. 이 작업 R 쉘에서 간단하게 수행하기 위해 Ruchardet란 패키지를 개발해 CRAN에 submit하였다.
원 알고리즘 및 코드는 Mozilla 계열의 브라우저의 html파일 인코딩 예측을 하는 모듈기반에서 개발을 했으며, 패키지 라이센스도 MPL을 동일하게 따랐다.
아래와 같이 문자열에 대해서 바이트 시퀀스의 패턴을 보고 인코딩 검출을 한다.
## install.packages("Ruchardet")
library(Ruchardet)
nm <- "안녕하세요! 고감자입니다"
benc <- detectEncoding(nm)
benc
## [1] "UTF-8"
nme <- iconv(nm, benc, "euc-kr")
detectEncoding(nme)
## [1] "EUC-KR"
정말 의도하는 바는 아래와 같은 코딩 방식이다. read.table
을 할때 encoding
인자에 함수가 예측한 인코딩을 그대로 쓰는 것이다.
CRAN에 올라간 버전은 아래와 같이 파일 경로까지만 입력을 받게 되어 있다.
unknown <- file.path(system.file("tests", package = "Ruchardet"), "shift_jis.txt")
read.table(unknown, fileEncoding = detectFileEncoding(unknown))
## V1
## 1 日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語日本語
현재 필자의 github에 있는 개발버전은 인터넷에 있는 파일이나 압축 파일 내부에 있는 파일의 인코딩도 검출 가능하게 했으니, 설치가 가능한 분들은 아래 명령어와 같이 개발 버전을 설치하는 걸 추천한다. 참고로 윈도우에서 개발버전을 설치하려면 Rtools설치를 먼저 해야 된다.
## library(devtools)
## install_github("haven-jeon/Ruchardet")
detectFileEncoding("http://freesearch.pe.kr/archives/3995")
## [1] "UTF-8"
urlstr <- "http://dl.dropbox.com/u/8686172/requisites.csv"
# 인터넷의 파일의 인코딩을 파악한다.
enc <- detectFileEncoding(urlstr)
enc
## [1] "EUC-KR"
market_price <- read.csv("http://dl.dropbox.com/u/8686172/requisites.csv", fileEncoding = enc)
head(market_price)
## P_SEQ M_SEQ M_NAME A_SEQ A_NAME A_UNIT A_PRICE
## 1 319572 199 서울중앙시장 305 사과(부사, 300g) 1개 2500
## 2 319573 199 서울중앙시장 306 배(신고, 600g) 1개 3000
## 3 319574 199 서울중앙시장 307 배추(2.5~3kg) 1포기 5000
## 4 319575 199 서울중앙시장 308 무(1kg) 1개 1500
## 5 319576 199 서울중앙시장 309 양파(1.5kg망) 1망 2000
## 6 319577 199 서울중앙시장 23 상추 100g 1200
## P_YEAR_MONTH ADD_COL M_TYPE_CODE M_TYPE_NAME M_GU_CODE M_GU_NAME
## 1 Jul-12 국내산 1 전통시장 140000 중구
## 2 Jul-12 국내산 1 전통시장 140000 중구
## 3 Jul-12 국내산 1 전통시장 140000 중구
## 4 Jul-12 국내산 1 전통시장 140000 중구
## 5 Jul-12 국내산 1 전통시장 140000 중구
## 6 Jul-12 국내산 1 전통시장 140000 중구
패키지는 이전(KoNLP)과 다르게 C++
로 개발을 했으며, Rcpp의 환상적인 기능 덕분에 아주 쉽게 짧은 시간안에 개발을 완료했다. 개발보다는 이 패키지가 다양한 플랫폼에서 단일 소스 패키지만으로 빌드 가능하게 만드는게 어려웠으며 그 과정에서 그동안 간과했던 Writing R Extension이나 CRAN Repository Policy을 정독하게 되었고, 사실 이 두 문서를 정독하지 않으면 패키지 submit을 하기가 힘들겠구나 하는 생각을 했다. 만일 C/C++
같은 언어로 패키지를 만든다면 더욱 이 과정은 필요할 것이다.
1~2달에 한번 정도의 패키지 버전업을 권장하는 CRAN 정책상 위 개발버전의 CRAN 업데이트는 크리스마스 전후가 될 것으로 보인다.
개인적으로 Java
, C++
기반의 패키지를 개발해서 submit을 해본 경험을 해왔는데, 정말 R의 패키지 시스템이 소프트웨어 공학적으로 얼마나 정교한 시스템인지 잘 알 수 있었으며 이런 경험을 한다는게 개발자로서 소중한 경험이라는 사실 그리고 지속적으로 해야 되는 경험이 아닐까 하는 생각을 해본다.
언젠가 이런 패키지 빌드와 submit 경험을 대중에 공유할 기회를 한번 만들어 보면 좋을것 같다.
Ruchardet 패키지 submit 완료 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.