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"