본문 바로가기
공부/IT-R프로그래밍

R프로그래밍 강좌 - [17][R패키지 활용]텍스트 마이닝, 워드클라우드

by 썸볼 2018. 1. 18.

1.텍스트 마이닝(Text Mining)
- tm패키지를 사용하여 텍스트를 분석한다.
- tm의 
Corpus는 데이터의 정제, 통합, 선택, 변환 과정을 거친 구조화된 단계로서 더 이상 추가적인
  절차 없이 데이터 마이닝 알고리즘 실험에서 활용할 수 있는 상태이다.
- 텍스트 마이닝 패키지인 tm에서 문서를 관리하는 기본구조를 
Corpus라 부르며, 이는 텍스트 문서들의 
  집합을 의미한다.

(1) 데이터 준비 및 패키지 설치
- 실습에 사용할 데이터는 kor.txt이며 코리아 헤럴드의 경제 부분 기사를 텍스트형식으로 만든 데이터이다.
- 텍스트 파일은 영어로 구성되어 있으며, 우리나라 경제상황에 대한 내용을 담고 있다.

# Install

install.packages("tm")  # for text mining
install.packages("SnowballC") # for text stemming(어근추출)
install.packages("wordcloud") # word-cloud generator 
install.packages("RColorBrewer") # color palettes
# Load
library("tm")
library("SnowballC") #stemDocument어근추출위해
library("wordcloud")
library("RColorBrewer")
text <- readLines("./data/kor.txt")
 
 


(2) 데이터 정제 
- Corpus는  tm패키지에서 문서를 관리하는 기본구조이다.
- 데이터 정제는 텍스트 마이닝 중에서 반드시 필요한 부분이다.
- 텍스트 파일 안에 문장의 공백,숫자,구두점, 특수기호, 대소문자 구별 등 여러 요인들을 제거해야
  비로서 필요한 명사(단어)들로 추릴 수 있다.
- 정제할때 tm의 tm_map()함수가 많이 쓰인다.
- 어근추출을 위해 SnowballC 패키지 설치 
- 어근이란 단어를 분석할 때 실질적 의미를 나타내는 중심이 되는 부문이다.
  덮개의 덮_, 어른 스럽다의 어른

-
 Document-term matrix 란 문서번호와 단어 간의 사용여부 또는 빈도수를 만드는 작업이다.
  해당 문서의 해당 용어의 출현빈도를 카운팅해서 알려준다.


docs <- Corpus(VectorSource(text))

 
#공백제거
docs <- tm_map(docs, stripWhitespace)
 
# Convert the text to lower case(소문자변경-사전에 있는 내용과 비교하기 위해)
docs <- tm_map(docs, tolower)
# Remove numbers(숫자제거)
docs <- tm_map(docs, removeNumbers)
# Remove english common stopwords(뛰어쓰기와 시제 제거 )
docs <- tm_map(docs, removeWords, stopwords("english"))
 
# Remove punctuations(구두점제거)
docs <- tm_map(docs, removePunctuation)
 
# Text stemming(어근만 추출한다) SnowballC패키지 설치
# docs <- tm_map(docs, stemDocument)


#term document matrix를 만든다.
dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)

#
term document matrix의 결과를  합해서 내림차순으로 정렬
v <- sort(rowSums(m),decreasing=TRUE) 
d <- data.frame(word = names(v),freq=v)
head(d, 10)


(3) 워드 클라우드로 시각화 
 
wordcloud(words = d$word,
              freq = d$freq,
              min.freq = 1,
              max.words=200,
              random.order=FALSE,
              rot.per=0.35, 
              colors=brewer.pal(8, "Dark2"))








2.워드클라우드(Word Cloud)  
- 단어를 구름모양으로 나열하여 시각화하는 packages이다.
- 본절에서 사용되는 패키지는 wordcloud, KoNLP, RColorBrewer가 사용되었으며 Text mining하는데 유용한 패키지 이다.
- 데이터로는 검색엔진을 통해서 빅데이터 주제로 검색한 결과를 SNS의 댓글들을 모아 txt파일로 저장하였다.



(1) 패키지 설치 및 데이터 읽어오기

install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
install.packages("wordcloud")
install.packages("stringr")
 
# 패키지 로드
library(KoNLP)
library(dplyr)
library(wordcloud)
library(stringr)
library(RColorBrewer)
 
useNIADic()
 
txt <- file("./data/bigdata.txt",encoding="utf-8")
text <- readLines(txt)
close(txt)

 

(2)데이터 정제하기
 
text <- str_replace_all(text, "\\W", " ")
 
nouns <- extractNoun(text)
wordcount <- table(unlist(nouns))
 
# 데이터 프레임으로 변환
df_word <- as.data.frame(wordcount, stringsAsFactors = F)
 
# 변수명 수정
df_word <- rename(df_word,
                  word = Var1,
                  freq = Freq)
 
# 세 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 3)
 
top_20 <- df_word %>%
  arrange(desc(freq)) %>%
  head(20)
 
> top_20
           word freq
1        데이터   55
2      빅데이터   27
3      software   18
4           SAS    9
5      스트리밍    5
6      프로세싱    5
7         GAUSS    4
8        MATLAB    4
9        다루기    4
10 애플리케이션    4
11     우리나라    4
12       있습니    4
13          140    3
14      general    3
15     개발환경    3
16     네트워크    3
17 데이터베이스    3
18       바이트    3
19       시스템    3
20     알고리듬    3

(3)글자 생성 지정후 cloud그리기
- min.freq=1 의미
  단어의 빈도수를 나타내는 것으로서 "한번이상 쓰인 단어들을 그림에 나타낸다" 라는 의미이다.
  숫자의 값이 증가할 수록 그림으로 표현되는 단어의 수는 적어짐을 알 수 있다.

 
pal <- brewer.pal(9,"Set1")  # Set1 색상 목록에서 9개 색상 추출
 
wordcloud(words = df_word$word,  # 단어
          freq = df_word$freq,   # 빈도
          min.freq = 1,          # 최소 단어 빈도
          max.words = 200,       # 표현 단어 수
          random.order = F,      # 고빈도 단어 중앙 배치
          rot.per = .1,          # 회전 단어 비율
          scale = c(4, 0.3),     # 단어 크기 범위
          colors = pal)          # 색깔 목록
 


- min.freq = 1, min.freq = 2,min.freq = 4,min.freq =5 로 변경해서 그린 그림이다.

댓글