본문 바로가기
인공지능/R

R - 텍스트마이닝

by bibibig_data 2021. 6. 8.
#### 10-1 ####

## -------------------------------------------------------------------- ##
# 패키지 설치
install.packages("rJava")
install.packages("memoise")
install.packages("stringr")
install.packages("wordcloud")


#기본R 에서 실행시 실행경로 설정
setwd('D:/rclass')

# 패키지 로드
library(KoNLP)
library(dplyr)
library(useNIADic)

useNIADic()

## ------------------------------------------------------------ ##
install.packages("multilinguer")
library(multilinguer)

install_jdk()
install.packages(c("stringr", "hash", "tau", "Sejong", "RSQLite", "devtools"), type = "binary")
install.packages("remotes")
remotes::install_github("haven-jeon/KoNLP",  upgrade = "never",  INSTALL_opts=c("--no-multiarch"))

library(KoNLP)
# 세종 사전 사용 지정
useSejongDic( ) 

#extractNoun  함수 공백을 기준으로 단어 판단
v1 <- c("봄이 지나면 여름이고 여름이 지나면 가을입니다.그리고 겨울이죠")
extractNoun(v1)
## -------------------------------------------------------------------- ##

#267p
# 데이터 불러오기
txt <- readLines("D:/rclass/hiphop.txt")
class(txt)
head(txt)


library(stringr)

# 특수문자 제거
txt <- str_replace_all(txt, "\\W", " ")

head(txt)
## -------------------------------------------------------------------- ##
extractNoun("대한민국의 영토는 한반도와 그 부속도서로 한다")

# 가사에서 명사추출
nouns <- extractNoun(txt)

# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))

# 데이터 프레임으로 변환
df_word <- as.data.frame(wordcount, stringsAsFactors = F)

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

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

?arrange()
library(dplyr)
top_20 <- df_word %>%
  arrange(desc(freq)) %>%
  head(20)

top_20
## -------------------------------------------------------------------- ##
# 패키지 로드
library(wordcloud)
library(RColorBrewer)

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

#par(mar=c(0.1,0.1,0.1,0.1))
set.seed(1234)
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)          # 색깔 목록
savePlot("w1.png", type="png")
pal <- brewer.pal(9,"Blues")[5:9]  # 색상 목록 생성
set.seed(1234)                     # 난수 고정


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

# wordcloud가 제대로 실행이 안되면 R GUI에서 실행

 

#### 10-2 ####
#기본R 에서 실행시 실행경로 설정
#setwd('C:\\r_test')

# 패키지 로드
library(KoNLP)
library(dplyr)

useNIADic()

## -------------------------------------------------------------------- ##
# 데이터 로드
twitter <- read.csv("D:/rclass/twitter.csv",
                    header = T,
                    stringsAsFactors = F,
                    fileEncoding = "UTF-8")

# 변수명 수정
twitter <- rename(twitter,
                  no = 번호,
                  id = 계정이름,
                  date = 작성일,
                  tw = 내용)

# 특수문자 제거
twitter$tw <- str_replace_all(twitter$tw, "\\W", " ")
head(twitter$tw)

# 트윗에서 명사추출
nouns <- extractNoun(twitter$tw)

# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))

# 데이터 프레임으로 변환
df_word <- as.data.frame(wordcount, stringsAsFactors = F)

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


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

# 상위 20개 추출
top20 <- df_word %>%
  arrange(desc(freq)) %>%
  head(20)

top20

library(ggplot2)

order <- arrange(top20, freq)$word               # 빈도 순서 변수 생성

ggplot(data = top20, aes(x = word, y = freq)) +  
  ylim(0, 2500) +
  geom_col() + 
  coord_flip() +
  scale_x_discrete(limit = order) +              # 빈도 순서 변수 기준 막대 정렬
  geom_text(aes(label = freq), hjust = -0.3)     # 빈도 표시

pal <- brewer.pal(8,"Dark2")       # 색상 목록 생성
set.seed(1234)                     # 난수 고정

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

pal <- brewer.pal(9,"Blues")[5:9]  # 색상 목록 생성
set.seed(1234)                     # 난수 고정

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

'인공지능 > R' 카테고리의 다른 글

R - 감성분석  (0) 2021.06.09
R - 통계적 가설검정  (0) 2021.06.09
R - 데이터 분석 프로젝트  (0) 2021.06.08
R - 지도시각화  (0) 2021.06.08
R - 인터렉티브  (0) 2021.06.08