- 워드클라우드 만들기 참고 블로그: https://steemit.com/wordcloud/@hironlee/r-wordcloud
- Java 설치 방법: https://r-pyomega.tistory.com/6
- rJava 오류 수정 방법: https://m.blog.naver.com/dongji0529/220811504049
- KoNLP 설치 방법: https://buillee.tistory.com/965
- wordcloud2 패키지 설명: https://jtr13.github.io/cc19/wordcloud.html
- 정규표현식 정리: 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 5 4 4 4 4
## 문자 배경 비밀 서현 송현진 수업
## 4 4 4 4 4 4
## 시간 알림장 암호 오윤세 우리반 이래
## 4 4 4 4 4 4
## 이예린 이학습터 자리 제출 주말 진행
## 4 4 4 4 4 4
## 컴퓨터 클릭 학교 확인 ID 갈비
## 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
## 홈페이지 KTPH RMJKQ SJTQV 가지 각자
## 3 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')