R 실전 문자열 나누기 str_split[문자열과 패턴 벡터화], str_replace , gsub [문자열과 패턴을 바꿈] - 내역에서 규격을 추출하여 정리 하고 싶은 경우 실전예제]

   str_split은  문자열과 패턴을  벡터화 하는 것으로,  문장에 있는 단어를 벡터 형태로 분리 하는 것이고,  str_replace는 특정 문자열과 패턴을 바꾸어 주는 기능 이며,  gsub는 특정 문자열과 패턴을 바꾸어 주는 기능으로써, str_replace와 기능은 거의 같다.  국내에서 일반적으로 용어를 나용할때,  문자열 나누기라고 한다.  

   아래의 내용은  현업 실무에서  어려운 문제에 봉착 했을 때,  푸는 문제이다.  즉 아래의 내역을 보고,  몇 톤인지 규격을 뽑아 내는 것을 응용하는 것인데,  형태소 분석기에서는 아래와 같은 기능을 지원 하지 않는다.   

str_split, str_replace, gsub  R

1. 실전 문제  

오늘 풀어야 하는 과제,  아래에 어지럽게 널려 있는 문자 중에서  TON을 골라서 내시오. 

         "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"

 그럼 위의 문자열에서  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. 데이터 정규화 표현식 이용 특수문자 제거 

gsub를 이용하여, 특수문자 괄호를 제거하니,   데이터를 분리 할 수 있는 형태로 바뀌었다.  

# 정규화 표현식을 사용하여 특수문자를 제거한 경우 
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 "

str_replace를 이용하여, 특수문자 괄호를 제거하여 보았다.  물론 앞에 것과 같은 결과가 나왔다. 

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"

둘중에 어느것이 좋은지는 각자 판단 하는 것이 좋겠지만,  나는  코딩의 의 일관성을 위하여 str_replace() 함수를 사용할 것이다. 

5.  데이터 정규화 이후 벡터화 시행

   아래와 같이 TON이  정확하게 분리가 되었다. 

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. 최종 정리  

  위의 내용을 함수로 만들어 정리 해 보겠다.   물론 gsub보다는 str_split로 정리 하겠다. 사용자 함수를 만들면 아주 간단하고,  재 사용 할 수 있다. 
 

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" ""      ""

댓글 없음:

댓글 쓰기

[주식 클로드 자동매매 프로젝트] 제2편. 데이터 인프라 구축 — 모델보다 데이터가 먼저다

 머신러닝 모델을 이야기하기 전에, 그 모델이 먹는 데이터가 어디서 어떻게 왔는지부터 정직하게 밝혀야 한다. 이 프로젝트에서 가장 많은 시간이 들어간 부분은 화려한 모델 튜닝이 아니라, "내가 정말 그 데이터를 갖고 있는가"를 확인하...