빅데이터/R

[R] 비정형 데이터 처리 - 워드클라우드(wordcloud) 패키지 사용 예시 [텍스트 마이닝]

young 2019. 12. 11. 21:08
반응형

일반적으로 비정형 데이터 처리는 SNS(Social Network Service)에서 제공하는 텍스트 자료나 기존에 준비된 디지털 자료를 대상으로 미리 만들어 놓은 사전과 비교화여 단어의 빈도를 분석하는 텍스트 마이닝 방식을 주로 이용한다. 따라서 한글 단어를 처리할 수 있는 우수한 사전 기능이 무엇보다도 요구된다. 특히 비정형 데이터 처리를 위해서는 사전에 없는 단어를 추가하거나 불용어를 처리하는 별도의 함수를 정의해 놓을 필요가 있다.

 

데이터 마이닝(Data Mining): 의사 결정을 위해서 DB(정형화 data)로 부터 규칙과 패턴을 발견하는 기법

텍스트 마이닝(Text Mining): text data(자연어, 비정형 data)로 부터 규칙과 패턴을 발견하는 기법

워드 클라우드(Word Cloud) : 자료 처리 과정과 자료 분석 과정 - 단어 빈도수 체크

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 한글 워드 클라우드 절차
1. Java 실행환경 구축 (jdk 설치)
2. 자료 수집 (text 자료)
    # 2.1 text file 형태로 수집
    # 2.2 web scraping을 이용하여 수집
3. 명사 추출
Sys.setenv ( JAVA_HOME = 'C:/Program Files/Java/jre1.8.0_231' ) 
 
# 필요시 설치할 패키지들
# install.packages("wordcloud")
# install.packages("wordcloud2")
# install.packages("KoNLP")           # 한국어 처리
# install.packages("RColorBrewer")    # 색상 선택
 
library(wordcloud)
library(wordcloud2)
library(KoNLP)
library(RColorBrewer)
 
library(dplyr)
library(ggplot2)
 
setwd('D:경로 지정')
text <- readLines('텍스트파일.txt', encoding = 'UTF-8')
text
# txt 파일 맨마지막 줄에 공백 한 줄을 넣는 것이 R과 호환에 좋다.
 
'우리말씀' 한글 사전 로딩 ( 62만 개의 우리말 단어 수록)
buildDictionary(ext_dic = 'woorimalsam')
pal2 <- brewer.pal(8,'Dark2')                 # 색상 팔레트 생성
# pal2 <- brewer.pal(9,'Blues')[5:9]        # 다른 팔레트 참고
noun <- sapply(text, extractNoun, USE.NAMES = F) # 명사 추출
noun # class: list
 
4. 추출된 단어(주로 명사) 에 대한 빈도수 계산 및 시각화
noun2 <- unlist(noun) # list -> vector로 변환
noun2
wordcount <- table(noun2)
wordcount
sort.noun <- sort(wordcount, decreasing = T)[1:20] # 최고 빈도의 20개 단어 추출
         col = 'steelblue', main = '빈도수 높은 단어',
         ylab = '단어 빈도수')
 
df
ggplot ( df, aes(x = df$noun2, y = df$Freq)) +
    geom_bar(stat = 'identity',
             width = 0.7,
             fill = 'steelblue'+
    ggtitle('빈도수 높은 단어'+
    theme(plot.title = element_text(size = 25,
                                    face = 'bold',
                                    colour = 'steelblue',
                                    hjust = 0,
                                    vjust = 1 )) +
    labs(x = '명사', y='단어빈도수'+
    geom_text(aes(label = df$Freq), hjust = -0.3+ # 빈도 표시
    coord_flip()
        
5. word cloud 작성
wordcloud (names(wordcount), # 단어
           freq = wordcount, # 단어 빈도
           scale = c(60.7),# 단어 폰트 크기(최대, 최소)
           min.freq = 3,     # 단어 최소 빈도
           random.order = F, # 단어 출력 위치
           rot.er = .1,      # 90도 회전 단어 비율
           colors = pal2)    # 단어 색
 
6. 전처리 과정 수행
#   6.1 생략된 단어를 사전에 등재
buildDictionary(ext_dic = 'woorimalsam',
                user_dic = data.frame('펭수''ncn'), # 사전에 없는 '펭수'라는 단어를 명사(ncn)로 추가
                replace_usr_dic = T)
noun <- sapply(text, extractionNoun, USE.NAMES = F)
noun2 <- unlist(noun)
 
6.2 불필요한 단어 삭제: 하나하나 찾아봐야 함 ㅠㅠ
noun2 <- noun2[nchar(noun2) > 1] # 글자수 1 초과
noun2 <- gsub('하지''', noun2) # '하지'를 ''로 바꿈 (제거)
noun2 <- gsub('때문''', noun2)
wordcount <- table(noun2)
 
7. 다시 워드클라우드 실행하면 등장하는 단어가 바뀜
wordcloud (names(wordcount), # 단어
           freq = wordcount, # 단어 빈도
           scale = c(60.7),# 단어 폰트 크기(최대, 최소)
           min.freq = 3,     # 단어 최소 빈도
           random.order = F, # 단어 출력 위치
           rot.er = .1,      # 90도 회전 단어 비율
           colors = pal2)    # 단어 색
 
반응형