R프로그래밍 - 한글을 소리나는대로 영어로 변환하기

R 언어에서 stringi는 문자열 처리를 위한 강력한 패키지 중 하나이다. 이 패키지는 다양한 문자열 연산을 수행하는데 사용되며, 유니코드 문자열, 정규표현식, 문자열 분할, 결합, 변환 등 다양한 기능을 제공한다. 그 중에 한글을 소리나는대로 알파벳으로 변환하는 기능을 알아보려 한다.

stri_trans_general

stri_trans_general 함수를 이용하면, 한글을 발음나는대로 영어로 변환할 수 있다. 아래는 사용 예시이다.

hangul_text = "안녕하세요"
latin_text = stri_trans_general(hangul_text, "Hangul-Latin")

# 출력결과
[1] "annyeonghaseyo"

이렇게 변환한 영어를 다시 한글로 재변환 할 수 있을까? 가능하다.

hangul_text = "닭고기"

(latin_text = stringi::stri_trans_general(hangul_text, "Hangul-Latin"))
[1] "dalg-gogi"

(hangul_text2 = stringi::stri_trans_general(latin_text, "Latin-Hangul"))
[1] "닭고기"

ICU

함수에서 사용되는 변환 규칙은 ICU (International Components for Unicode) 라이브러리를 사용하고 있다. ICU는 유니코드 문자열을 다루는 다양한 기능을 제공하여 국제화 및 지역화 (i18n) 작업을 보다 쉽게 만든다. 이 라이브러리는 C 및 C++로 작성되었으며, Java, Python, Ruby, PHP 등 다양한 프로그래밍 언어에서 사용할 수 있다.

마지막으로 약간 긴문장도 변환 및 복원이 잘되는지 실행해봤다.

> hangul_text1 = "오늘 날씨가 아주 맑았다. 그리고 아침에 일어나 간단하게 씨리얼과 사과 반쪽을 먹었다."

> (latin_text = stringi::stri_trans_general(hangul_text1, "Hangul-Latin"))
[1] "oneul nalssiga aju malg-assda. geuligo achim-e il-eona gandanhage ssilieolgwa sagwa banjjog-eul meog-eossda."

> (hangul_text2 = stringi::stri_trans_general(latin_text, "Latin-Hangul"))
[1] "오늘 날씨가 아주 맑았다. 그리고 아침에 일어나 간단하게 씨리얼과 사과 반쪽을 먹었다."

파일명 영문 변환

사실 이런 것보다도 파일명 한글인 것을 영어로 변환해야 할 필요가 있거나, 데이터 엑셀 헤더의 정보를 영어로 변환해서 데이터 분석하기에 조금 더 편한 방식으로 변환하여 사용중이다. 최근에 받은 파일들이 한글로 되어 있어서, 영문파일명으로 변환해야 했다.

list.files(path = '~/data/map/grid/from') |> 
  enframe(name = NULL) |> 
  mutate(value = map_chr(value, URLdecode), .before = value) |> 
  mutate(value = str_sub(value, 32))

# A tibble: 30 × 1
   value        
   <chr>        
 1 grid_가다.zip
 2 grid_가라.zip
 3 grid_가사.zip
 4 grid_가아.zip
 5 grid_나나.zip
 6 grid_나다.zip
 7 grid_나라.zip
 8 grid_나마.zip
 9 grid_나바.zip
10 grid_나사.zip
# ℹ 20 more rows
# ℹ Use `print(n = ...)` to see more rows

아래처럼 stri_trans_general 함수를 이용해서 영문파일명으로 변환이 가능하기 때문에, 영문으로 파일명을 일괄 변경할 일이 있다면 사용해도 좋을 듯 하다.

list.files(path = '~/data/map/grid/from') |> 
  enframe(name = NULL) |> 
  mutate(value = map_chr(value, URLdecode), .before = value) |> 
  mutate(value = str_sub(value, 32)) |> 
  mutate(trans = map_chr(value, stringi::stri_trans_general, "Hangul-Latin"))

# A tibble: 30 × 2
   value         trans        
   <chr>         <chr>        
 1 grid_가다.zip grid_gada.zip
 2 grid_가라.zip grid_gala.zip
 3 grid_가사.zip grid_gasa.zip
 4 grid_가아.zip grid_gaa.zip 
 5 grid_나나.zip grid_nana.zip
 6 grid_나다.zip grid_nada.zip
 7 grid_나라.zip grid_nala.zip
 8 grid_나마.zip grid_nama.zip
 9 grid_나바.zip grid_naba.zip
10 grid_나사.zip grid_nasa.zip
# ℹ 20 more rows
# ℹ Use `print(n = ...)` to see more rows
r 

더 보면 좋을 글들