R/강의복습

[22.08.17] 7일차 텍스트마이닝 / 워드클라우드만들기

peach_h 2022. 8. 21. 18:21

항상 패키지 설치와 라이브러리는 필수다.

# 텍스트 마이닝에 필요한 packages
install.packages("rJava")
install.packages("multilinguer")

multilinguer::install_jdk()

install.packages(c("hash", "tau", "Sejong", "RSQLite", "devtools", "bit", "rex",
                   "lazyeval", "htmlwidgets", "crosstalk", "promises", "later",
                   "sessioninfo", "xopen", "bit64", "blob", "DBI", "memoise", "plogr",
                   "covr", "DT", "rcmdcheck", "rversions"), type = "binary")

# KoNLP 한국어 형태소 분석 라이브러리
install.packages("KoNLP", 
                 repos = "https://forkonlp.r-universe.dev",
                 dependencies = TRUE,
                 INSTALL_opts = c("--no-multiarch")
)

install.packages("memoise")
install.packages("tm") # for text mining
install.packages("SnowballC") #SnowballC는 이 단어들을 뭉쳐줄 수 있는 패키지, # for text stemming
install.packages("RColorBrewer") # color palettes
install.packages("wordcloud")  #워드클라우드 차트 지원
install.packages("stringr") # 문자열 처리 함수들이 여기있음

#패키지로드
library(hash)
library(tau)
library(Sejong)
library(KoNLP)
library(dplyr)
library(stringr)
library(tm)
library(SnowballC)
library(RColorBrewer)
library(wordcloud)

setwd("c:/r_work/data") # 윈도우 OS는 폴더에 대소문자구분못함.
# R이 리눅스에서도 사용 가능
# 폴더나 파일의 대소문자 중요함
### 주의할점 : 소문자로 폴더를 만들었다가, 대문자 섞어서 이름을 바꾸면?
# 윈도우가 인식을 못함 / 아예 삭제시키거나 다른 이름으로 다시만들어야함

이렇게 ~ 설치하였으나.. KoNLP가 제대로 설치가 안됐는지.. 계속 실행오류가 발생했다 ㅠ

그래서 별짓다해봤는데 !!

https://always-apramada.tistory.com/129

 

KoNLP 에러 : Warning in value[[3L]](cond) :

KoNLP 는 의존형 패키지라 , 설치 하기 전에 이것 저것 많이 깔아야 한다. 지금 그것에 대한 이야기를 하려는 건 아니고 이것 저것 다 깔았음에도 불구하고 KoNLP가 제기능을 안할 때의 문제를 해결

always-apramada.tistory.com

환경변수설정 + 이 주소를 따라했더니 해결됨 .. 감사합니다

 

 

형태소 분석하기
# 형태소 분석에 필요한 사전을 불러옴
useNIADic()
useSejongDic()

# 파일을 읽는다
txt <- readLines("hiphop.txt")
class(txt)
txt

# 문장으로 부터 명사를 추출한다
extractNoun("대한민국의 영토는 한반도와 그 부속도시로 한다", autoSpacing = FALSE )

nouns <- extractNoun(txt,autoSpacing = FALSE)
nouns

거지같은 warning in value[[3L]](cond) ..

2시간동안해서나온결과^^..

 

 

단어 추출하기
#extracNoun함수가 list 타입으로 가져옴
# unlist <- list 타입을 vector f로 바꿔줌 / table 함수는 vector만 취급해서 list로하면 x
wordcount <- table(unlist(nouns))
wordcount

# 데이터 프레임으로 변환 문자열은 factor 타입으로 전환
df_word <- as.data.frame(wordcount,stringsAsFactors = F)
head(df_word)

# 변수명 수정
df_word <- rename(df_word,
                  word = Var1,
                  freq = Freq)
head(df_word)


# 2글자 이상 단어 추출
df_word <- df_word %>% filter(nchar(word)>= 2)

힙합이라 그런지 돈벌겠다는 의지가 보인다

 

 

빈도수 높은 단어 20개 추출하기
df_word <- df_word %>% filter(nchar(word)>= 2)
df_word
top_20 <- df_word %>% 
  arrange(desc(freq)) %>% 
  head(20)
top_20

사랑 ..♡

 

 

워드 클라우드 만들기
pal <- brewer.pal(8,"Dark2") # Dark2 색상 목록에서 8개 색상추출

set.seed(1234) # seed- 컴퓨터안에서 랜덤값 추출, 정수를 준다

wordcloud(words = df_word$word,  # 단어
          freq = df_word$freq,   # 빈도
          min.freq = 2,          # 최소 단어 빈도
          max.words = 200,       # 표현 단어 수
          random.order = F,      # 고빈도 단어 중앙 배치
          rot.per = .1,          # 회전 단어 비율
          scale = c(4, 0.3),     # 단어 크기 범위
          colors = pal)          # 색깔 목록

**set.seed 함수를 사용해야하는 이유 : 초반에 뽑아낸 랜덤 값이 계속 바뀌지 않고 유지되게 만들어줌. (랜덤값고정)

=> set.seed 없이 실행하면 워드클라우드가 실행할때마다 배치위치나 색이 바뀜!

나의 hiphop 워드클라우드

 

display.brewer.all() # 여기서 원하는 색 찾으면 된다
pal <- brewer.pal(8,"Blues") # 파랑색으로

set.seed(1234) # seed- 컴퓨터안에서 랜덤값 추출, 정수를 준다

wordcloud(words = df_word$word,  # 단어
          freq = df_word$freq,   # 빈도
          min.freq = 2,          # 최소 단어 빈도
          max.words = 200,       # 표현 단어 수
          random.order = F,      # 고빈도 단어 중앙 배치
          rot.per = .1,          # 회전 단어 비율
          scale = c(4, 0.3),     # 단어 크기 범위
          colors = pal)          # 색깔 목록

내가 젤 좋아하는 파랑색으로

 

pal <- brewer.pal(11,"RdBu") # 색상 목록에서 11개 색상추출

set.seed(1234) # seed- 컴퓨터안에서 랜덤값 추출, 정수를 준다

wordcloud(words = df_word$word,  # 단어
          freq = df_word$freq,   # 빈도
          min.freq = 4,          # 최소 단어 빈도
          max.words = 300,       # 표현 단어 수
          random.order = T,      # 고빈도 단어 중앙 배치
          rot.per = .4,          # 회전 단어 비율
          scale = c(4, 0.3),     # 단어 크기 범위
          colors = pal)

값을 이것 저것 바꿔보았다

파이썬은 워드클라우드 모양도 바꿀 수 있다고 한다 !

다음에 파이썬을 배우면 다시해보겠다.

 

워드클라우드 만들고 파일저장하기
windows()# 윈도우형태로 출력하기 위해 함수호축
# 이 함수 실행안하면 savePlot()에서 에러 발생

palete = brewer.pal(9,"Set1")

wordcloud(words = df_word$word,  # 단어
          freq = df_word$freq,   # 빈도
          min.freq = 19,          # 최소 단어 빈도
          max.words = 200,       # 표현 단어 수
          random.order = T, # 고빈도 단어 중앙 배치
          random.color = T, 
          rot.per = .25,          # 회전 단어 비율
          scale = c(5, 0.5),     # 단어 크기 범위
          colors = pal)

savePlot(filename="a.jpg") # jpg 파일 저장

r_work 폴더에 a파일이 생성되었다. 근데 그냥은 안열리고 그림판에서 불러와야 볼 수 있었다 !

 

 

# wordcloud2 활용하기

강의 중 강사님이 wordcloud2를 발견하셨다 ! 다같이 해보기로함

# wordcloud2 packages 설치
install.packages("wordcloud2")
install.packages("tidyverse")
install.packages("nord")

library(wordcloud2)
library(tidyverse)
library(nord)

# 실행
wordcloud2(df_word)

1보다 꽉차고 알차게 워드클라우드를 만들 수 있다 !!

 

 

별 모양 워드클라우드 만들기
df <- df_word %>% arrange(desc(freq)) %>% head(300)

# 별모양으로 만들기
wordcloud2(df,
           color='random-light', size=0.5,
           shape='star')

워드클라우드2를 이용하면 다양한 모양의 워드클라우드를 만들 수 있었다..!

 

 

 

# 크롤링 
gsub함수 활용하기  / 원하는 문자열 지우기 

sub(바꿀패턴,바뀔패턴,변수) : 처음 발견한 곳만 바꿔주는 함수

gsub(바꿀패턴,바뀔패턴,변수) : 전체에서 원하는 곳을 다 바꿔주는 함수

word <- "JAVA javascript 23  가나다 123 abc  %^&* 대한민국"

gsub("A","",word) # A를 찾아서 삭제하라
gsub("A","",word, ignore.case=T) # 대소문자 무시하고 삭제하기

# A나 a를 제거하라 [ ]
gsub("[Aa]","",word)
gsub("[Aabcs]","",word)

# 영어 전부 없애기
gsub("[A-Z]","",word)
gsub("[A-Za-z]","",word) # 대문자, 소문자

# 숫자 전부 없애기 (셋다 같은 뜻임)
gsub("[0-9]","",word)
gsub("[1234567890]","",word)
gsub("\\d","",word)

# 한글
gsub("[가-힣]","",word)

# [^a] 제외하고 다지우기
gsub("[^a]","",word) # 소문자 a빼고 다 지우기
gsub("[^a-z]","",word) # 소문자 빼고 다 지우기
gsub("[^가-힣]","",word) # 한글 빼고 다 지우기

잘 지워진 모습이다

 

words <- c("병원", "학교", "바이러스", "학생", "수학", 
           "정확", "목단", "작약", "목련", "천일홍", "백일홍")
           
# gsub는 벡터도 받아진다
gsub("학","교", words) # 학을 교로 바꾸기

gsub("^학","나", words) # 학으로 시작하는 단어를 찾아 교로 바꾸기
gsub("학$", "나", words) # 학으로 끝나는 단어 찾아 나로 바꾸기


word <- "JAVA javascript 23  가나다 123 abc  %^&* 대한민국"
gsub(" ","@",word) # 공백찾아 골뱅이로 바꾸기

 

word <- "JAVA javascript Aaa 가나다 AAaAa A123 %^&*"

# 첫번째 하나만 대체하기
sub(" ", "@", word) 

# {2} : 2번 반복하는 앞의 글자를 {}만큼 반복할때 지운다
gsub("Aa{2}", "", word)

 

R에서만 제공하는 특수패턴
# 특수문자 제거하는 특수패턴
gsub("[[:punct:]]","",word)
# 특수문자를 제외한 나머지
gsub("[[:alnum:]]","",word)
# 특수문자 + 공백 제거하기
gsub("[^[:alnum:]]","",word)
# 숫자만 제거하기
gsub("[[:digit:]]","",word)
# 숫자를 제외하고 제거
gsub("[^[:digit:]]","",word)

 

 

stringr 라이브러리 사용하기
library("stringr") # 문자열 취급 라이브러리
# 문자열을 토큰으로 나누거나 합칠 때 사용
# 단어 단위로 , 로 쪼개놓고 단어를 토큰이라 부름

w<- c("red, green, blue, cyan, magenta",
      "flower, rainbow")

result <- str_split(w,pattern=",") # list 타입으로 리턴함
result
class(result)
table(result)

list 타입이라 인자 수가 다르면 실행이 안된다.

 

# 인자수를 맞춰주면 ?
w<- c("red, green, blue, cyan, magenta",
      "flower, rainbow, a, b, c")

result <- str_split(w,pattern=",") # list 타입으로 리턴함
result
class(result)
table(result)

table이 나오긴함

 

 

list 해제하기
result<-unlist(result)
result

해제된모습

 

 

R은 함수를 안쓰고는 한글자씩 바꾸는 능력이 없다
word <-"R language"
word[1]

word[1] = "r"
word

첫글자만 바꾸고 싶었는데 통으로 r이 된모습

 

 

nchar 활용하기
# nchar - 문자의 개수를 카운트
nchar(result)
length(result) # 벡터의크기

nchar("스칼라-데이터한개")
length("스칼라-데이터한개")

nchar와 length의 차이를 알 수 있음

nchar는 값의 길이를, length는 값의 개수를 추출한다 !

 

 

대소문자 한번에 바꾸기
# 대소문자 한번에 바꾸기
fox.says = "It is with the HEART that one can see Rightly"

tolower(fox.says) # 전부소문자
toupper(fox.says) # 전부대문자

 

 

문자열 추출하기
# 문자열 자르기
w <- "Data Analytics"
substr(w, 1, 4) # 1번부터 4번까지 글자만 남기기
substr(w, 6, 14) # 6 ~ 14 번 까지만 남기기

** substr(변수, 시작, 끝) : 문자열에서 시작 위치와 끝 위치를 정하여 문자를 추출함

 

문자열 붙이기
birth <- "2012-09-09"
#  2012년 09월 09일 로 뜨게하기
birth <- paste(substr(birth,1,4),"년",
               substr(birth,6,7),"월",
               substr(birth,9,10),"일")
birth

 

 

~ 오늘의 강의 후기 ~

wordcloud는 화려한 결과가 눈에 바로 보이니까 신기하고 재밌었다 ~
문자열 관련한 패턴이나 함수들은.. 더 공부를 해야할 것 같다 ~...

※ 사용한 교재 : 쉽게 배우는 R 데이터 분석 / 저자 : 김영우