반응형

/*********************************************************************************************************
-- Title : [R3.3] 비정형텍스트 - 형태소 분석(NLP) 및 워드 클라우드
-- Reference : hrd-net
-- Key word : R nlp konlp corpus vectorsource sejongdic 세종 사전 단어 구름 wordcloud 자연어처리 자연어 
                  처리 형태소 분석 형태소분석 워드 클라우드 word cloud 
*********************************************************************************************************/

-- Chart


-- R

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# ********************************************
# -- 비정형 데이터 처리 패키지 설치
# ********************************************
 
# -- 분석 절차
#    1단계 : 토픽분석(단어의 빈도수)
#    2단계 : 연관어 분석(관련 단어 분석) 
#    3단계 : 감성 분석(단어의 긍정/부정 분석) 
 
# -- 패키지 설치 및 로딩
#    1) java install : http://www.oracle.com
#       -> java 프로그램 설치(64비트 환경 - R(64bit) - java(64bit))
 
# -- rJava 설치 : R에서 java 사용을 위한 패키지
install.packages("rJava")
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_112')
library(rJava)   
 
# -- install.packages
install.packages(c("KoNLP""tm""wordcloud"))
 
# -- 패키지 로딩
library(KoNLP)                                                  # 한글사전 
library(tm)                                                     # 텍스트 전처리 
library(wordcloud)                                              # 단어구름 시각화
 
 
# ********************************************
# -- 단계1 - 토픽분석(텍스트 마이닝) 
#    시각화 : 단어 빈도수에 따른 워드 클라우드
# ********************************************
 
#
# -- 1. 텍스트 데이터(facebook_bigdata.txt) 가져오기
#
facebook = file("C:\\RProject\\Rwork\\Part-II\\facebook_bigdata.txt", encoding="UTF-8")
facebook_data = readLines(facebook)                             # 줄 단위 데이터 생성
head(facebook_data)                                             # 앞부분 6줄 보기 - 줄 단위 문장 확인 
str(facebook_data)                                              # chr [1:76]
 
#
# -- 2. Corpus : 텍스트 데이터 -> 자료집(documents) 생성(tm 패키지 제공)
#
facebook_corpus = Corpus(VectorSource(facebook_data)) 
facebook_corpus 
 
# -- 76개 자료집 보기 - 포함된 문자 수 제공
inspect(facebook_corpus)  
 
#
# -- 3. 분석 대상 자료집을 대상으로 NA 처리(공백)
#
facebook_corpus[is.na(facebook_corpus)] = " "
facebook_corpus 
 
#
# -- 4. 세종 사전 사용 및 단어 추가
#
useSejongDic()                                                  # 세종 사전 불러오기
 
# -- 세종 사전에 없는단어 추가
mergeUserDic(data.frame(c("R 프로그래밍","페이스북","소셜네트워크"), c("ncn")))     
                                                                # ncn : 명사지시코드
 
# -- 명사 추출 연습
extractNoun("나는 홍길동 입니다, 우리나라 만세 !!")
 
#
# -- 5. 단어추출 사용자 함수 정의
#
 
# -- 사용자 정의 함수 실행 순서 : 문자변환 -> 명사 단어추출 -> 공백으로 합침
exNouns = function(x) { 
  paste(extractNoun(as.character(x)), collapse=" ")
}
 
# -- exNouns 함수 이용 단어 추출
facebook_nouns = sapply(facebook_corpus, exNouns)               # 형식) sapply(적용 데이터, 적용함수)
 
# -- 단어 추출 결과 : 
class(facebook_nouns)                                           # [1] "character" -> Vector 타입
facebook_nouns[1]                                               # 단어만 추출된 첫 줄 보기 
facebook_nouns[2]
 
#
# -- 6. 데이터 전처리   
#
 
# -- 추출된 단어 이용하여 자료집 생성
myCorputfacebook = Corpus(VectorSource(facebook_nouns))
 
# -- 데이터 전처리 
myCorputfacebook = tm_map(myCorputfacebook, removePunctuation)                 # 문장부호 제거
myCorputfacebook = tm_map(myCorputfacebook, removeNumbers)                     # 수치 제거
myCorputfacebook = tm_map(myCorputfacebook, tolower)                           # 소문자 변경
myCorputfacebook = tm_map(myCorputfacebook, removeWords, stopwords('english')) # 불용어제거
 
# -- stop woard 확인
stopwords('english'# 174
 
# -- 전처리 결과 확인 
inspect(myCorputfacebook[1:5])                                            # 데이터 전처리 결과 확인
 
#
# -- 7. 단어 선별(단어 길이 2개 이상)
#
 
# -- 자료집 -> 일반문서 변경
myCorputfacebook_txt = tm_map(myCorputfacebook, PlainTextDocument) 
 
# -- TermDocumentMatrix() : 단어 선별(단어길이 2개 이상인 단어 선별 -> matrix 변경)
myCorputfacebook_txt = TermDocumentMatrix(myCorputfacebook_txt, control=list(wordLengths=c(2,Inf)))
myCorputfacebook_txt
 
# -- matrix -> data.frame 변경(빈도분석을 위해서)
myTermfacebook.df = as.data.frame(as.matrix(myCorputfacebook_txt)) 
dim(myTermfacebook.df)                                                    # [1] 876  76
 
#
# -- 8. 단어 빈도수 구하기(행 단위 합계 -> 내림차순 정렬)
#
wordResult = sort(rowSums(myTermfacebook.df), decreasing=TRUE)            # 빈도수로 내림차순 정렬
wordResult[1:100]
 
#
# -- 9. 단어 구름(wordcloud) 생성  생성 - 디자인 적용 전
#
wordcloud(c("한국""일본"), c(105))
myName = names(wordResult)                                                # 단어 이름 추출(빈도수 이름) 
wordcloud(myName, wordResult)                                             # 단어구름 시각화 
 
#
# -- 10. 단어구름에 디자인 적용(빈도수, 색상, 랜덤, 회전 등)
#
 
# -- 단어이름과 빈도수로 data.frame 생성
word.df = data.frame(word=myName, freq=wordResult) 
str(word.df)                                                              # word, freq 변수
 
# -- 단어 색상과 글꼴 지정
pal = brewer.pal(12,"Paired")                                             # 12가지 색상 pal = brewer.pal(9,"Set1") # Set1~ Set3
 
# -- 폰트 설정세팅 : "맑은 고딕", "서울남산체 B"
windowsFonts(malgun=windowsFont("맑은 고딕"))                             # windows
 
# -- 별도의 창을 띄우는 함수
x11( ) 
 
# -- wordcloud(단어, 빈도수, 5:1비율 크기,최소빈도수,랜덤순서,랜덤색상, 회전비율, 색상(파렛트),컬러,글꼴 )
wordcloud(word.df$word, word.df$freq, 
          scale=c(5,1), min.freq=3, random.order=F, 
          rot.per=.1, colors=pal, family="malgun")
 
#
# -- 11. 차트 시각화 
#
 
# -- 상위 10개 토픽추출
topWord = head(sort(wordResult, decreasing=T), 10)                        # 상위 10개 토픽추출 
 
# -- 파일 차트 생성 
pie(topWord, col=rainbow(10), radius=1)                                   # 파이 차트-무지개색, 원크기
 
# -- 빈도수 백분율 적용 
pct = round(topWord/sum(topWord)*1001)                                  # 백분율
names(topWord)
 
# -- 단어와 백분율 하나로 합친다.
lab = paste(names(topWord), "\n", pct, "%")
 
# -- 파이차트에 단어와 백분율을 레이블로 적용 
pie(topWord, main="SNS 빅데이터 관련 토픽분석", col=rainbow(10), cex=0.8, labels=lab)
 
cs



-- Files

facebook_bigdata.txt



반응형

+ Recent posts