ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 조선명탐정: 흡혈괴마의 비밀 (2017)에 대한 텍스트마이닝I
    R/TextMining 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")    # 경계선 색깔 설정


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


    'R > TextMining' 카테고리의 다른 글

    토픽모델 : 조상현 강사의 동영상  (0) 2018.03.13
    텍스트마이닝의 알고리즘  (0) 2018.03.02
    텍스트 구조  (0) 2018.03.02
    tidytextmining 사이트  (0) 2018.02.26
    NLP4kec 형태소 분석기 실행하기  (0) 2018.02.05
Designed by Tistory.