조선명탐정: 흡혈괴마의 비밀 (2017)에 대한 텍스트마이닝I
# 관련 패키지 설치하고 로딩하기
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 = "나눔고딕")
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") # 경계선 색깔 설정