Search

2018년 3월 4일 일요일

[Analysis] [R] Text Analysis 맛보기(2) - Word Counter 만들고, 트랜드 살펴보기

#1. 들어가기
지난 시간에는 Google에서 단순하게 뉴스를 수집해주는 프로그램을 만들었다.
이번에는 그 후속편으로, 모아놓은 뉴스들을 활용해 그 안에서 의미를 파악하는 방법을 다루어보고자 한다.


#2. 워드 카운터 만들어보기
이번 화에서 사용할 데이터는 전 시간('Google News Crawler 만들기'편 참조)의 최종 결과물인 'result'라는 변수에 저장된 data.frame으로, 그 중 기사내용(article) 컬럼에 있는 단어들을 추출해 작업해보고자 한다. 아래는 그 코드이다.

#########################################
# WORD COUNTER - v1.0
# - martinpark
# - ruserive@gmail.com
#########################################

# load library and user function ------------------------------------------
# install.packages(c("KoNLP","plyr","dplyr","qdap","plotly"))
library(KoNLP)
library(plyr)
library(dplyr)
library(qdap)
library(plotly)


# word count part ---------------------------------------------------------
# 기사 내용 추출해서 단어 카운트하기 (전체 기사)
txt        <- result$article
txt        <- gsub(keyWord," ",gsub("“|”|\"|`|'|\\(|\\)|<|>|\\[|\\]|·|…|△|▷| \\(중략\\)..."," ",txt))
txt        <- unlist(sapply(txt, extractNoun, USE.NAMES = F))
txt        <- base::Filter(function(x){nchar(x)>1},txt)
word_count <- freq_terms(txt,top=10)

# 완성 데이터 확인
print(word_count)

먼저, '쇼트트랙'이라는 단어로 검색한 뉴스의 기사내용들을 모아 단어만 추출하고, 다시 그 단어들 중에 사용된 순서가 높은 순서대로 10개만 모아보면 아래와 같다.



결과에서 m이 1위에 뽑힌 이유는, 간단하게 이용해보려고 사용한 KoNLP 라이브러리의 단어사전에 숫자들이 제외되었기 때문이다. 예를 들어, 500m, 1000m, 3000m 등등의 텍스트에서 숫자는 다 없어지고 m만 남았다.


#3. 시간의 흐름에 따른 단어 사용량 파악해보기
간단하게 위 방법을 사용해 단어와 그 사용 빈도만 파악해 보아도 최근 뉴스에서 어떤 내용을 다루는지 충분히 짐작할 수 있을 것이다. 하지만, 단순하게 단어에 대한 사용량만 놓고 본다면 무엇인가 새로운 인사이트를 찾고자 노력할 때, 정보가 너무 뭉개졌다는 느낌을 받을 것이다.

그래서, 아래의 코드를 추가해 분석을 조금 더 진행해봤다. 이번에는 3위에 랭크된 '금메달'이라는 단어를 뽑아, 시간의 흐름에 따른 카운트를 다시 파악해봤다.

# time trend --------------------------------------------------------------
# 기사 내용 추출해서 시간별로 단어의 사용량 추이 확인하기
df           <- result[,c("article","time")]
df$article   <- gsub(keyWord," ",gsub("“|”|\"|`|'|\\(|\\)|<|>|\\[|\\]|·|…|△|▷| \\(중략\\)..."," ",df$article))

# 날짜별
txt2         <- sapply(df$article, extractNoun, USE.NAMES = F)
txt2         <- lapply(txt2, function(x) x[nchar(x)>1])
names(txt2)  <- df$time
txt2_result  <- data.frame(date = rep(names(txt2), lapply(txt2, length))
                           ,word = unlist(txt2)
                           ,row.names = NULL
                           ,stringsAsFactors = FALSE)

# 빈도 높은 단어(혹은 관심 단어) 하나 선택하기
word_filter  <- "금메달"

## word plot(1) - 0불포함(쇼트트랙 관련 기사에 금메달이라는 단어가 없던 날은 아예 그래프에서 제외)
tmpPlot      <- txt2_result[txt2_result$word == word_filter,]$date

# 결과 그래프(1) 확인
plot(table(tmpPlot),"l")


## word plot(2) - 0포함(쇼트트랙 관련 기사에 금메달이라는 단어가 없던 날도 그래프에 포함)
tmpPlot2      <- left_join(data.frame(tmpPlot=unique(txt2_result$date),stringsAsFactors=FALSE)
                           ,as.data.frame(table(tmpPlot),stringsAsFactors=FALSE))
tmpPlot2$Freq[is.na(tmpPlot2$Freq)] <- 0
tmpPlot2      <- tmpPlot2[order(tmpPlot2$tmp),]
tmpPlot2$Date <- gsub("-","/",substr(tmpPlot2$tmpPlot,6,10))

# 결과 그래프(2) 확인
plot_ly(tmpPlot2, x = ~Date, y = ~Freq, type = 'scatter', mode = 'lines')

위 코드를 그대로 붙여넣어 수행하면 얻어지는 그래프를 1번, 2번 순서대로 캡쳐해 보았다.
(간단하게 보여주기 위함이니.. 선이나 글씨 크기, 배치 등등은 스스로 설정하자.)




이렇게 그래프를 그리고 나면, 우리는 여기에서 새로운 정보를 얻을 수 있게 되었다.
나는 분명 신문 기사를 읽지도 않았고 쇼트트랙도 잘 모르지만, 쇼트트랙 기사 중 금메달이라는 카운트가 2/10, 2/17/ 2/20, 2/22에 높다는 사실을 알 수 있다. (캡쳐해놓은 이미지가 인터넷 상에선 잘 안보이지만.. 코드를 돌려보면 나옵니다..)
그래서, 해당 날짜들에 어떤 사건이 있는지 역추적 해보니 아래와 같다는 것을 알 수 있다.

2/10 - 임효준 남자 1,500m 금메달
2/17 - 최민정 여자 1,500m 금메달
2/20 - 대한민국 여자 3,000m 계주 금메달
2/22 - 금메달은 못 땄으나, 남자 500m 은,동메달, 여자 1,000m 4위와 실격처리, 남자 5,000m 계주 4위 등 아쉬운 장면들이 많이 연출되던 날.


#4. 마치며
우선은 일반 사람들에게 생소한 TA(Text Analysis) 맛보기를 해보았는데, 실제로 해보면 생각만큼 TA영역이 쉽지 않은 것임을 알 수 있을 것이다. 단어 정제도 그렇고, 의미 파악도 그렇고.. 하지만 이 분야에 재미를 느끼는 독자분들이 있다면, 한 번 씩 도전해 보고 언젠간 멋진 결과를 다시 공유해줄 수 있었으면 합니다.


댓글 없음:

댓글 쓰기