R/TextMining

조선명탐정: 흡혈괴마의 비밀 (2017)에 대한 텍스트마이닝I

이부일 2018. 2. 20. 11:10

# 관련 패키지 설치하고 로딩하기

install.packages("httr")
install.packages("rvest")
install.packages("tm")
install.packages("slam")
install.packages("dplyr")
install.packages("readr")
install.packages("d:/NLP4kec_1.1.0.zip", repos = NULL)
install.packages("ggplot2")
install.packages("wordcloud2")
install.packages("treemap")
install.packages("RColorBrewer")
library(httr)
library(rvest)
library(tm)
library(slam)
library(dplyr)
library(NLP4kec)
library(readr)
library(ggplot2)
library(wordcloud2)
library(treemap)
library(RColorBrewer)


# Java version 확인
.jcall("java/lang/System", "S", "getProperty", "java.runtime.version")


# working directory
setwd("d:/")


# 영화 : 조선명탐정3에 대한 피드백 web crawling
feedback = c()
address = "http://movie.daum.net/moviedb/grade…"
for(i in 1:74){
   url = paste0(address, i)
   response = GET(url)
   content = read_html(response)
   content = html_nodes(content, "p.desc_review")
   content = html_text(content)
   feedback = c(feedback, content)
}


# 형태소 분석기 실행하기
parsedData <- r_parser_r(feedback, language = "ko", useEn = TRUE, korDicPath = "d:/user_dictionary.txt")


# 동의어 / 불용어 사전 불러오기
stopWordDic <- read_csv("stopword_ko.csv")
synonymDic <- read_csv("synonym.csv")


# 동의어 처리
for(i in 1:nrow(synonymDic)){
   targetDocIdx = which(ll <- grepl(synonymDic$originWord[i], parsedData))
   for(j in 1:length(targetDocIdx)){
      docNum = targetDocIdx[j]
      parsedData[docNum] = gsub(synonymDic$originWord[i], synonymDic$changeWord[i], parsedData[docNum])
   }
}


# 단어간 스페이스 하나 더 추가하기(윈도우즈 사용자인 경우)
parsedData <- gsub(" ", " ", parsedData)



# '영화', '평점'이라는 단어를 삭제
parsedData <- gsub("영화", "", parsedData)
parsedData <- gsub("평점", "", parsedData)


# Corpus 생성
corp <- VCorpus(VectorSource(parsedData))


# 특수문자 제거
corp <- tm::tm_map(corp, removePunctuation)


# 숫자 삭제
corp <- tm::tm_map(corp, removeNumbers)


# 소문자로 변경
corp <- tm::tm_map(corp, tolower)


# 특정 단어 삭제
corp <- tm::tm_map(corp, removeWords, stopWordDic$stopword)


텍스트문서 형식으로 변환
corp <- tm::tm_map(corp, PlainTextDocument)


# Document Term Matrix 생성 (단어 Length는 2로 세팅)
dtm <- tm::DocumentTermMatrix(corp, control = list(wordLengths = c(2, Inf)))


# 단어 양옆 스페이스 제거 및 한글자 단어 제외하기
colnames(dtm) <- trimws(colnames(dtm))
dtm <- dtm[, nchar(colnames(dtm)) > 1]


# Term Document Matirx 생성 (DTM에서 행과 열만 바뀐 matrix)
tdm <- tm::TermDocumentMatrix(corp, control = list(wordLengths=c(2, Inf)))


# Sparse Terms 삭제 (값이 작아질 수록 term수가 줄어든다.)
dtm <- tm::removeSparseTerms(dtm, as.numeric(0.98))


# 단어 발생 빈도 구하기
freq <- colSums(as.matrix(dtm))


# DTM을 데이터 프레임 형식으로 저장하기
dtm_df <- as.data.frame(as.matrix(dtm))


# DTM을 CSV로 추출해서 확인해보기
readr::write_excel_csv(dtm_df, "dtm.csv")


# 단어 개수 구하기
length(freq)


# 내림차순으로 단어 10개, sorting 하기
freq[head(order(-freq), 5)]


# 오름차순으로 단어 10개 sorting 하기
freq[head(order(freq), 10)]


# 특정 빈도 사이값을 갖는 단어 구하기 (20보다 크고 400보다 작은 단어)
findFreqTerms(dtm, lowfreq = 20, highfreq = 400)


# 단어 빈도 시각화
wordDf <- data.frame(word = names(freq), freq = freq)


# 단어 빈도수 바차트로 보여주기
ggplot(wordDf, aes(x=word, y=freq)) + geom_bar(stat = "identity")


# 단어 10개만 바차트로 보여주기
ggplot(head(wordDf, 10), aes(x=word, y=freq)) + geom_bar(stat = "identity")


# 상위 20개 단어만 바차트로 보여주기
ggplot(head(arrange(wordDf, -freq), 20), aes(x=reorder(word,-freq), y=freq)) + geom_bar(stat = "identity")

자동 대체 텍스트를 사용할 수 없습니다.

# Word Cloud 그리기
wordcloud2(data = wordDf, color = "random-light", shape = "star", size = 0.5, fontFamily = "나눔고딕")

자동 대체 텍스트를 사용할 수 없습니다.


# treeMap 그리기
pal <- RColorBrewer::brewer.pal(9, "Set1")
treemap(wordDf,                    # 대상 데이터 설정
          title = "Word Tree Map",
          index = c("word"),        # 박스 안에 들어갈 변수 설정
          vSize = "freq",            # 박스 크기 기준
          fontsize.labels = 12,     # 폰트 크기 설정
          palette = pal,             # 위에서 만든 팔레트 정보 입력
          border.col = "white")    # 경계선 색깔 설정


자동 대체 텍스트를 사용할 수 없습니다.