str_split은 문자열과 패턴을 벡터화 하는 것으로, 문장에 있는 단어를 벡터 형태로 분리 하는 것이고, str_replace는 특정 문자열과 패턴을 바꾸어 주는 기능 이며, gsub는 특정 문자열과 패턴을 바꾸어 주는 기능으로써, str_replace와 기능은 거의 같다. 국내에서 일반적으로 용어를 나용할때, 문자열 나누기라고 한다.
아래의 내용은 현업 실무에서 어려운 문제에 봉착 했을 때, 푸는 문제이다. 즉 아래의 내역을 보고, 몇 톤인지 규격을 뽑아 내는 것을 응용하는 것인데, 형태소 분석기에서는 아래와 같은 기능을 지원 하지 않는다.
str_split, str_replace, gsub R |
1. 실전 문제
오늘 풀어야 하는 과제, 아래에 어지럽게 널려 있는 문자 중에서 TON을 골라서 내시오.
그럼 위의 문자열에서 25TON, 2.8TON, 2TON을 각각 추출하여, 정리하고자 할 때, 어떻게 해야 할까?
아래의 패키지를 사용 할것이다.
stringr : 문자열은 크게 눈에 띄는 구성은 아니지만, 데이터 정리 및 준비 작업에서 큰 역할을 한다. 이것은 해들리 위컴이 가능한 쉽게 문자열 작업을 할 수 있도록 설계된 것이다.
오늘은 str_split, str_replace을 사용 할 것이다.
이것을 하면서, 정규화 표현식도 같이 정리 할 것이다.
2. 데이터의 입력
데이터는 벡터 형태로 입력 한다. 향후 데이터 프레임을 만들어도 벡터를 묶어서 만들기 때문에 데이터 프레임 응용 할 때도 많이 쓰인다.
library(stringr)
sentence <- c("OVER HEAD CRANE(MAGNET) 25TON (C-512)",
"MAGNET CRANE(SEMI) 2.8TON C-522",
"25TON BLOCK LOADER (PBS 5BAY)",
"2TON(3DS 뒷편 법면쪽)",
"LIFTING MAGPOT DEVICE(2.5TON)"
)
3. str_split 벡터화 실행
문자열 패턴만 가지고 벡터화를 실행 하였을 경우에는 우리가 원하는 답이 나오지 않는다. 즉 TON 별로 데이터가 나누어지지 않는다.
# TON을 데이터 정규화 표현식을 안하였을 경우
mat<- str_split(sentence, " ", simplify = TRUE )
mat
## [,1] [,2] [,3] [,4] [,5] ## [1,] "OVER" "HEAD" "CRANE(MAGNET)" "25TON" "(C-512)" ## [2,] "MAGNET" "CRANE(SEMI)" "2.8TON" "C-522" "" ## [3,] "25TON" "BLOCK" "LOADER" "(PBS" "5BAY)" ## [4,]
"2TON(3DS"
"뒷편" "법면쪽)" "" "" ## [5,] "LIFTING" "MAGPOT"
"DEVICE(2.5TON)"
"" ""
여기에서 옵션 simplify =TRUE 하면 데이터 형태가 매트릭스로 바뀌고, FALSE 로 하면 list 형태로 반환된다.
4. 데이터 정규화 표현식 이용 특수문자 제거
# 정규화 표현식을 사용하여 특수문자를 제거한 경우
sentence1 <- gsub("\\)", " ", sentence)
sentence1 <- gsub("\\(", " ", sentence1)
sentence1
## [1] "OVER HEAD CRANE MAGNET 25TON C-512 "
## [2] "MAGNET CRANE SEMI 2.8TON C-522"
## [3] "25TON BLOCK LOADER PBS 5BAY "
## [4] "2TON 3DS 뒷편 법면쪽 "
## [5] "LIFTING MAGPOT DEVICE 2.5TON "
sentence1 <- str_replace(sentence, "\\)", "")
sentence1 <- str_replace(sentence1, "\\(", "")
sentence1
## [1] "OVER HEAD CRANEMAGNET 25TON (C-512)" "MAGNET CRANESEMI 2.8TON C-522"
## [3] "25TON BLOCK LOADER PBS 5BAY" "2TON3DS 뒷편 법면쪽"
## [5] "LIFTING MAGPOT DEVICE2.5TON"
5. 데이터 정규화 이후 벡터화 시행
mat<- str_split(sentence1, " ", simplify = TRUE )
mat
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,] "OVER" "HEAD" "CRANE" "MAGNET" "" "25TON" "" "C-512" ""
## [2,] "MAGNET" "CRANE" "SEMI" "" "2.8TON" "C-522" "" "" ""
## [3,] "25TON" "BLOCK" "LOADER" "" "PBS" "5BAY" "" "" ""
## [4,] "2TON" "3DS" "뒷편" "법면쪽" "" "" "" "" ""
## [5,] "LIFTING" "MAGPOT" "DEVICE" "2.5TON" "" "" "" "" ""
6. 최종 정리
library(stringr)
sentence <- c("OVER HEAD CRANE(MAGNET) 25TON (C-512)",
"MAGNET CRANE(SEMI) 2.8TON C-522",
"25TON BLOCK LOADER (PBS 5BAY)",
"2TON(3DS 뒷편 법면쪽)",
"LIFTING MAGPOT DEVICE(2.5TON)"
)
# 사용자 함수 정리
vector_split_fun <- function(x){
sentence1 <- str_replace(x, "\\)", "")
sentence1 <- str_replace(sentence1, "\\(", "")
mat <-str_split(sentence1, " ", simplify = TRUE )
return(mat)
}
# 사용자 함수 실행
vector_split_fun(sentence)
## [,1] [,2] [,3] [,4] [,5]
## [1,] "OVER" "HEAD" "CRANEMAGNET" "25TON" "(C-512)"
## [2,] "MAGNET" "CRANESEMI" "2.8TON" "C-522" ""
## [3,] "25TON" "BLOCK" "LOADER" "PBS" "5BAY"
## [4,] "2TON3DS" "뒷편" "법면쪽" "" ""
## [5,] "LIFTING" "MAGPOT" "DEVICE2.5TON" "" ""
댓글 없음:
댓글 쓰기