-
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")
# DTM을 TDM으로 전치시킨 후 문서와 문서 상관계수 구하기
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)])
# 상관계수 행렬을 이용한 요인분석(EFA나 PCA)
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