1. 워드클라우드 만들기 참고 블로그: https://steemit.com/wordcloud/@hironlee/r-wordcloud
  2. Java 설치 방법: https://r-pyomega.tistory.com/6
  3. rJava 오류 수정 방법: https://m.blog.naver.com/dongji0529/220811504049
  4. KoNLP 설치 방법: https://buillee.tistory.com/965
  5. wordcloud2 패키지 설명: https://jtr13.github.io/cc19/wordcloud.html
  6. 정규표현식 정리: https://hamait.tistory.com/342, http://www.nextree.co.kr/p4327/
#KoNLP가 자바를 사용해서 세팅이 필요합니다. 자바 설치 폴더 경로는 수정해주세요.
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_271')
# 패키지 로드 (로드해야할 패키지들을 먼저 설치해주세요.)
library(wordcloud2)   # 워드클라우드 생성 패키지
library(rJava)        # KoNLP가 의존함 (Java기능 호출 패키지)
library(memoise)      # KoNLP가 의존함
library(KoNLP)        # 한글데이터 형태소 분석 패키지 (이름 대소문자 주의)
## Checking user defined dictionary!
library(stringr)      # 문자열 관련 기능 제공 패키지
library(readr)        # 파일 읽기 기능 제공 (tidyverse패키지에 포함됨)
library(readxl)       # 엑셀 파일 로드 패키지
library(extrafont)    # 폰트관리 패키지
## Registering fonts with R
useSejongDic()        # 한글 사전 사용용
## Backup was just finished!
## 370957 words dictionary was built.
# --> 오랜 시간이 걸리더라도 수행할지 여부를 묻는 "y/n" 확인이 필요하면 "y"를 입력 후 엔터
font_import(pattern = 'NanumGothic.ttf')
## Importing fonts may take a few minutes, depending on the number of fonts and the speed of the system.
## Continue? [y/n]
## Exiting.
# 폰트 로드 -> 운영체제에 맞게 설정하세요.
# Windows면 loadfonts(device='win')
# Mac이면 loadfonts()
loadfonts(device = 'win')       
## NanumGothic already registered with windowsFonts().
# 이 메시지가 출력될 때 까지 다음을 진행하지 마세요.
print("----------- 폰트스캔 완료 -----------");
## [1] "----------- 폰트스캔 완료 -----------"
# 폰트테이블 확인
fonts <- fonttable()

# 중복된 이름을 제거하고 출력
unique(fonts$FamilyName)
## [1] "NanumGothic"
# 텍스트 파일 읽기(readr, readxl 패키지 사용) 
#폴더경로는 수정해주세요.
setwd('E:/worksp/r/wordcloud')

# 파일이름을 수정해주세요. 
#파일 형식에 따라 read_excel말고 readLines 등의 함수가 사용가능합니다.
txt <- read_excel('tidychat.xlsx')
# 단어로 바꾸기 = sapply, extractNoun 이용
txt <- sapply(txt, extractNoun, USE.NAMES = F)

# unlist 함수를 사용하여 리스트를 1줄 벡터로 만들어줍니다.
txt <- unlist(txt)
head(txt)
## [1] "6"    "학년" "8"    "반"   "친구" "들이"
# gsub으로 불용 처리할 글자를 스페이스로 바꿉니다.
# 불용어 처리 (지난 시간에 배운 정규표현식^^)
txt <- gsub('\\d+', '', txt)           # 숫자 제외
txt <- gsub('[ㄱ-ㅎ]', '', txt)        # ㄱ부터 ㅎ까지 제외 == 자음 제외 (ㅋㅋ, ㅇㅇ 등)
txt <- gsub('(ㅜ|ㅠ)+', '', txt)       # ㅜ 또는 ㅠ 제외
txt <- gsub('[[:punct:]]', '', txt)    # 특수문자 제외 ()
txt <- gsub('^[a-zA-Z]*$', '' ,txt)    # 알파벳 제외
txt <- gsub('하세', '', txt)           # 불용어(stopword) 처리
# 2글자 이상 단어만 추출 후 저장
txt_data <- Filter(function(x) {
  nchar(x) >= 2
  }, txt)
head(txt_data)   # view(chat_data) 로는 테이블 확인 가능
## [1] "학년"   "친구"   "들이"   "이야기" "공간"   "채팅"
# 빈도수 추출
wordcount <- table(txt_data)
wordcount <- sort(wordcount, decreasing = T)   # 빈도수 높은 순으로 정렬하기
head(wordcount, 200)   # 상위 200개 단어만 데이터프레임 살펴보기
## txt_data
##         안녕         회의       동아리       선생님         익명         만화 
##           37           27           25           20           20           19 
##       로그인         오늘         누구         이름         근데         우리 
##           18           18           16           15           13           13 
##         아무         학급         가입         사람       얘들아         여기 
##           12           12           11           11           10           10 
##         코드       다연아         시작         신청         이거         친구 
##           10            9            9            9            9            9 
##         안도         주소         학기         그거         급훈       김연우 
##            8            8            8            7            7            7 
##         다들         등교       떡볶이         링크         번호         생각 
##            7            7            7            7            7            7 
##         수행     어몽어스     이모티콘         하트         가능         과제 
##            7            7            7            7            6            6 
##         내용         방학         영어         접속         채팅         커버 
##            6            6            6            6            6            6 
##         하나         회원       구서현         도현         박다         변경 
##            6            6            5            5            5            5 
##         비번         설명         안내         언제         엄호         이번 
##            5            5            5            5            5            5 
##         임포         젤리         초대         평가         해서         활동 
##            5            5            5            5            5            5 
##         후보         게시         게임         기억         김수         문자 
##            5            4            4            4            4            4 
##       바른말         배경         비밀         서현       송현진         수업 
##            4            4            4            4            4            4 
##         시간       알림장         암호       오윤세       우리반         이래 
##            4            4            4            4            4            4 
##       이예린     이학습터         자리         제출         주말         진행 
##            4            4            4            4            4            4 
##       컴퓨터         클릭         학교         확인         갈비         거기 
##            4            4            4            4            3            3 
##         걱정       게시판         계정         국어         남았         내일 
##            3            3            3            3            3            3 
##         너희       너희들         노력         다연         답답         댓글 
##            3            3            3            3            3            3 
##         드립         들이         마감       목소리     방학숙제         보영 
##            3            3            3            3            3            3 
##         복사         부분       비빔밥         사용         안해         알겠 
##            3            3            3            3            3            3 
##         어디       온라인         자기     전화번호         주제         진짜 
##            3            3            3            3            3            3 
##         참가       패들렛         폴더   하이클래스       한상현         한우 
##            3            3            3            3            3            3 
##         할사       합니다       핸드폰         현진       호스트     홈페이지 
##            3            3            3            3            3            3 
##    e학습터에         가지         각자         강현         개인         개학 
##            2            2            2            2            2            2 
##         검색         공개       교과서         귀하         그것       글쓰기 
##            2            2            2            2            2            2 
##         기한       김이가         나빴     나옵니다         네모     네이버에 
##            2            2            2            2            2            2 
##     다운로드         다음         대단         대화         덕복         동안 
##            2            2            2            2            2            2 
## 들어오라고해         떡볶       뜨개질         라임       렉걸린       마우스 
##            2            2            2            2            2            2 
##       말하기     맞습니다       맨위에         머야       먹는거       메이커 
##            2            2            2            2            2            2 
##         메일         명언         모레         바꿨         분명       붙여넣 
##            2            2            2            2            2            2 
##         비슷         사부       사이트         사진         사항     송현진이 
##            2            2            2            2            2            2 
##       수세미     시작할게         실행         심심         아빠     알겠습니 
##            2            2            2            2            2            2 
##         어몽         어케         예약       오른쪽         오우       올린거 
##            2            2            2            2            2            2 
##       와아아         왔거 
##            2            2
# 빈도수 계산 데이터를 csv 파일로 저장할 때 주석 풀고 쓰세요
# write.csv(wordcount, file = 'chat_freq.csv')
# wordcloud 만들기
wordcloud2(wordcount, fontFamily = 'NanumGothic', color = 'random-light')