devlog_zz

textmining - wordcloud 본문

빅데이터/R을 이용한 빅데이터분석

textmining - wordcloud

YJ_SW 2018. 9. 4. 11:55
728x90


▶ textmining : 비정형 텍스트인 자연어를 자연어 처리기술로 의미 있는 정보 찾는 과정

▶ wordcloud : 텍스트에서 빈번히 사용된 키워드를 시각적으로 표시하는 텍스트마이닝 기법


① 기사 wordcloud 생성

###기사 textmining wordcloud ###



text<-"(서울=연합뉴스) 김승욱 기자 = 제19호 태풍 '솔릭'이 제주 서귀포에 접근했다. 모레 새벽에는 서울 주변을 통과할 전망이어서 철저한 대비가 필요하다.


22일 기상청에 따르면 이날 오전 9시 현재 '솔릭'은 제주 서귀포 남남동쪽 340㎞ 부근 해상으로 이동한 상태다.


강한 중형급 태풍인 '솔릭'의 강풍 반경은 380㎞에 달하고 중심기압은 950hPa(헥토파스칼)이다.


태풍 영향 반경 내에서 가장 바람이 센 곳의 풍속은 초속 43m(시속 155㎞)에 달한다.


현재 시속 19㎞로 서북서 방향으로 이동 중인 '솔릭'은 22일 밤부터 23일 아침 사이 제주도 서쪽 해상을 지나 23일 오후에는 서해 남부 해상까지 북상할 것으로 보인다.


이후 23일 늦은 밤 중부 서해안에 상륙한 뒤 24일 새벽 수도권 지역을 통과해 같은 날 오후에는 강원도 북부를 지나 동해 상으로 빠져나갈 것으로 예보됐다.


현시점에서 수도권 통과 예상 시점과 지역을 보면 24일 오전 4시께 서울 동남동쪽 20㎞ 부근 육상을 지날 것으로 예상된다.


한반도 전체가 태풍 영향권에 들면서 전국에 매우 강한 비바람이 몰아칠 것으로 예상된다.

특히 '솔릭'이 강한 세력을 유지한 채 서해 상을 따라 북상하고 우리나라가 태풍의 '위험 반원'(동쪽)에 포함되기 때문에 적지 않은 피해가 예상된다."


#install.packages("KoNLP") #패키지 설치 안했다면 설치하기

library(KoNLP) #자연어 처리 패키지

library(wordcloud) 


useSejongDic()

nouns <- extractNoun(text) #명사만을 추출하기 위한 함수

nouns <-nouns[nchar(nouns)>=2]  # nchar():단어의 글자수 세는 함수 

# 변수 nouns에 있는 단어의 글자 수 가 2자 이상 되는 단어들만 검색


nouns <-gsub("텍스트마이닝.*","텍스트마이닝",nouns) #패턴을 검색하여 지정된 문자열로 대체하는 함수

nouns <-gsub("데이터마이닝.*","데이터마이닝",nouns)


#Gsub( 검색 문자열, 대체할 문자열 , 문자열 벡터)

#외래어인 경우 하나의 단어로 인식 못함

#텍스트 마이닝.* 에서 .은 임의의 글자를 나타내고 *는 0번 이상 나타내기 위해 사용한다. 

#텍스트마이닝 다음에 조사가 올 수 있는데 0번 이상이므로 조사가 안 올 수도, 한번, 혹은 여러 번 올 수 있음을 나타냄


wordFreq<-table(nouns)

pal<-brewer.pal(6,"Dark2") #Brewer.pal( 워드 클라우드에서 나타낼 수 있는 색상의 개수, 컬러 팔레트이름)

 ( Accent , Dark2, Paired, Pastel1, Pastel2, Set1, Set2, Set3)


windowsFonts(malgun=windowsFont("맑은고딕"))


set.seed(1000)

wordcloud(words=names(wordFreq),freq=wordFreq,colors=pal, min.freq=1,

          random.order=F,family="malgun")


wordFreq<-table(nouns)

sort(wordFreq,decreasing=T)

barplot(wordFreq,las=2) #수평축과 수직으로 나타냄 1이면 수평축과 평행

결과화면




② 연설문 파일을 불러 분석

### 연설문 wordcloud   ( 파일 불러오는 )  ###


setwd("C:/Users/yeonjae/Desktop/R을 이용한 빅데이터 분석")

library(KoNLP)

library(wordcloud)


moon <- readLines("moon.txt")

useSejongDic()

mergeUserDic(data.frame(c('문재인','5·18','임을 위한 행진곡'),"ncn")) #새로운 단어 추가

nouns <- sapply(moon, extractNoun,USE.NAMES=F) # 벡터 혹은 리스트에 있는 각각의 원소에 대해 특정함수를 적용하기위해 사용하는 함수

nouns <- unlist(nouns)

nouns <- nouns[nchar(nouns)>=2]

nouns

#nouns <-gsub("하게","",nouns)

wordFreq<-table(nouns)

pal<-brewer.pal(10,"Spectral")

windowsFonts(malgun=windowsFont("맑은 고딕"))


set.seed(1000)

wordcloud(words=names(wordFreq),freq=wordFreq,scale=c(3,0.5),colors=pal,min.freq = 2,

          random.order = F,family="malgun")


결과화면

③영문 파일 wordcloud

 -> corpus를 생성해야함

#영문파일 textmining wordcloud



setwd("C:/Users/yeonjae/Desktop/R을 이용한 빅데이터 분석")

#install.packages("tm")

library(tm)

library(wordcloud)


textMining = readLines("textmining.txt")

myCorpus<- Corpus(VectorSource(textMining)) #corpus 생성


myCorpus <- tm_map(myCorpus,stripWhitespace) #공백제거

myCorpus <- tm_map(myCorpus,tolower) #소문자로 변환

myCorpus <- tm_map(myCorpus,removePunctuation) #구두점제거

myCorpus <- tm_map(myCorpus,removeNumbers) #숫자제거

myCorpus <- tm_map(myCorpus,removeWords,stopwords("english")) #관사제거


#myCorpus <- tm_map(myCorpus,PlainTextDocument)

tdm <- TermDocumentMatrix(myCorpus) #빈도수를 위한 행렬 생성

m<-as.matrix(tdm)


wordFreq<-sort(rowSums(m),decreasing=TRUE)

pal=brewer.pal(8,"Dark2")


set.seed(1234)

wordcloud(words=names(wordFreq),freq=wordFreq,scale=c(7,0.5),min.freq=2,colors=pal,

          random.order = F)


결과화면




④필요한 부분만 뽑아 wordcloud 생성

#영문 파일중 원하는 부분만 textmining

setwd("C:/Users/yeonjae/Desktop/R을 이용한 빅데이터 분석/데이터/제2장")
library(tm)
library(wordcloud)

shakespeare = readLines("shakespeare.txt")
#length(shakespeare)
#head(shakespeare)
#tail(shakespeare)

shakespeare = shakespeare[-(124369:length(shakespeare))] #124369번째 줄부터 끝까지 제거

shakespeare = shakespeare[-(1:174)] #첫번째줄부터 174번째 줄까지 제거
#length(shakespeare)

shakespeare = paste(shakespeare, collapse = " ") #전체를 하나의 문자열로 묶고 줄과 줄 연결은 공백으로
#length(shakespeare)

shakespeare = strsplit(shakespeare, "<<[^>]*>>")[[1]] # <<로 시작하고 >>로 끝나는 문자열 제거되면서 분리 

(dramatis.personae <- grep("Dramatis Personae", shakespeare, ignore.case = TRUE)) #등장인물인 Dramatis Personae 대소문자 상관없이 위치 찾기
#length(dramatis.personae)
shakespeare = shakespeare[-dramatis.personae]

myCorpus <- Corpus(VectorSource(shakespeare))
myCorpus <- tm_map(myCorpus, tolower)
myCorpus <- tm_map(myCorpus, removePunctuation)
myCorpus <- tm_map(myCorpus, removeNumbers)
#myCorpus <- tm_map(myCorpus, removeWords, stopwords("english"))
myStopwords <- c(stopwords('english'), "thou", "let","shall",
 "thee", "thy", "will", "now", "sir", "now", "well", "upon", "one", "tis", "may", "yet", "must", "enter")
# remove stopwords(불용어(관사)) from corpus
myCorpus <- tm_map(myCorpus, removeWords, myStopwords)
#myCorpus <- tm_map(myCorpus, PlainTextDocument)

tdm <- TermDocumentMatrix(myCorpus)
m <- as.matrix(tdm)

wordFreq <- sort(rowSums(m), decreasing=TRUE)

pal=brewer.pal(8,"Dark2")

set.seed(1234) # to make it reproducible
wordcloud(words=names(wordFreq), freq=wordFreq, min.freq=500, colors=pal, random.order=F)


결과화면








임동훈.R을 이용한 빅데이터 분석.자유아카데미



728x90
Comments