트위터 텍스트 마이닝

library(KoNLP)
library(dplyr)
library(ggplot2)

install.packages("stringr")

library(stringr) # stringr 패키지는 문자열을 가능한 한 쉽게 처리하도록 설계 함수
                # 세트를 제공합니다.

useNIADic()

twitter <- read.csv("./Data/twitter.csv",
                    header = T,
                    stringsAsFactors = F,
                    fileEncoding = "UTF-8")

glimpse(twitter)

# 변수명 수정
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))

wordcount

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

glimpse(df_word)

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

# nchar() 하고 str_lenght()는 문자열을 카운트 하는 기능이 들어 있다. 하지만, 두 기능 간의 차이점이 있는게,
# nchar()는 범주형인 factor를 처리하지 못하고, str_lenght()는 처리 할 수 있다는 것이다.
# word는 팩터형이므로 nchar()는 적용되지 않는다.
df_word <- filter(df_word, str_length(word) >= 2)


# 빈도 순으로 정렬한 후 상위 20개 단어를 추출
top_20 <- df_word %>% arrange(desc(freq)) %>% head(20)

top_20


# 빈도 순서 변수 생성
order <- arrange(top_20, freq)$word              # 빈도 순서 변수 생성
# arrange(top_20, freq) --> 상위 20개 단어와 그 출력 횟수 출력
# $word를 통해 단어만 뽑아냄

ggplot(data = top_20, 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)      # 빈도 표시


# 워드 클라우드 만들기

library(wordcloud)

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)         # 색상 목록