Programming/R

R Programming Web Crawling 형태소 분석

Isaac S. Lee 2023. 6. 7. 16:34

1. 기본 package 설정

# install.packages("tidyverse")
# install.packages("tidytext")

useNIADic() # 단어사전

library(KoNLP)
library(tidyverse)
library(tidytext)

 

2. 데이터 가져오기

tm_tb <- read_csv('Article content analysis.csv',
                  col_names = TRUE,                       
                  na = ".")
tm_tb

✔️여러 페이지의 데이터를 가져오는 방법으로 내보내기한 데이터를 사용한다.

 

3. 문서 전처리 (정규표현식 이용)

tm_tb <- tm_tb %>%
  mutate(본문 = gsub("[[:cntrl:]]", "", 본문)) %>% # 엔터 등 제거
  mutate(본문 = gsub("[[:punct:]]", " ", 본문)) %>% # 구두점 등 제거
  mutate(본문 = gsub("[[:digit:]]", "", 본문))     # 숫자 제거
tm_tb$본문[2]

✔️ 정규표현식 
✔️ mutate(본문 = gsub("", "", 본문))
✔️ 무엇을 출력할지는 내용을 보면서 생각해 봐야 한다.
✔️ [:cntrl:]: 제어문자 [\x00-\x1F\x7F]
✔️ [:punct:]: 구두점 [][!"#$%&'()*+,./:;<=>?@\^_`{|}~-]
✔️ [:digit:]: 숫자 [0-9]

 

3-1. 형태소 분석

word_tb <- tm_tb %>%
  select(no, 본문) %>%
  unnest_tokens(input = 본문,
                output = morp,
                token = SimplePos09) %>% # 한글 형태소로 분리
  mutate(word = str_remove(morp, "/.*$")) %>% # 형태소 정보 제거
  filter(str_length(word) >= 2)
word_tb

✔️ token: 어떤 방법으로 token처리를 할 것인가?
✔️ A tibble: 10,585 × 3

3-2. 명사추출

word_n_tb <- word_tb %>%
  filter(str_detect(morp, "/n"))# 명사 추출
word_n_tb

✔️ A tibble: 7,873 × 3

3-3 동사, 형용사 추출

word_p_tb <- word_tb %>%
  filter(str_detect(morp, "/p")) %>% # 동사, 형용사 추출
  mutate(word = str_replace(morp, "/.*$", "다")) # 형태소 정보 제거
word_p_tb

✔️ A tibble: 817 × 3

3-4. 통합

word_t_tb <- bind_rows(word_n_tb, word_p_tb)
word_t_tb

 

4. 단어 정리

4-1. 단어 바꾸기

word_t_tb <- word_t_tb %>%
  mutate(word = gsub("ai", "인공지능", word)) %>% 
  mutate(word = gsub("바드는", "바드", word)) %>% 
  mutate(word = gsub("챗지피티", "chatgpt", word)) %>%
  mutate(word = gsub("지피티", "chatgpt", word)) %>%  
  mutate(word = gsub("챗gpt를", "chatgpt", word)) %>%
  mutate(word = gsub("챗gpt", "chatgpt", word))
word_t_tb

✔️ 같은 단어를 한단어로 변경

4-2. 단어 삭제

st_word <- tibble(word=c("대하다", "통하다", "따르다", "위하다", "지나다", "에서", "보이다", "때문", "아니다"))

word_t_tb <- word_t_tb %>%
  anti_join(st_word, by="word")
word_t_tb