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

댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...