빅데이터 전처리 과정에서 숫자를 다루는 것만큼이나, 혹은 그보다 수백 배 더 골머리를 앓게 하는 것이 바로 “비정형 문자(String/Text)” 데이터입니다. 게시판 제목, 상품명, 구글/네이버 고객 코멘트 리뷰 등 현실 세계 데이터의 상당수는 띄어쓰기부터 온갖 특수기호까지 제멋대로 뒤섞인 텍스트 형태로 존재합니다.
R의 stringr 패키지는 이런 지저분한 문자열을 마치 사무라이의 검처럼 자유자재로 자르고, 붙이고, 다듬을 수 있는 “문자열 전용 스위스 아미 나이프”입니다. 더욱 강력한 점은 모든 함수가 str_ 접두사로 시작해 RStudio에서 자동완성(Tab)으로 찾기도 직관적이라는 것입니다. 오늘은 가장 사랑받는 stringr 패키지의 핵심 기초 함수들을 소개합니다.
1. 문자의 길이를 정확히 타이핑하기: str_length()
단어의 글자 수가 정확히 몇 개인지 알아내는 가장 베이스가 되는 함수입니다. 엑셀의 LEN() 함수와 완벽히 1대1로 동일합니다. 단, 한글의 받침 유무와 상관없이 공백(Space)과 특수기호까지 모두 1글자의 길이로 취급함에 유의하세요.
library(stringr)
"슬통이" |> str_length()
> [1] 3
"슬기로운 통계생활!" |> str_length()
> [1] 10
(슬기로운(4) + 공백(1) + 통계생활(4) + 느낌표(1) = 10글자로 정확히 판독해 냅니다.)
2. 흩어진 조각 문자열 하나로 강력하게 꿰매기: str_c()
조각난 문자나 수치형 벡터들을 하나의 텍스트 덩어리로 예쁘게 이어 붙일 때 쓰입니다. (엑셀의 CONCATENATE나 & 연산자에 해당합니다.) 이 함수를 쓸 때 가장 빛을 발하지만 제일 헷갈려 하는 두 가지 옵션인 sep와 collapse를 반드시 구분해서 사용해야 합니다.
① 여러 개별 문자열을 순차적으로 이어 붙일 땐 sep
함수 괄호 안에 쉼표(,)로 개별적으로 입력된 각 독립적 재료들 사이에 접착제를 고르게 발라줍니다.
str_c("1st", "2nd", "3rd", sep = ", ")
> [1] "1st, 2nd, 3rd"
② 이미 뭉쳐진 거대한 벡터를 하나의 문장으로 압축할 땐 collapse
이미 1분기부터 5분기까지처럼 하나의 리스트나 벡터(Vector)로 묶여서 들어온 녀석들을 짓눌러서 완전히 하나의 텍스트 문장으로 종결 압축시켜 버릴 때 씁니다.
str_c(1:5, collapse = "-")
> [1] "1-2-3-4-5"
3. 필요한 단어만 쏙쏙! 일치하는 데이터 검색 추출
텍스트 데이터 수백만 줄 가운데 “설선물” 이라는 타겟 이벤트 단어가 들어간 리뷰나 제목만 찾아서 빼내고 싶다면 어떻게 할까요?
sample_str <- c(
"[닭터의 자연] 닭(볶음용)",
"설선물[가을향기] 유기농 장 세트 수령일: 2/1",
"설선물[베링가] 허니콤 세트",
"[셰프찬] 성게 미역국"
)
방 번호(위치 인덱스)를 먼저 찾고 싶다면: str_which()
sample_str |> str_which("설선물")
> [1] 2 3
(R에게 물어보니, 그 단어는 두 번째와 세 번째 줄에 숨어있다고 위치를 정확히 좌표로 찝어 알려줍니다.)
좌표가 아니라 문장 자체를 통째로 가져오고 싶다면: str_subset()
sample_str |> str_subset("설선물")
> [1] "설선물[가을향기] 유기농 장 세트 수령일: 2/1"
> [2] "설선물[베링가] 허니콤 세트"
4. 오타와 불순물, 내 입맛대로 싹 다 지우고 바꾸기: str_replace()
발견한 글자를 찾아 다른 영단어로 덮어쓰거나 아예 통째로 지워버리는(삭제) 대체 기능입니다. 띄어쓰기를 전부 삭제("")해서 다닥다닥 붙여버리는 데이터 프레임 클리징 마법을 부려봅시다.
# 뒤에 all이 안 붙은 기본형은 문장에서 발견된 "첫 번째 공백 단 1개"만 삭제합니다.
sample_str |> str_replace(" ", "")
> [1] "[닭터의자연] 닭(볶음용)"
> [2] "설선물[가을향기]유기농 장 세트 수령일: 2/1"
> [3] "설선물[베링가]허니콤 세트"
> [4] "[셰프찬]성게 미역국"
# 문장 안의 "존재하는 모든 곳"의 다중 공백을 모조리 색출해 삭제! (가장 강력함)
sample_str |> str_replace_all(" ", "")
> [1] "[닭터의자연]닭(볶음용)"
> [2] "설선물[가을향기]유기농장세트수령일:2/1"
> [3] "설선물[베링가]허니콤세트"
> [4] "[셰프찬]성게미역국"
함수 이름 뒤에 _all이 붙은 버전을 쓰면 문장 처음 시작부터 끝까지 레이더로 스캔하며 매칭되는 모든 단어를 싹 다 바꿔주기 때문에 전처리 과정에서 가장 사랑받고 필수적인 함수입니다.
stringr 패키지가 제공하는 str_ 접두사 시리즈만 제대로 숙지한다면, 아무리 복잡한 쇼핑몰 상품명 정제, 고객 분노 코멘트 필터링 등 실무에서 마주하는 온갖 고구마같이 팍팍한 자연어 텍스트들을 전부 시원하게 사이다처럼 만들 수 있습니다!
당신이 좋아할 만한 콘텐츠
by Google Adsense