R 형태소 분석기를 이용한 단어 빈도 분석

R 형태소 분석기를 활용하여 단어의 빈도수를 확인하는 방법을 알아보도록 하겠습니다. 단어를 추출하고 명사로 분류하여 문장, 글에서 해당 명사가 어떤 비중을 차지하는지 빈도수를 계산해보겠습니다.

1. R 형태소 분석

  • 형태소 분석 패키지 설치하기
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)

useNIADic()   #형태소 사전 설정하기
  • 명사 추출하기 – extractNoun()
library(dplyr)
text <- tibble(
  value = c("대한민국은 민주공화국이다.",
            "대한민국의 주권은 국민에게 있고, 모든 권력은 국민으로부터 나온다."))
text

extractNoun(text$value)
  • unesst_tokens()를 이용해 명사 추출하기
library(tidytext)
text %>%
  unnest_tokens(input = value,        # 분석 대상
                output = word,        # 출력 변수명
                token = extractNoun)  # 토큰화 함수
  • 연설문에서 명사 추출하기
raw_moon <- readLines("speech_moon.txt", encoding = "UTF-8")

# 기본적인 전처리
library(stringr)

moon <- raw_moon %>%
  str_replace_all("[^가-힣]", " ") %>%  # 한글만 남기기
  str_squish() %>%                      # 중복 공백 제거
  as_tibble()                           # tibble로 변환

# 명사 기준 토큰화
word_noun <- moon %>%
  unnest_tokens(input = value,
                output = word,
                token = extractNoun)

word_noun

2. 명사 빈도 분석하기

  • 단어 빈도 구하기
# 상위 20개 단어 추출
top20 <- word_noun %>%
  head(20)

# 막대 그래프 만들기
library(ggplot2)
ggplot(top20, aes(x = reorder(word, n), y = n)) +
  geom_col() +
  coord_flip() +
  geom_text(aes(label = n), hjust = -0.3) +
  labs(x = NULL) +
  theme(text = element_text(family = "nanumgothic"))
  • 워드 클라우드 만들기
library(showtext)
font_add_google(name = "Black Han Sans", family = "blackhansans")
showtext_auto()

library(ggwordcloud)
ggplot(word_noun, aes(label = word, size = n, col = n)) +
  geom_text_wordcloud(seed = 1234, family = "blackhansans") +
  scale_radius(limits = c(3, NA),
               range = c(3, 15)) +
  scale_color_gradient(low = "#66aaf2", high = "#004EA1") +
  theme_minimal()

3. 특정 단어가 사용된 문장 살펴보기

  • 문장 기준으로 토큰화하기
sentences_moon <- raw_moon %>%
  str_squish() %>%
  as_tibble() %>%
  unnest_tokens(input = value,
                output = sentence,
                token = "sentences")

sentences_moon
  • 특정 단어가 사용된 문장 확인하기
str_detect("치킨은 맛있다", "치킨")
str_detect("치킨은 맛있다", "피자")
  • 특정 단어가 사용된 문장 추출하기
sentences_moon %>%
  filter(str_detect(sentence, "국민"))
  • tibble 구조는 텍스트가 길면 Console 창 크기에 맞춰 일부만 출력됨. 모든 내용을 출력하려면 코드에 %>% data.frame()를 추가해 데이터 프레임으로 변환하면 됨. 왼쪽 정렬로 출력하려면 %>% print.data.frame(right=F)를 추가함.

기본적인 단어 빈도분석에 대해 궁금하신 분은 여기 링크를 참고바랍니다.

<참고> Do It! 쉽게 배우는 R 텍스트 마이닝

[이지스퍼블리싱]Do it! 쉽게 배우는 R 텍스트 마이닝 - Do it! 시리즈, 이지스퍼블리싱

“이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.”

Back to top