본문으로 바로가기


2017년 1월 5일 날씨 맑음 


| 들어가며

지난 한해도 정리할 겸 Facebook에 작성했던 글을 한번 뽑아 보고 싶어졌다.

사실 예전에 R로 워드 클라우드 그렸던 거라 기억이 가물가물해 과거에 작성했던 교육내용하고 

최근 KoNLP가 0.80으로 업데이트 되었다는 소식에 전희원님의 글을 참고해 다시 뽑아봤다.



  KoNLP v.0.80.0 릴리즈 소식 : http://freesearch.pe.kr/archives/4520


참고로 0.80의 개선 포인트로 성능개선은 말할것도 없고, 버그 수정,  형태소 사전 추가 적용,  텍스트 전처리 플러그인 등이 추가되었다고 한다. 추후 RNN 을 연결하는 것을 생각하신다고 하니 R을 기반으로 텍스트 마이닝을 하시는 분들에게는 좋은 소식이지 않을까?



| 패키지 설치와 Facebook  토큰 받기


우선 워드 클라우드를 하기에 앞서 필요한 패키지를 설치 해야 한다.


install.packages(c('Rfacebook', 'KoNLP', 'wordcloud2'))

library(Rfacebook)

library(KoNLP)

library(wordcloud2)




그리고 Facebook 에서 데이터를 긁어오기 위해서는 Facebook 에서 제공하는 API를 통해 가져오면 되는데 

facebook developer 사이트에 들어가서 토큰을 받아야 한다.


  facebook developer URL : https://developers.facebook.com/tools/explorer



URL 치고 들어가게 되면 아래와 같이 액세스 토큰창이 뜨게 되는데 우측에 토큰 받기 > 사용자 엑세스 토큰받기를 누르른다.






사용자 액세스 토큰받기를 누르면 받고자 하는 정보들을 선택하는 창이 나오는데 적절하게 필요로 하는 내용들을 선택후 [엑세스토큰받기] 를 누른다.




그리고 마지막으로 액세스토큰을 copy 하면 되는데 copy 한 액세스토큰이 R에서 Facebook에 접근해 데이터를 가져오는 key 가 된다. 

일단 R에 토큰을 기록한다. 



Token <- '토큰정보'






| API로 Facebook 데이터 요청 


다음은 Facebook API를 이용해 작성한 글을 가져온다.


    fb_page <- getPage(page="me", token=token, n=2000, since='2016/01/01', until='2016/12/15')



    - getPage에 me는 자신의 정보를 가져온다는 것으로 me 그대로 적으면 된다.

    - token에는 token 값이 들어가고 

    - n 은 최대 가져올 post 정보 개수를 말하는 것으로 여기서는 2000를 최대한으로 했다.   헤비 유저이거나 자신의 노트북 램 용량이 크다면 더 많이 가져오는것도 무리는 안될듯 싶다.

    - since 와 until 은 내가 가져오려는 데이터의 기간을 말한다.




다 가져왔으면 fb_page$message 로 작성한 글을 정확하게 가져왔는지 확인한다.

fb_page$message


혹 이상한 숫자나 깨진 문자로 나온다면 인코딩이 맞지 않아서 생기는 문제인데

Encoding(fb_page$message) 을 쳤을 때 나오는 인코딩과

localeToCharset()  을 쳤을때 나오는 인코딩이 다를 경우 발생한다.

이를 해결하기 위해서 

Encoding(fb_page$message) <- "UTF-8"

을 추가하고 다시 시도해본다




| 전처리


정상적으로 보인다면 이제는 분석을 위한 형태소 사전을 다운 받는다

> useNIADic() ##형태소 다운로드



그리고 message 에서 이상치를 제거하고 명사만 추출한다.


all.reviews <- fb_page$message

all.reviews <- all.reviews[!is.na(all.reviews)]  ## na 값 제거


nouns <- extractNoun(all.reviews)  ##명사 추출

nouns_norm <- Map(function(x){if(!is.na(x) && is.ascii(x)) toupper(x) else x},unlist(nouns))  ##불필요 데이터 삭제




| Word cloud 출력


끝으로 word cloud를 출력하면 되는데 여기서는 wordcloud2를 사용했다.


cnts <- table(unlist(nouns_norm))  ## 명사별 count 결과 저장

cnts_ <- cnts[cnts > 2 & nchar(names(cnts)) > 1]  ## 단어가 1보다 크며, 건수가 2보다 큰 것만 선별


wordcloud2(data.frame(word=names(cnts_), freq=as.numeric(cnts_)),  color = "random-light", backgroundColor = "black", shape="cloud")



출력결과



출력 결과를 보면 빈도수에 따라 글씨 크기가 달라지고 색상은 random 값에 의해 조절이 된 것을 확인할 수 있다.

근데 나는 지난 한해 엄청 웃었나보다...   ;;



|결론


그 어려울것 같았던(?) 워드 클라우드가 코드 몇줄로 너무도 쉽게 끝나버렸다... 

이제 살짝 텍스트마이닝에 Hello world 격인 워드클라우드를 했다고 보면 된다.

다음에는 다시 기억을 더듬어 감성분석 방법을 적어볼까 한다.  



|전체코드


install.packages(c('Rfacebook', 'KoNLP', 'wordcloud2'))

library(Rfacebook)

library(KoNLP)

library(wordcloud2)



token <- '토큰정보'

fb_page <- getPage(page="me", token=token, n=2000, since='2016/01/01', until='2016/12/15')

fb_page$message  # 확인결과 한글 깨짐 발생

Encoding(fb_page$message) #인코디 확인  --  UTF-8 

localeToCharset()  ## system 인코딩 확인

Sys.setlocale("LC_ALL", "en_US.UTF-8")   ## 인코딩 변경

useNIADic() ##형태소 다운로드

all.reviews <- fb_page$message

all.reviews <- all.reviews[!is.na(all.reviews)]  ## na 값 제거


nouns <- extractNoun(all.reviews)  ##명사 추출

nouns_norm <- Map(function(x){if(!is.na(x) && is.ascii(x)) toupper(x) else x},unlist(nouns))  ##불필요 데이터 삭제

cnts <- table(unlist(nouns_norm))  ## 명사별 count 결과 저장

cnts_ <- cnts[cnts > 2 & nchar(names(cnts)) > 1]

wordcloud2(data.frame(word=names(cnts_), freq=as.numeric(cnts_)),  color = "random-light", backgroundColor = "black", shape="cloud")



[참고자료]

전희원님 site 페이스북 포스트 워드클라우로 돌아보는 2016년 : http://freesearch.pe.kr/archives/4538

마인드스케일 텍스트마이닝 sns 데이터 분석 강의자료


[추가 질문사항의 답변]

Scarly 님이 주신 추가 질문사항 : NiaDic을 다운 받을 수 없는 경우 어떡게 해야 하나요? 


?useNIADic()을 쳐보면 KoNLP의 function 임을 할 수 있다.

useNiaDic에 관련한 소스가 보고 싶다면  다음을 참고해도 좋다

https://github.com/haven-jeon/NIADic/


먼저  NiaDic 이 정상적으로 설치가 되었다면  다음의 명령어를 쳤을 때 경로가 나와야 한다.

예) > system.file(package = 'NIADic')

[1] "/Library/Frameworks/R.framework/Versions/3.3/Resources/library/NIADic"

      

만약 경로가 "" 으로만 나온다면 정상적으로 설치되지 않은 상태인데 이 때는 NIADic tar.gz 파일을 수동을 받아 수작업 설치를 진행해야 한다.

NIADic 의 tar.gz 파일경로는 다음과 같다. 

 https://github.com/haven-jeon/NIADic/releases/download/0.0.1/NIADic_0.0.1.tar.gz


위 경로는 버전에 따라 바뀔 수 있는데 정확한 경로가 알고 싶다면 

https://github.com/haven-jeon/KoNLP/blob/master/R/manageDic.R

의 최 하단에 실제 다운 받는 곳이 나와 있다.


다운로드를 다 했으면 이제 명령어 한번만 더 치면 된다. 


> install.packages('/Users/josh/r_study/NIADic_0.0.1.tar.gz', repos = NULL, type="source")


이제 마지막으로 정상적으로 설치가 되었는지 확인해 본다. 


> system.file(package = 'NIADic')


끝으로, 현업에서 네트워크가 연결되지 않아 install.packages 로 설치되지 않을 때가 많이 있다. 

이럴때도 마찬가지로 수작업 설치를 진행해야 하는데 이 부분은 아래의 블로그를 확인하면 많은 도움을 받을 수 있다. 


▶ http://rfriend.tistory.com/177






도움이 되셨다면 공감버튼을 살포시~



댓글을 달아 주세요