본문 바로가기

R/쉽게 배우는 R 데이터분석

국정원 트윗 텍스트 마이닝

반응형

텍스트 마이닝은 소셜 네트워크에 올라온 글을 통해 사람들이 어떤 생각을 하고 있는지 알아보기 위한 목적으로 자주 활용됩니다. 이번 실습에서는 '국정원 계정 트윗 데이터'를 이용해 텍스트 마이닝을 해 보겠습니다. 이 데이터는 국정원이 대선에 개입한 사실이 밝혀져 논란이 됐던 2013년 6월 독립 언론 뉴스타파가 인터넷을 통해 공개한 것입니다. 이 데이터는 국정원 계정으로 작성된 3,744개 트윗으로 구성되어 있습니다. 무작위로 나열된 것처럼 보이는 수많은 글 중에서 의도가 분명한 경향성을 발견할 수 있기 때문에 텍스트 마이닝을 연습하는 데 알맞은 데이터입니다.

 

*참고* 원본은 뉴스타파 사이트(http://newstapa.tistory.com/598)에서 다운로드할 수 있습니다. 실습에 사용한 데이터는 이 데이터를 일부 정제해 만들었습니다.

 

국정원 트윗 텍스트 마이닝

1. 데이터 준비하기

먼저 깃허브(bit.ly/doit_re)에서 twitter.csv 파일을 다운로드해 프로젝트 폴더에 삽입한 후 불러옵니다. 그런 다음, 한글로 되어 있는 변수명을 다루기 쉽도록 영문자로 수정하고, 특수문자를 제거한 후 일부를 출력해 내용을 확인합니다.

 

twitter <- read.csv("twitter.csv",
                    header = T,
                    stringsAsFactors = F,
                    fileEncoding = "UTF-8")
                    
#변수명 수정
twitter <- rename(twitter,
                  no = 번호,
                  id = 계정이름,
                  date = 작성일,
                  tw = 내용)

#특수문자 제거
twitter$tw <- str_replace_all(twitter$tw, "\\W", " ")
head(twitter$tw)

[1] "민주당의 ISD관련 주장이 전부 거짓으로 속속 드러나고있다  미국이 ISD를 장악하고 있다고 주장하지만 중재인 123명 가운데 미국인은 10명뿐이라고 한다 "                                                                               
[2] "말로만  미제타도   사실은  미제환장   김정일 운구차가 링컨 컨티넬탈이던데 북한의 독재자나 우리나라 종북들이나 겉으로는 노동자  서민을 대변한다면서 고급 외제차  아이팟에 자식들 미국 유학에 환장하는 위선자들인거죠"  
...

 

2.단어 빈도표 만들기

트윗에서 명사를 추출하고, 각 단어가 몇 번씩 사용됐는지 나타낸 빈도표를 만듭니다.

library(KoNLP)
#트윗에서 명사 추출
nouns <- extractNoun(twitter$tw)

#추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))

#데이터 프레임으로 변환
df_word <- as.data.frame(wordcount, stringsAsFactors = F)

#변수명 수정
df_word <- rename(df_word,
                  word = Var1,
                  freq = Freq)

 

3.두 글자 이상으로 된 단어를 추출하고, 빈도 순으로 정렬해 가장 많이 사용된 단어 20개를 추출하겠습니다.

#두 글자 이상 단어만 추출
df_word <- filter(df_word, nchar(word) >= 2)

#상위 20개 추출
top20 <- df_word %>% 
  arrange(desc(freq)) %>% 
  head(20)

top20

       word freq
1      북한 2216
2  대한민국  804
3      우리  779
4      좌파  641
5      국민  550
6      들이  428
7      세력  409
8      친북  385
...

자주 사용된 단어 목록을 보면 트윗이 어떤 의도로 작성됐는지 가늠할 수 있습니다. 북한, 좌파, 친북, 김정일, 천안함, 연평도 등 북한과 관련된 단어들이 자주 사용된 것을 보면, 국정원이 안보 위협을 강조하는 트윗을 주로 작성했다는 것을 알 수 있습니다.

 

4.단어 빈도 막대 그래프 만들기

어떤 단어가 많이 사용됐는지 직관적으로 이해할 수 있도록 ggplot2를 이용해 빈도 막대 그래프를 만들겠습니다. 막대는 빈도가 높은 순으로 정렬하겠습니다.

 

library(ggplot2)

order <- arrange(top20, freq)$word

ggplot(data = top20, aes(x = word, y = freq)) +
  ylim(0, 2500) +
  geom_col() +
  coord_flip() +
  scale_x_discrete(limit = order) +
  geom_text(aes(label = freq), hjust = -0.3)

 

출력된 그래프를 보면 각 단어가 사용된 빈도의 차이가 잘 드러납니다. 가장 많이 사용된 단어인 '북한'이 두 번째로 많이 사용된 '대한민국'의 세 배 가까이 될 정도로 많은 것을 보면 국정원이 북한 관련 이슈에 초점을 맞추고 트윗을 작성했다는 것은 알 수 있습니다.

 

5.워드 클라우드 만들기

어떤 단어가 많이 사용됐는지 한눈에 파악할 수 있도록 워드 클라우드를 만들겠습니다. 출력된 워드 클라우드를 보면 '북한'이라는 단어가 다른 단어에 비해 많이 사용됐다는 것을 직관적으로 알 수 있습니다.

install.packages("RColorBrewer")
library(RColorBrewer)
pal <- brewer.pal(8, "Dark2")    #색상 목록 생성
set.seed(1234)      #난수 고정

#install.packages("wordcloud")
library(wordcloud)
wordcloud(word = df_word$word,
          freq = df_word$freq,
          min.freq = 10,
          max.words = 200,
          random.order = F,
          rot.per = .1,
          scale = c(6, 0.2),
          colors = pal)

6.이번에는 단어 색상 목록을 파란색 계열로 바꿔 워드 클라우드를 만들어 보겠습니다.

pal <- brewer.pal(9, "Blues")[5:9]  #색상 목록 생성
set.seed(1234)

wordcloud(words = df_word$word,
          freq = df_word$freq,
          min.freq = 10,
          max.words = 200,
          random.order = F,
          rot.per = .1,
          scale = c(6, 0.2),
          colors = pal)

반응형