ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • R program(5)
    Cording/R program 2020. 12. 23. 17:57

    library(tm)

    library(stringr)

    library(wordcloud)

    library(SnowballC)

     

    file <- read.csv("wos_english_120.csv") # CSV 파일 불러오기

    abstract <- file$ABSTRACT # ABSTRACT 추출

    corpus <- VCorpus(VectorSource(abstract)) # Corpus 추출 (VCorpus: 휘발성 말뭉치(Volatile Corpus))

     

    corpus.pre <- tm_map(corpus, removeNumbers) # 숫자 모두 삭제

    corpus.pre <- tm_map(corpus.pre, removePunctuation) # 특수 문자 제거

    corpus.pre <- tm_map(corpus.pre, content_transformer(tolower)) # 대소문자의 소문자화 (Convert to lowercase)

    corpus.pre <- tm_map(corpus.pre, removeWords, words = stopwords("SMART")) # 불용어(Stopwords) 제거 (SMART 목록)

    corpus.pre <- tm_map(corpus.pre, stripWhitespace) # 공백 처리

    corpus.pre <- tm_map(corpus.pre, stemDocument, language = "en") # 어간 추출 (Stemming)

     

    dtm.tfidf <- DocumentTermMatrix(corpus.pre, control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))

    tdm.tfidf <- TermDocumentMatrix(corpus.pre, control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))

     

    head(rownames(dtm.tfidf[,]), 20)

    head(colnames(dtm.tfidf[,]), 20)

    inspect(dtm.tfidf[1:3, 50:100])

     

    head(rownames(tdm.tfidf[,]), 20)

    head(colnames(tdm.tfidf[,]), 20)

    inspect(tdm.tfidf[50:100, 1:3])

     

    # TF값과 TF-IDF값을 벡터로 추출하기.

    dtm.tf.value <- as.vector(as.matrix(dtm[,]))

    dtm.tfidf.value <- as.vector(as.matrix(dtm.tfidf[,]))

     

    # 단어명과 문서명 추출하기.

    dtm.label.word <- rep(colnames(dtm[,]),each=dim(dtm[,])[1])

    dtm.label.doc <- rep(rownames(dtm[,]),dim(dtm[,])[2])

    > 1: 가로, 2: 세로

     

    # 단어, 문서, TF, TF-IDF의 값을 하나로 모아 데이터프레임 만들기.

    df.tfidf <- data.frame(dtm.label.word, dtm.label.doc, dtm.tf.value, dtm.tfidf.value)

    colnames(df.tfidf) <- c('WORD', 'DOCUMENT', 'TF', 'TFIDF')

    df.tfidf[2000:2010,]

    > 앞 부분은 행, 뒷 부분은 열을 뜻함.

     

    # 상관계수 구하기 전체 (kendall)

    # 주의: 분석 시간이 많이 소요됨

    cor.test(df.tfidf$TF, df.tfidf$TFIDF, method = "kendall")

     

    # 상관계수 구하기 빈도 0초과 (kendall)

    cor.test(df.tfidf$TF[df.tfidf$TF > 0], df.tfidf$TFIDF[df.tfidf$TFIDF > 0], method = "kendall")

     

    # TF는 높지만 TF-IDF는 낮은 단어 찾기

    df.tfidf.positive <- subset(df.tfidf, TF > 0 & TFIDF > 0)

    df.tfidf.posTFnegIDF <- subset(df.tfidf.positive, TF > median(df.tfidf.positive$TF) & TFIDF < median(df.tfidf.positive$TFIDF))

    table(df.tfidf.posTFnegIDF$WORD)[table(df.tfidf.posTFnegIDF$WORD) > 0]

     

    ================================================================

     

    ### nGram (같이 쓰이는 단어 조합찾기)

     

    install.packages("RWeka")

     

    library('RWeka')

     

    nGramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 3))

     

    tdm.ngram <- TermDocumentMatrix(corpus.pre, control = list(tokenize = nGramTokenizer))

    tdm.ngram.list <- apply(tdm.ngram[,], 1, sum)

    sort(tdm.ngram.list, decreasing = TRUE)[1:10]

     

    ### 단어간/문서간 상관관계분석

     

    # findAssocs 함수: DTM/TDM 단어간 특정 상관계수 이상 연관단어 목록 분석

    # DTM에 속한 artifici 단어와 .30이상의 상관관계를 갖는 단어들의 목록을 구하기

    findAssocs(dtm, "artifici", 0.30)

     

    # algorithm 단어와 상관계수 수준으로 네트워크 시각화

    install.packages("igraph")

     

    library(igraph)

     

    network.1 <- findAssocs(dtm, terms = "algorithm", corlimit = 0.3)[[1]]

    network.2 <- cbind(read.table(text = names(network.1), stringsAsFactors = FALSE), network.1)

    network.df <- data.frame(terms = network.2[, 1], probs = network.2[, 2])

    network.graph <- graph.data.frame(network.df, directed = TRUE)

    plot(network.graph)

     

    # findAssocs 피어슨 상관계수

    corr.var1 <- as.vector(dtm[, "artifici"])

    corr.var2 <- as.vector(dtm[, "algorithm"])

    cor.test(corr.var1,corr.var2)

     

    # 두 지정 단어의 상관분석을 위한 맞춤형 함수

    func.corr <- function(dtm, word1, word2) {

    var1 <- as.vector(dtm[, word1])

    var2 <- as.vector(dtm[, word2])

    cor.test(var1, var2)

    }

     

    func.corr(dtm,"algorithm","develop")

     

    # DTMTDM으로 전치시킨 후 문서와 문서 상관계수 구하기

    func.corr(t(dtm), "1", "2")

    # func.corr(tdm, "1", "2")도 가능

     

    # 문서와 문서간 상관계수 행렬 구하기.

    doc.length <- length(rownames(dtm))

    doc.corr <- matrix(NA, nrow = doc.length, ncol = doc.length)

     

    for (i in 1:doc.length) {

    for (j in 1:doc.length) {

    doc.corr[i, j] <- func.corr(t(dtm), rownames(dtm)[i], rownames(dtm)[j])$est

    }

    }

    rownames(doc.corr) <- colnames(doc.corr) <- rownames(dtm)

     

    # 상관계수 행렬 일부 확인

    round(doc.corr[1:4, 1:4], 3)

     

    # 1번 행과 다른 행 간의 상관분석

    round(doc.corr[, 1], 3)

     

    # 문서간 상관계수의 히스토그램 작성하기

    hist(doc.corr[lower.tri(doc.corr)], breaks = 30,

    col = 'lightblue', xlim = c(-0.1, 0.6), xlab = "correlations",

    main = "Correlations between papers")

    summary(doc.corr[lower.tri(doc.corr)])

     

    # 상관계수 행렬을 이용한 요인분석(EFAPCA)

    factanal(factors = 2, covmat = doc.corr, rotation = "promax")

     

    ### 단어간 네트워크 그래프 작성

     

    # 행렬로 변환

    dtm.matrix <- as.matrix(dtm)

    tdm.matrix <- as.matrix(tdm)

     

    # 단어-단어 정방행렬로 변환

    tdm.matrix.square <- tdm.matrix %*% t(tdm.matrix)

     

    tdm<-TermDocumentMatrix(Corpus.pre)

     

    # 단어-단어 edgelist 변환

    tdm.edgelist <- as.data.frame(as.table(tdm.matrix.square)) # 연결 안 된 것도 모두 정리

    summary(tdm.edgelist)

    head(tdm.edgelist)

     

    tdm.edgelist.over10 <- tdm.edgelist[tdm.edgelist$Freq > 10,] # 연결 빈도 10이상인 것만 정리

    head(tdm.edgelist.over10)

     

    # igraph 작성

    library(igraph)

     

    tdm.edgelist.over10.graph.data <- data.frame(Term1 = tdm.edgelist.over10$Terms, Term2 = tdm.edgelist.over10$Terms.1)

    tdm.edgelist.over10.graph <- graph.data.frame(tdm.edgelist.over10.graph.data, directed = F)

    tdm.edgelist.over10.graph <- simplify(tdm.edgelist.over10.graph)

     

    plot(tdm.edgelist.over10.graph, layout = layout.fruchterman.reingold, vertex.size = 1,

    edge.arrow.size = 0.5, vertex.color = "green", vertex.label = NA)

     

    plot(tdm.edgelist.over10.graph, layout = layout.fruchterman.reingold, vertex.size = 1,

    edge.arrow.size = 0.5, vertex.color = "green", vertex.label = tdm.edgelist.over10.graph$name) # 단어 명을 붙일 경우

     

    # d3Network 패키지를 이용하여 html로 저장

    install.packages("devtools")

    install_github("christophergandrud/d3Network")

    install.packages("RCurl")

     

    devtools::install_github('christophergandrud/d3Network')

     

    library(devtools)

    library(RCurl)

    library(d3Network)

     

    d3SimpleNetwork(tdm.edgelist.over10, width = 600, height = 600, file = "tdm_edgelist_over10.html")

     

     

    'Cording > R program' 카테고리의 다른 글

    R program(7)  (0) 2020.12.26
    R program(6)  (0) 2020.12.24
    R program(4)  (0) 2020.12.22
    R program(3)-Wordcloud  (0) 2020.12.21
    R program(2)-text 전처리  (0) 2020.12.20

    댓글

Designed by Tistory.