프로그래밍/R

R KoNLP로 명사 추출, 명사로 워드클라우드 만들어보기

bonong 2019. 2. 12. 15:21
반응형

 

 

이전 글에서 웹크롤링으로 가져온 텍스트 데이터를 가공해보겠습니다

그 전에 텍스트 데이터가 필요하니 이전 R 기본으로 크롤러 만들기 글을 보고 따라하면 됩니다

 

먼저

 

파일이 잘 있는지 확인을 합니당

패키지 준비

이제 R 으로 가서 필요한 library를 넣어줍니다

 
1
2
3
4
5
library(KoNLP)
library(dplyr)
library(stringr)
library(RColorBrewer)
library(wordcloud)
cs

 

없다면 install.package로 다운받고 넣어줍니다

 

이어서 KoNLP의 사전불러오는 함수인

 

1
useSejongDic()
cs

 

입력하면 몇초 후 다운로드가 됩니다

 

1
setwd("C:/원하는 폴더")
cs

 

원하는 폴더를 지정해 놓아야

아래서 파일을 불러오기 쉽습니다

 

데이터 가공

먼저 데이터를 준비해야 합니다

 

1
txt<-readLines("movie_review_Ext_J.txt")
cs

 

준비한 데이터를 txt변수에다 입력합니다

 

1
2
3
4
5
6
7
8
9
txt<-str_replace_all(txt,"\\W"," ")
 
txt<-gsub("\\d+","",txt)
txt<-gsub("\\n+","",txt)
txt<-gsub("[A-z]","",txt)
txt<-gsub("[[:cntrl:]]","",txt)
txt<-gsub("관람객","",txt)
txt<-gsub("진짜","",txt)
txt<-gsub("영화","",txt)
cs

 

리뷰가 들어있는 변수 txt를 가공 합니다

특수문자를 제거하고

필요없는 단어들을 제거합니다

필요에 따라 아래 관람객, 진짜, 영화는 바뀌어도 무방합니다


 

KoNLP의 명사 추출함수인 extractNoun을 사용하면 명사가 추출됩니다

> ttt="아무 생각없이 보기에 너무 좋음 ㅋㅋ 재미짐.. 유쾌한 영화!! 역시 믿고 보는 류승룡~~ 공명 너무 귀여움ㅠㅠ"
> extractNoun(ttt)
[1] "재미"     "짐"       "유쾌"     "한"       "영화"     "류승룡~~" "공명"     "귀여움ㅠ" "ㅠ"      

예시로 하나를 해보면 이런식으로 사전을 기반으로 명사를 추출합니다


 

1
nouns<-extractNoun(txt)
cs

 

가공한 전체 리뷰 txt를 명사로 추출하여 nouns변수에 넣습니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount<-table(unlist(nouns))
 
# 데이터 프레임으로 변환
re_word <- as.data.frame(wordcount, stringsAsFactors = F)
 
#변수명 수정
re_word<-rename(re_word,word=Var1,freq=Freq)
 
#두 글자 이상 단어 추출
re_word<-filter(re_word,nchar(word)>=2)
 
#빈도수가 많은 순으로 20개만 
top_20<-re_word %>%
  arrange(desc(freq)) %>%
  head(20)
 
cs

 

top_20을 출력하면 아래처럼 확인할 수 있습니다

> top_20
        word freq
1        ^ㅋ  369
2       연기  142
3       웃음  138
4     코미디  125
5        ^ㅎ  122
6       배우  119
7       기대  103
8     오랜만   94
9       간만   83
10    재밌게   83
11    예고편   82
12      재미   81
13      액션   78
14      시간   75
15      극한   74
16      치킨   72
17      생각   71
18 ^ㅋ^ㅋ^ㅋ   66
19      직업   66
20      완전   64

 

워드클라우드

이제 가공한 데이터를 가지고 워드클라우드를 만들겠습니다

워드클라우드는 단어와 단어의 빈도수나 중요도 인기도등을 고려해서 시각적으로 표현한 것입니다

 

워드클라우드에 대한 이미지 검색결과

이런 형식으로 만드려고합니다

 

1
2
3
4
5
6
7
8
9
10
pal <- brewer.pal(8,"Dark2") #색깔지정
wordcloud(words = top_20$word,  # 단어
          freq = top_20$freq,   # 빈도
          min.freq = 2,          # 최소 단어 빈도
          max.words = 200,       # 표현 단어 수
          random.order = F,      # 고빈도 단어 중앙 배치
          rot.per = .1,          # 회전 단어 비율
          scale = c(4, 0.3),     # 단어 크기 범위
          colors = pal)          # 색깔 목록
 
cs

 

단어와 빈도에

워드클라우드 결과물 스크린샷

 

 

단어와 빈도에 top_20이 아닌 모든 명사로 만든 워드클라우드

top 30으로 만든 워드클라우드

top 20으로 만든 워드클라우드

 

모든 단어로 만든 워드클라우드는 투머치한 느낌 있고, top30 으로 만든 워드클라우드가 적당한 느낌이네요

^ㅋ 는 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 같이 ㅋ만 있는 단어들입니다

코미디영화라 ㅋ가 많은 것을 알 수 있습니다

 

다음은 KoNLP로 데이터를 가공하는것 대신

단어의 감성을 점수로 매겨 만든 감성사전으로 감성분석을 해보겠습니다.

반응형