본문 바로가기

교육

R 한글 텍스트 마이닝 분석 (2) │품사 분석과 불용어 추가 전처리

이번 포스팅은 SimplePos09 함수를 이용하여 명사를 추출하고, 추가적인 불용어 처리 방법을 정리합니다. 분석에 활용할 텍스트 데이터 지난 포스팅에서 사용했던 네이버의 생성형 AI 서비스 큐에 대한 보도자료를 계속 이용하겠습니다. R 코드는 포스팅 하단에 업로드해 두었습니다.

 

R 한글 텍스트 마이닝 │네이버 생성형 AI 큐 국내 보도자료 분석│엑셀 데이터 호출 및 빈도분석

지난 포스팅에서 한글 텍스트 마이닝 분석을 위한 KoNLP 설치하는 방법까지 설명하였습니다. 이어서 테스트도 할 겸 엑셀의 텍스트 데이터를 호출하고, 빈도 분석까지 간단히 정리해 보겠습니다.

e-datanews.tistory.com

 

01. 로딩 

분석에 필요한 라이브러리를 로딩합니다. 

더보기

library(tidyverse)
library(tidytext)
library(KoNLP)
useNIADic()
library(readxl)
library(wordcloud)

 

02. 작업 폴더

작업 폴더를 별도 지정합니다. 

더보기

setwd("C:/test/ko_test")

 

03. 데이터 호출

이전 포스팅에서 사용했던 엑셀 파일과 동일합니다. read_excel 함수를 이용하여 호출합니다. 

더보기

naverq <- read_excel("naverq.xlsx", col_names = TRUE)

 

04. 데이터 전처리 : 제목

title 열에 있는 보도자료 제목들을 간단하게 정제합니다. 

더보기

naverq_title <- naverq %>%
  select(title) %>%
  mutate(title = str_replace_all(title, "[^가-힣]", " "),
         title = str_squish(title),
         id = row_number())

 

05. 품사 분석 : 명사 추출

SimplePos09 함수를 이용하여 품사 분석 후, 두 단어 이상의 명사만 추출합니다. 분석 데이터량이 많을수록 시간 소요가 많습니다. 참고하기 바랍니다. 

더보기

title_pos <- naverq_title %>%
  unnest_tokens(input = title,
                output = pos,
                token = SimplePos09, 
                drop = F)

title_pos_nouns <- title_pos %>% 
  filter(str_detect(pos, "/n")) %>%
  mutate(word = str_remove(pos, "/.*$")) %>%
  filter(str_length(word) > 1)

 

06. 정렬

빈도 수 기준으로 단어들을 정렬합니다. 

더보기

title_pos_nouns <- title_pos_nouns %>%
  count(word, sort = TRUE) %>%
  filter(n>1)

title_pos_nouns

 

07. 불용어

불용어 목록에 네이버라는 단어를 추가한 후, 불용어 처리합니다. 

더보기

stopwords <- tibble(word = c("네이버"))
title_pos_nouns <- title_pos_nouns %>%
   anti_join(stopwords, by = "word")

 

08. 데이터 시각화 : 막대그래프

상위 30개 단어들을 빈도 수 기준으로 정렬한 막대그래프를 구현합니다. 

더보기

top_noun30 <- title_pos_nouns %>% head(30)

ggplot(top_noun30, aes(x=reorder(word,n), y=n)) +
    geom_col() +
    coord_flip() +
    geom_text(aes(label=n), hjust=-0.3) +
    labs(title="명사 추출 및 불용어 처리 후, 빈도 분석", x=NULL , y=NULL ) + 
    theme(title=element_text(size=12))

두 단어 이상의 명사 빈도 기준 막대 그래프
두 단어 이상의 명사 빈도 기준 막대 그래프

 

09. 단어 추가 정리

출력 결과 중 "써보", "복잡한" 이라는 단어의 경우, "써보"라는 단어는 삭제하고, "복잡한"의 경우는 "복잡"만 남기는 추가 정리를 합니다.  추가 정리가 잘 되었는지 확인한 후, 상위 빈도 30개 단어를 다시 추출합니다. 

더보기

title_pos_nouns <- title_pos_nouns %>%
  mutate(word = gsub("써보", "", word)) %>%
  mutate(word = gsub("복잡한", "복잡", word)) 

title_pos_nouns

top_noun30 <- title_pos_nouns %>% head(30)

 

10. 데이터 시각화 : 워드클라우드

추출된 2단어 이상의 명사만 이용하여 워드클라우드를 구현합니다. 

더보기

wordcloud(words=top_noun30$word,freq=top_noun30$n,
          scale=c(7,.5),rot.per=0.0 , 
          colors=brewer.pal(8,"Dark2"))

추가 전처리 이후&#44; 2 단어 이상의 명사를 이용한 워드클라우드
추가 전처리 이후, 2 단어 이상의 명사를 이용한 워드클라우드

 

11. 파일 다운로드 

위에서 설명한 R 한글 텍스트 마이닝 실행 코드입니다.  본문에는 보도자료의 제목만 이용하여 텍스트 마이닝을 시도했습니다만,  업로드한 파일에는 키워드를 이용한 R 실행코드도 포함되어 있으니 참고 바랍니다. 

R 한글 텍스트 마이닝 분석 (2).txt
0.00MB

 

R 한글 텍스트 마이닝 (3) : TF - IDF

R을 이용한 한글 텍스트 마이닝 세 번째 포스팅은 TF-IDF입니다. TF-IDF 개념은 이전 포스팅에서도 많이 언급했습니다. 주요 개념은 다음 포스팅 등을 참고하기 바랍니다. 단어 빈도-역문서 빈도 분

e-datanews.tistory.com

다음 포스팅은 단어 빈도-역문서빈도 분석(TF-IDF 분석)입니다. 관련 내용은 위의 링크 포스팅을 참고 바랍니다.