컴공돌이의 취미 블로그

[R]. 워드 클라우드 (Word Cloud) 본문

Study/R

[R]. 워드 클라우드 (Word Cloud)

컴공돌이​​ 2017. 7. 13. 14:10

[R]. 워드 클라우드 (Word Cloud)


오늘은 R과 R Studio를 사용해서 데이터 분석의 입문(?) 단계라고도 생각되는 워드클라우드를 만들어 보고자 한다.

이리저리 검색해 보고 나름 최선을 다해서 만든 코드이기 때문에 다른 사람들한테도 도움이 되었으면 하는 생각에서 글을 작성해 보게 되었다.


맨 처음 고민했던 것은 어떠한 문서에 들어있는 단어들을 분석하여 워드 클라우드를 실습해볼까 였다.

그래서 이것 저것 고민하던중 한가지 재미있는 생각이 들어서 바로 실행해보기로 마음 먹었다.


내가 생각한 것은 바로 '노래 가사' 였다.

개인적으로 MC the MAX 를 매우 좋아했기 때문에 MC the MAX의 노래를 한번 분석해 보면 재미있을 것 같아서 앨범들 중 1집을 선택하였다.

네이버 뮤직에 들어가서 MC the MAX를 입력하고 앨범에서 1집에 들어가면 아래와 같은 화면이 나온다.


그런 후 원하는 곡의 라인에서 우측을 보면 여러가지 아이콘이 나오는데 가사 아이콘을 누르면 새로운 창에서 해당 곡의 가사를 볼 수 있다.


1집 앨범에 대한 가사들은 이렇게 쉽게 확인할 수 있다.

1집 앨범들의 모든 곡에 대하여 가사를 복사하여 하나의 텍스트 파일로 만든 후 파일명을 lyric1.txt로 만들었고 이것을 R Studio의 프로젝트 폴더 안에 생성하였다.



이제 워드 클라우드에서 사용할 문서는 완성이 되었으므로 본격적으로 코드에 대하여 설명해보자.


<코드 설명>


(1). KoNLP Package의 설치 및 사용 

install.packages("KoNLP")

library(KoNLP)

useSejongDic()

R에서는 한글 자연어 처리를 위한 패키지가 존재한다. 한글을 영어로 번역해 보면 Korean Natural Language Precess 인데 이것을 줄여서 나온것이 KoNLP 이다.

문서 안에 들어있는 단어들의 품사를 정확하게 알기위해서 반드시 설치하고 사용해야 하는 패키지이다.

또한 단어들을 검사할때 세종 사전을 사용하기 위해서 useSejongDic() 명령어로 사전을 저장해 둔다. 


(2). wordCloud2의 설치 및 사용

 install.packages("devtools")

devtools::install_github("lchiffon/wordcloud2")

library(wordcloud2)

R에서 제공하는 wordcloud 패키지가 있지만 wordcloud를 사용해서 만든 워드클라우드보다 wordcloud2를 이용해서 만든 wordcloud가 개인적으로는 좀더 가독성이 있다고 생각하기 때문에 wordcloud2를 설치하기로 하였다. 

wordcloud2는 devtools를 통해서 설치해야하므로 우선적으로 devtools 패키지를 다운 받은 후 wordcloud2 패키지를 다운받고 호출한다.


(3). 자연어 처리할 문서를 한줄씩 읽어들이기

doc <- readLines('lyric1.txt')

readLines() 함수는 문서를 한줄씩 읽어들인 후 저장하는 함수이다.


readLines('lyric1.txt') 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다.



(4).  문서안의 단어들의 형태 분석하기

word <- SimplePos09(doc)

SimplePos09() 함수는 문서에 존재하는 단어들을 카이스트에서 제작한 태그를 붙여서 어떠한 품사인지 확인할 수 있게 해주는 함수이다.



위의 그림과 같이 SimplePos09() 를 사용하게 되면 단어는 크게 S, F, N, P, M, I, J, E, X 총 9가지 형태로 분석된다. 

만약 문장을 조금더 세부적으로 분석하고 싶다면 SimplePos22() 함수를 사용하면 되고, 만약 이보다 더 세부적으로 분석하고 싶다면 MorphAnalyzer() 함수를 사용하면 된다.

SimplePos22()를 사용하면 단어는 그림에서 볼수 있듯이 29가지 형태로 분석되고, MorphAnalyzer()를 사용하면 그림의 맨 오른쪽의 형태들로 분석된다.


simplePos09(doc) 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다.


(5). 형태가 분석된 각 문장에서의 단어들 중에서 N(체언), P(용언), M(수식언)의 형태만 저장하기

library(stringr)

extracted <- str_match(words, '([가-힣]+)/[NPM]')

str_match() 함수는 단어가 어떠한 형태를 만족하는지 검사해주는 함수이다. 

이 함수는 stringr 패키지 안에 속해있는 함수이므로 stringr 패키지를 호출해 준뒤 함수를 사용한다.

위에서의 명령어를 풀이하면 한글로된 단어들 중 뒤의 태그가 N 또는 P 또는 M인 단어들을 찾으라는 뜻이다.


str_match(words, '([가-힣]+)/[NPM]') 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다.


(6). 태그가 달린 불필요한 데이터와 비어있는 데이터 없애기

keyword <- extracted[,2]

nouns <- keyword[!is.na(keyword)]

첫번째 명령어는 (5)번에서 얻은 extracted라는 데이터에서 1번열의 태그가 붙어있는 단어 데이터를 빼고 2열의 단어 데이터들만 따로 저장해주는 명령어이다.

두번째 명령어는 바로 위에서 따로 저장한 단어 데이터들중 비어있는 데이터가 있으면 없애는 명령어이다.


extracted[,2] 와 keyword[!is.na(keyword)] 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다. 


(7).  단어들 중에 1글자의 단어는 제외하기

nouns <- unlist(nouns)

nouns <- Filter(function(x){nchar(x)>1}, nouns)

위의 unlist 명령어는 저장되어 있는 단어들의 리스트 구조를 해재시키는 명령어이다.

다음 명령어는 함수 기능을 사용하여 단어의 글자수를 확인하여 1개 초과 즉 2개의 단어부터 다시 저장을 하는 명령어이다.


unlist(nouns) 와 Filter(function(x){nchar(x)>1}, nouns) 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다.


(7). 단어들을 테이블의 형태로 바꾸어 저장하면서 중복된 단어를 합쳐서 개수를 확인하기

wordcount <- table(nouns)

table() 함수는 데이터를 테이블의 형태로 바꾸어줌과 동시에 같은 값을 가진 데이터들을 하나로 합치고 개수를 파악해주는 함수이다.


table(nouns) 명령어를 사용하면 아래와 같은 결과를 얻을 수 있다.


(8). 단어들 중 1번만 사용된 단어는 제외하고 나머지 단어만 저장하기

wordorder <- order(wordcount, decreasing = T)

for (i in 1:length(wordorder)){

    if(wordcount[wordorder[i]]==1){

        break

    }

}

freqwords <- wordcount[wordorder[1:i-1]]

order() 함수는 데이터를 나열해주는 함수이다. 안의 decreasing이 참으로 되어있으므로 값이 큰 수부터 나열을 해준다.

큰 수 부터 나열을 하여 저장한 wordorder은 아래와 같은 결과를 가진다.

wordorder에 저장된 값은 단어 데이터가 아닌 index 데이터이다. 즉 wordorder의 제일 처음 값인 6은 wordcount에서 6번째의 값이 가장 개수가 크다는 의미이다.

아래의 조건문에서 wordorder의 값을 집어넣은 wordcount 값이 1인 경우부터는 데이터를 제외하기 위해서 값이 1이 시작되는 i 값을 구한뒤 wordcount[wordorder[1:i-1]]을 사용하여 첫번째 원소부터 i-1번째 원소까지만 따로 저장을 해준다.


위의 모든 명령어들을 사용하면 아래와 같은 결과를 얻을 수 있다.


(9). Word Cloud 만들기

wc <- wordcloud2(data=freqwords, size = 1.5, color = "random-light", backgroundColor = "grey", rotateRatio = 0.75)

wordcloud2() 함수는 우리의 최종적인 결과물인 워드 클라우드를 만들어주는 함수이다.

wordcloud2() 함수는 기본적으로 data 값만 넣어주면 나머지 다른 값들은 기본적으로 디폴트값이 세팅되어 있다.

하지만 원하는 디자인, 글자색, 폰트, 배경색 등 따로 원하는 값을 설정해 주면 가독성 좋은 워드 클라우드가 생성될 것이다.


** 만약 자동적으로 R Studio의 우측 하단에 있는 Viewer 에서 아래와 같은 그림이 보이지 않는다면 console 항에 wc를 입력한 후 엔터를 치면 보일것이다.


위의 명령어를 사용하면 아래와 같은 결과를 얻게 될 것이다.



< 전체 코드>


반응형

'Study > R' 카테고리의 다른 글

[R]. 연관 분석(Association Rules)  (3) 2017.07.14