인공지능/R

R - tm 라이브러리를 사용한 텍스트 마이닝

해피밀세트 2020. 5. 6. 20:24
반응형

 

 

 

텍스트 정제 작업

 

1. tm라이브러리 설치 및 임포트 / 데이터 불러오기

# tm라이브러리 설치 임포트

install.packages("tm")

library(tm)

 

# 데이터 불러오기

data <- readLines("C:/data/Mommy_I_love_you.txt")

data

class(data)

 

 

 

2. VCorpus

: 텍스트 문서 -> corpus 변환하는 함수

 

corp1 <- VCorpus(VectorSource(data))

corp1

class(corp1)

summary(corp1)  # 각각의 라인이 문서 / 9개의 문서가 만들어졌다.

 

 

# 라인 하나(문서 하나) 내용 확인하기

corp1[[1]]

corp1[[1]]$meta

corp1[[1]]$content

 

 

# meta정보 변경

meta(corp1[[1]],tag="author") <- "Happymeal"

corp1[[1]]$meta

 

 

 

3. TermDocumentMatrix

  • 행이 Term(단어)이고 열이 Document(문서)인 행렬
  • 전체 문서들중에 단어만 뽑아내서 단어는 행으로 표현, 열은 문서 번호로 표현해서 이 단어는 어느 문서에 있었다라고 표현
  • 단어를 추출한 뒤 행에 출현했던 단어 리스트를 나열하고 열에 각 문서들을 나열한 행렬을 만든다.

 

tdm <- TermDocumentMatrix(corp1)

tdm

Non-/sparse entries: 56/277
# 333 cell중에 56개의  cell에는 최소 1회 이상 빈도수가 발견되었지만
# 227개의 cell 0회의 빈도수가 발견되었다는 의미

 

Sparsity           : 83%

# 83% cell 0의 빈도수를 갖는다는 의미

# 277/333 * 100

sparse data : 전체 공간에 비해 데이터가 있는 공간이 매우 협소한 데이터를 의미한다.

dense data : 전체 공간에 비해 데이터가 있는 공간이 빽빽하게 차있는 데이터를 의미한다.

 

Maximal term length: 10

# 가장 긴문자수를 갖는 단어의 문자수

 

 

rownames(tdm)    # 공백문자를 기준으로해서 단어가 나뉘었다. 단어 목록 확인

colnames(tdm)    # 문서 목록 확인

tdm$nrow          # 단어의 수 확인

tdm$ncol          # 문서의 수

 

tdm$dimnames               # 단어 목록, 문서 목록을 같이 확인할 수 있다.

tdm$dimnames$Terms

tdm$dimnames$Docs

 

 

# inspect() : 데이터 요약과 실제 데이터 일부분 출력

inspect(tdm)

 

 

# 실제 데이터 출력

as.matrix(tdm)

 

 

 

4. tm_map

  • 문서에 함수를 적용하여 변환한다.
  • 텍스트 정제작업을 한꺼번에 처리할 있다.

 

1) stripWhitespace() : 여러개의 공백을 하나의 공백으로 변환하는 함수

# tm_map 미사용

library(stringr)

corp1[[1]]$content

corp1[[1]]$content <- str_replace_all(corp1[[1]]$content,"[[:space:]]{2,}"," ")

corp1[[1]]$content

# tm_map 사용

corp2 <- tm_map(corp1,stripWhitespace)

corp2[[2]]$content

 

 

2) removeNumbers() : 숫자를 제거

# tm_map 미사용

corp1[[1]]$content

corp1[[1]]$content <- str_replace_all(corp1[[1]]$content,"[[:digit:]]{2,}","")

corp1[[1]]$content

# tm_map 사용

corp2[[1]]$content

corp2 <- tm_map(corp1,stripWhitespace)

corp2[[1]]$content

 

 

3) removePunctuation() : 특수문자 제거

# tm_map 미사용

corp1[[9]]$content

gsub('~','',corp1[[9]]$content)

gsub('~','',corp1) # 난리남,적용안됨

# tm_map 사용

corp2[[9]]$content

corp2 <- tm_map(corp2,removePunctuation)

corp2[[9]]$content

# tm_map에서 gsub 사용하기

tm_map(corp1,gsub('~','',corp1)) # 실행안됨. 변환작업이 필요함

corp1 <- tm_map(corp1,content_transformer(function(x) gsub('~','',x)))

corp1[[9]]$content

 

corp1 <- tm_map(corp1,content_transformer(function(x) gsub('\\^','',x)))

corp1 <- tm_map(corp1,content_transformer(function(x) gsub("I'm",'I am',x)))

corp1 <- tm_map(corp1,content_transformer(function(x) gsub("\\$",'',x)))

corp1[[9]]$content

 

toString <- content_transformer(function(x,from,to) gsub(from,to,x))

corp1 <- tm_map(corp1, toString, "[[:punct:]]","")

corp1[[9]]$content

 

 

 

5. stopwords

# 기본으로 제공하는 불용어 확인

stopwords() 

 

 

# 불용어 추가하기

stopword2 <- c()

stopword2 <- c(stopwords('en'),'and','but','not')

stopword2

 

 

# removeWords : 단어 제거

# 원본

tdm1 <- TermDocumentMatrix(corp2)
as.matrix(tdm1)

# 불용어 제거

corp2 <- tm_map(corp2,content_transformer(function(x) tolower(x)))

corp2 <- tm_map(corp2,removeWords,stopwords('en'))

corp2 <- tm_map(corp2,removeWords,stopword2)

또는

corp2 <- tm_map(corp2,removeWords,c('and','but','you'))

 

tdm2 <- TermDocumentMatrix(corp2)

as.matrix(tdm2)

 


 

텍스트 정제 작업 이후

 

1) 단어 빈도수 합 구하기

m2 <- as.matrix(tdm2)

freq1 <- sort(rowSums(m2),decreasing=T)

head(freq1,10)

 

 

2) 특정 횟수 이상 언급된 단어들만 출력

findFreqTerms(tdm2)

findFreqTerms(tdm2,2)

findFreqTerms(tdm2,3)

 

 

3) 워드클라우드 띄우기

library(wordcloud)

library(wordcloud2)

library(RColorBrewer)

palete <- brewer.pal(7,"Set3")

# 데이터(freq1) 안의 모든 단어 출력

wordcloud(names(freq1))

# 잘못나온것(전부다 나오지 않음)

wordcloud(names(freq1),freq = freq1)

scale : 워드클라우드 전체 크기
# min.freq :
빈도수
# 모든 데이터를 보고싶을때 : 빈도수 1개 이상으로 설정

wordcloud(names(freq1),freq = freq1,

          scale = c(5,1),min.freq = 1)

# colors : 색상 넣기

wordcloud(names(freq1),freq = freq1,

          scale = c(5,1),min.freq = 1,

          colors=palete)

# wordcloud2은 데이터프레임 형식으로 넣어야 한다.

df <- data.frame(freq1)

wordcloud2(data.frame(rownames(df),df$freq1))

 

 

4) 막대그래프로 만들기

barplot(freq1,las=2,horiz=T)

 

 

5) 문서별로 연관있는 단어 구하기

m2 %*% t(m2)

 

 


 

총 정리겸 연습

# txt 데이터 한줄씩 읽어들이기

data <- readLines("C:/data/취임사.txt")

data

# 벡터 -> corpus 형태로 변환

corp1 <- VCorpus(VectorSource(data))

corp1

# 내용 대략적으로 확인

inspect(corp1)

# 숫자, 특수문자 제거

corp2 <- tm_map(corp1,removeNumbers)

corp2 <- tm_map(corp2,removePunctuation)

 

# KoNLP 라이브러리 임포트

Sys.setenv(JAVA_HOME="C:\\Program Files\\Java\\jdk1.8.0_102")

library(KoNLP)

 

# SejongDic을 사용한다.

useSejongDic()

# 데이터 출력 한도 설정

options(max.print = 100000)

 

# extractNoun를 사용하여 명사만 뽑기

ko.words <- function(doc){

  d <- as.character(doc)

  extractNoun(d)

}

 

# 확인

tdm <- TermDocumentMatrix(corp2, control=list(tokenize=ko.words))

as.matrix(tdm)

# 두 글자 이상인 단어만 뽑아내기

tdm <- TermDocumentMatrix(corp2,control=list(tokenize=ko.words,wordLengths=c(2,Inf)))

as.matrix(tdm)

# SimplePos09를 사용하여 명사만 뽑기

ko.words <- function(doc){

  d <- as.character(doc)

  pos <- paste(SimplePos09(d))

  extracted <- str_match(pos,"([-]+)/[N]")[,2]

  extracted[!is.na(extracted)]

}

 

 

# 확인

tdm <- TermDocumentMatrix(corp2, control=list(tokenize=ko.words))

as.matrix(tdm)

 

# 두글자이상인 단어만 뽑아내기

tdm <- TermDocumentMatrix(corp2,control=list(tokenize=ko.words,wordLengths=c(2,Inf)))        

as.matrix(tdm)

 

# 빈도수를 구하고 정렬

m <- as.matrix(tdm)

freq1 <- sort(rowSums(m),decreasing = T)

freq1

# 데이터프레임 형식으로 변환

df <- data.frame(freq1)

df

# 워드클라우드로 출력

wordcloud2(data.frame(rownames(df),df$freq1))

# TermDocumentMatrix 만들면서 바로 불용어 제거

stop_word <- c("대통령","대통령의","되겠습니","것입니")

tdm <- TermDocumentMatrix(corp2,control=list(tokenize=ko.words,

                                             wordLengths=c(2,Inf),

                                             stopwords=stop_word))        

m <- as.matrix(tdm)

freq1 <- sort(rowSums(m),decreasing = T)

df <- data.frame(freq1)

wordcloud2(data.frame(rownames(df),df$freq1))

반응형

'인공지능 > R' 카테고리의 다른 글

R - 크롤링 연습 ③  (0) 2020.05.04
R - RSelenium, xlsx 사용  (0) 2020.04.28
R - 크롤링 연습 ②  (0) 2020.04.27
R - 크롤링 연습 ①  (0) 2020.04.27
R - 크롤링  (0) 2020.04.27