1. 텍스트 처리 함수
1.1 기본 함수
1.1.1 nchar()
- 함수의 문자수 세어 줌
- length는 함수의 원소의 수를 세어준다.
nchar("korea")## [1] 5
nchar("한국")## [1] 16
nchar(c("korea","한국"))## [1] 5 16
length(c("korea","한국"))## [1] 2
1.1.2 substr()
- 문자열 추출
substr("BigDataAnalysis",start=4,stop=7)## [1] "Data"
country=c("korea","japan","china")
substr(country,start=1,stop=3)## [1] "kor" "jap" "chi"
1.1.3 strsplit()
- 하나의 문장을 일정한 기준에 따라 분리
- 마침표 쉼표 괄호 등으로 분리 할 때에는 2개의 \와 함께 사용
myword<-"This is the Big data Analysis"
x=strsplit(myword,split=" ")
x## [[1]]
## [1] "This" "is" "the" "Big" "data" "Analysis"
class(x)## [1] "list"
x=unlist(x)
x## [1] "This" "is" "the" "Big" "data" "Analysis"
myword1<-"This is the Big data Analysis1"
myword2<-"This is the Big data Analysis2"
myword3<-"This is the Big data Analysis3"
myword=c(myword1,myword2,myword3)
for(i in myword)
{
result <- strsplit(myword,split=" ")
}
result## [[1]]
## [1] "This" "is" "the" "Big" "data" "Analysis1"
##
## [[2]]
## [1] "This" "is" "the" "Big" "data" "Analysis2"
##
## [[3]]
## [1] "This" "is" "the" "Big" "data" "Analysis3"
myword<-"우리의 소원은 통일입니다. 꿈에도 소원은 통일입니다."
strsplit(myword,split="\\.")1.1.4 paste()
number=1:10
alphabet=c("a","b","c")
paste(number,alphabet)## [1] "1 a" "2 b" "3 c" "4 a" "5 b" "6 c" "7 a" "8 b" "9 c" "10 a"
paste(number,alphabet,sep="")## [1] "1a" "2b" "3c" "4a" "5b" "6c" "7a" "8b" "9c" "10a"
paste(number,alphabet,sep="-")## [1] "1-a" "2-b" "3-c" "4-a" "5-b" "6-c" "7-a" "8-b" "9-c" "10-a"
paste(number,collapse="")## [1] "12345678910"
paste(alphabet,collapse="")## [1] "abc"
for(i in 1:length(result))
{
print(paste(result[[i]],collapse = " "))
}## [1] "This is the Big data Analysis1"
## [1] "This is the Big data Analysis2"
## [1] "This is the Big data Analysis3"
1.1.5 regexpr()
- 지정된 표현이 텍스트에 등장하는지? 등장한다면 처음 나타나는 위치가 어디인지?
- 해당 표현이 텍스트에 없다면 -1로 표시
myword="우리의 소원은 통일입니다. 꿈에도 소원은 통일입니다."
x=regexpr("입니다",myword)
x## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
x2=regexpr("전쟁",myword)
x2## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
substr(myword,x[1],x[1]+attr(x,'match.length')-1)## [1] ""
# x[1] 시작 위치
# x[1]+attr(x,'match.length')-1 : 시작위치 + 글자수 - 1 = 끝위치1.1.6 gregexpr()
- 함수의 지정된 표현을 텍스트 전체에서 찾는다.
myword="우리의 소원은 통일입니다. 꿈에도 소원은 통일입니다."
x=gregexpr("입니다",myword)
x## [[1]]
## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"index.type")
## [1] "chars"
## attr(,"useBytes")
## [1] TRUE
1.1.7 grep()
- 특정 표현이 나타나는 원소의 번호를 알려준다.
myword=c("우리의 소원은 통일입니다.","꿈에도 소원은 통일 입니다.")
grep("입니다",myword)## integer(0)
grep("우리",myword)## integer(0)
grep("우리",myword,value=T)## character(0)
1.1.8 grepl()
- 나타나는지 여부를 true / false로 출력
myword<-c("우리의 소원은 통일입니다.","꿈에도 소원은 통일입니다.")
a=grepl("입니다",myword)
a## [1] FALSE FALSE
sum(a)## [1] 0
1.1.9 sub(), gsub()
sub() : 처음 등장하는 지정된 표현을 다른 지정된 표현으로 바꿈. gsub() : 모든 지정된 표현을 다른 지정된 표현으로 바꿈
myword<-c("소원은 통일입니다.사랑입니다.","꿈에도 통일입니다.그것입니다.")
sub("입니다","일까요",myword)## [1] "<U+C18C><U+C6D0><U+C740> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>.<U+C0AC><U+B791><U+C785><U+B2C8><U+B2E4>."
## [2] "<U+AFC8><U+C5D0><U+B3C4> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>.<U+ADF8><U+AC83><U+C785><U+B2C8><U+B2E4>."
gsub("입니다","일까요",myword)## [1] "<U+C18C><U+C6D0><U+C740> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>.<U+C0AC><U+B791><U+C785><U+B2C8><U+B2E4>."
## [2] "<U+AFC8><U+C5D0><U+B3C4> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>.<U+ADF8><U+AC83><U+C785><U+B2C8><U+B2E4>."
1.1.10 regmatches()
myword<-c("소원은 통일입니다.사랑입니다.","꿈에도 통일입니다.그것입니다.")
mypattern<-gregexpr("입니다",myword)
regmatches(myword,mypattern)## [[1]]
## character(0)
##
## [[2]]
## character(0)
1.2 정규표현식
1.2.1 숫자와 문자
[:digit:] 숫자로 표시된 텍스트 [:lower:] 소문자 알파벳으로 표시된 텍스트 [:upper:] 대문자 알파벳으로 표시된 텍스트 [:alpha:] 문자로 표시된 텍스트 [:alnum:] 숫자와 문자로 표시된 텍스트
1.2.2 기호류
[:punct:] 구두점으로 표시된 텍스트 (쉼표나 마침표) [:graph:] 가시적으로 표현된 텍스트 (alnum + punct) [:blank:] 스페이스나 탭을 이용하여 공란으로 표현된 텍스트 [:space:] 스페스트, 탭, 줄바꿈 등을 이용하여 공란으로 표현된 텍스트 [:print:] 출력했을 때 확인할 수 있는 텍스트 (alnum + punct + space) [:cntrl:] 와 같은 제어 문자
1.2.3 양화 기호
? 선행 표현을 고려할 수 도, 고려하지 않을 수도 있으며 최대 1회 매칭됨 * 선행표현이 0회 혹은 그 이상 매칭됨 + 선행표현이 1회 혹은 그 이상 매칭됨 {n} 선행표현이 정확하게 n회 매칭됨 {n,} 선행표현이 정확하게 n회 이상 매칭됨 {n,m} 선행표현이 정확하게 n회 이상, m회 미만으로 매칭됨
1.2.4 사용된 표현 추출 regmatches()
myword <- c("5번째는 사랑입니다","7번째는 우정입니다. 36번째는 길이")
mypattern <- gregexpr("[[:digit:]]",myword)
regmatches(myword,mypattern)## [[1]]
## [1] "5" "8" "8" "9" "8" "2" "9" "4" "0" "7" "9" "1" "7" "8" "5" "2" "8"
## [18] "2" "4"
##
## [[2]]
## [1] "7" "8" "8" "9" "8" "2" "9" "4" "6" "0" "8" "1" "5" "7" "8" "5" "2"
## [18] "8" "2" "4" "3" "6" "8" "8" "9" "8" "2" "9" "4" "3" "8" "7" "7" "4"
1.2.5 특정 표현과의 연결
myword <- c("1번째는 통일입니다.","2번째는 가족입니다.")
mypattern <- gregexpr("[[:digit:]](번째)",myword)
regmatches(myword,mypattern)## [[1]]
## character(0)
##
## [[2]]
## character(0)
1.2.6 n회 이상의 문자 조건
myword <- c("1번째는 통일입니다.","2번째는 가족입니다.")
str_extract(myword,"[[:alpha:]]{1,}(니다)")## [1] NA NA
1.2.7 제한 조건
myword <- c("1번째는 통일입니다.","2번째는 가족입니다.","3번째는 옵니다만")
str_extract(myword,"[[:alpha:]]{1,}(니다)")## [1] NA NA NA
1.2.8 빈도 조사
myword <- c("1번째는 통일입니다.","2번째는 가족입니다.","3번째는 옵니다만")
x <- str_extract(myword,"[[:alpha:]]{1,}(니다)")
table(unlist(x))## < table of extent 0 >
1.2.9 특정 키워드 빈도조사
data=c("word","w","wo","ddd","gword")
table(unlist(regmatches(data,mypattern<-gregexpr("word",data))))##
## word
## 2
1.3 stringr::
- 정규 표현식을 비롯한 기본 함수 대부분을 직관적이고 효율적으로 처리하게 해준다.
library(stringr)1.3.1 stingr::str_extract(), str_extract_all()
- 지정된 표현 추출
myword<-c("1번째는 통일입니다.","2번째는 가족입니다.")
str_extract_all(myword,"입니다")## [[1]]
## character(0)
##
## [[2]]
## character(0)
str_extract_all(myword,"입니다",simplify = T) # 행렬로 출력##
## [1,]
## [2,]
1.3.2 stingr::str_locate(), str_locate_all()
- 지정된 표현의 위치 추출
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_locate(myword,"입니다")## start end
## [1,] NA NA
## [2,] NA NA
str_locate_all(myword,"입니다")## [[1]]
## start end
##
## [[2]]
## start end
1.3.3 stringr::str_detect()
- 지정된 표현이 있는지 여부
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_detect(myword,"입니다")## [1] FALSE FALSE
1.3.4 stringr::str_replace(), str_replace_all()
- 지정된 표현 바꾸기
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_replace(myword,"입니다.","일까요?")## [1] "1<U+BC88><U+C9F8><U+B294> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>.1-2<U+BC88><U+C9F8><U+B294><U+C694> <U+C0AC><U+B791><U+C785><U+B2C8><U+B2E4>."
## [2] "2<U+BC88><U+C9F8><U+B294> <U+BB34><U+C870><U+AC74> <U+AC00><U+C871><U+C785><U+B2C8><U+B2E4>."
str_replace_all(myword,"입니다.","일까요?")## [1] "1<U+BC88><U+C9F8><U+B294> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>.1-2<U+BC88><U+C9F8><U+B294><U+C694> <U+C0AC><U+B791><U+C785><U+B2C8><U+B2E4>."
## [2] "2<U+BC88><U+C9F8><U+B294> <U+BB34><U+C870><U+AC74> <U+AC00><U+C871><U+C785><U+B2C8><U+B2E4>."
1.3.5 stringr::str_split()
- 분할
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_split(myword,"\\.")## [[1]]
## [1] "1<U+BC88><U+C9F8><U+B294> <U+D1B5><U+C77C><U+C785><U+B2C8><U+B2E4>"
## [2] "1-2<U+BC88><U+C9F8><U+B294><U+C694> <U+C0AC><U+B791><U+C785><U+B2C8><U+B2E4>"
## [3] ""
##
## [[2]]
## [1] "2<U+BC88><U+C9F8><U+B294> <U+BB34><U+C870><U+AC74> <U+AC00><U+C871><U+C785><U+B2C8><U+B2E4>"
## [2] ""
1.3.6 stringr::str_count()
- 지정된 표현이 몇 회 나타났는지 알려준다.
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_count(myword,"입니다")## [1] 0 0
1.3.7 stringr::str_sub()
- 문자열 추출
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_sub(myword,1,4)## [1] "1<U+" "2<U+"
1.3.8 stringr::str_length()
- 문자의 수 계산
myword <- c("1번째는 통일입니다.1-2번째는요 사랑입니다.","2번째는 무조건 가족입니다.")
str_length(myword)## [1] 144 92
1.3.9 stringr::str_c()
- 벡터 연결
number=1:3
alphabet=c("a","b","c")
str_c(number,alphabet,sep="")## [1] "1a" "2b" "3c"
str_c(number,alphabet,collapse="")## [1] "1a2b3c"