데이터분석가/Coding

[R] 비정형(텍스트) 데이터 전처리를 위한 함수

Jeenee_Lee 2019. 1. 14. 13:41

석사 논문을 쓸 당시 Doc2Vec 알고리즘을 사용하기 위해 text 데이터를 수집해 전처리 과정을 진행해야했다. 

이때 가장 필요했던 것 중 하나가 적절한 함수와 그때그때 상황에 맞는 정규표현식. 

정작 논문 쓸 당시에는 정규표현식을 잘 몰라서 시간을 굉장히 비효율적으로 사용할 수 밖에 없었는데, 지금도, 앞으로도 text 데이터는 쓸 일이 많기 때문에 한 번 정리해두려고 한다.


base함수stringr 패키지 함수 는 유사한 점이 많으므로 함께 정리한다.

다만 stringr 패키지에 있는 함수명들이 직관적인 경우가 많아 개인적으로 더 선호하는 편이지만

패키지 설치가 어려운 환경(회사 내부 서버 등)를 대비해 둘 다 정리한다.




pattern이 있는 문자 찾기


grep(pattern, x, ...) : 기본 설정 상 pattern 과 일치하는 index를 반환한다.

value = TRUE : pattern 이 감지된 element를 반환한다.

fixed = TRUE : 정규표현식이 아니라 pattern 자체를 인식한다.

grep( '.' , c('abc', 'bcd', 'd.ef')) 

>> 1 2 3

grep( '.' , c('abc', 'bcd', 'd.ef'), value = TRUE) 

>> c('abc', 'bcd', 'd.ef')

grep( '.' , c('abc', 'bcd', 'd.ef'), fixed = TRUE) 

>> 3


str_which(x, pattern) : grep(pattern, x, fixed = FALSE, value = FALSE) 와 동일

str_which(c('abc', 'bcd', 'd.ef') , '.') 

>> 1 2 3

str_which(c('abc', 'bcd', 'd.ef') , '\\.') 

>> 3


grepl(pattern, x, ...) : pattern 과 일치여부, 즉 TRUE / FALSE로 반환한다.

여러 pattern을 감지하고 싶을 때, 혹은 제외하고 싶은 패턴이 있을 때 사용하면 유용함.

grepl( '.' , c('abc', 'bcd', 'd.ef')) 

>> TRUE TRUE TRUE

grepl( '.' , c('abc', 'bcd', 'd.ef'), fixed = TRUE) 

>> FALSE FALSE TRUE


str_detect(x, pattern) : grepl(pattern, x, fixed = FALSE) 와 동일

str_detect( c('abc', 'bcd', 'd.ef') , '.') 

>> TRUE TRUE TRUE

str_detect( c('abc', 'bcd', 'd.ef') , '\\.') 

>> FALSE FALSE TRUE





pattern이 있는 위치 찾기


regexpr(pattern, x) : pattern이 첫번째로 나타난 위치

regexpr('ab', c('abc', 'bcd', 'd.ef', 'abca'))

[1]  1 -1 -1  1  → pattern의 위치 : 있다면 위치를, 없다면 -1을 반환.

attr(,"match.length")

[1]  2 -1 -1  2  → pattern과 일치하는 length 반환. pattern이 'ab'로 2글자이기 때문에 length 또한 2 또는 -1 (없는 경우 -1 반환)

attr(,"index.type")

[1] "chars"

attr(,"useBytes")

[1] TRUE


str_locate(x, pattern) : regexpr(pattern, x)와 동일. 

각 vector 별로 pattern이 나타나는 시작위치/마지막위치를 함께 반환해 str_sub와 같은 다른 함수와 직관적으로 호환가능한 것이 특징.

str_locate(c('abc', 'bcd', 'd.ef', 'abca'), 'ab')

     start end

[1,]     1   2

[2,]    NA  NA

[3,]    NA  NA

[4,]     1   2


gregexpr(pattern, x) : regexpr의 정보가 list 형태로 출력하여 pattern이 있는 모든 위치를 나타내는 것이 특징.

gregexpr('ab', c('abc', 'abcaab'))

[[1]]          → 'abc' 내에서 찾아낸 정보

[1] 1

attr(,"match.length")

[1] 2

attr(,"index.type")

[1] "chars"

attr(,"useBytes")

[1] TRUE


[[2]]        → 'abcaab' 내에서 찾아낸 정보

[1] 1 5     → 'abcaab' 내에서 1번째 글자에 'ab', 5번째 글자에 'ab'가 나타나는 것을 모두 출력한다.

attr(,"match.length")

[1] 2 2

attr(,"index.type")

[1] "chars"

attr(,"useBytes")

[1] TRUE


str_locate_all(x, pattern) : gregexpr와 같이 pattern이 나타난 모든 위치를 반환.

str_locate_all(c('abc', 'abcaab'), 'ab')

[[1]]

     start end

[1,]     1   2


[[2]]

     start end

[1,]     1   2

[2,]     5   6