[R] 비정형(텍스트) 데이터 전처리를 위한 함수
석사 논문을 쓸 당시 Doc2Vec 알고리즘을 사용하기 위해 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