Data Analysis

R/텍스트마이닝

[텍스트마이닝] 상대적으로 중요한 단어 비교하기

Holy_Water 2022. 11. 21. 12:22

빈도 높은 단어를 비교하면
어떤 텍스트든 일반적인 단어 빈도 높아 텍스트 차이 잘 드러나지 않음
ex) 연설문: "우리" , "사회" , "경제" , "일자리"

 

텍스트의 차이를 알아보려면
특정 텍스트에는 많이 사용되었지만 다른 텍스트에는 적게 사용된 단어를 살펴봐야함

 

Long form 데이터 살펴보기

df_long <- frequency %>% group_by(president) %>% slice_max(n,n=10) 
%>% filter(word %in% c("국민", "우리", "정치", "행복"))

frequency : president가 "moon"인 행과 "park"인 행이 세로로 길게 나열

 

 

Long form을 Wide form으로 변형하기

library(tidyr)

df_wide <- df_long %>% pivot_wider(names_from = president, values_from = n)

wide form: 가로로 넓은 형태의 데이터, 범주별로 단어 빈도 비교하기 편함, 변수간 연산하기 편함

tidyr::pivot_wider() : long form을 wide form으로 변환

names_from : 변수명으로 만들 값이 들어 있는 변수

values_from : 변수에 채워넣을 값이 들어 있는 변수

 

 

NA를 0으로 바꾸기

df_wide <- df_long %>% pivot_wider(names_from = president, values_from = n, values_fill = list(n=0))

frequency_wide <- frequency %>% pivot_wider(names_from = president, values_from = n, values_fill = list(n = 0))
frequency_wide

어떤 단어가 둘 중 한 범주에만 있으면 NA, 오즈비 계산하기 위해 0으로 변환해야 함

 

 

단어의 비중을 나타낸 변수 추가하기

frequency_wide <- frequency_wide %>% mutate(ratio_moon = ((moon)/(sum(moon))), 
                                            ratio_park = ((park)/(sum(park))))
frequency_wide

 

 

단어의 비중을 나타낸 변수 추가하기

frequency_wide <- frequency_wide %>%
  mutate(ratio_moon = ((moon + 1)/(sum(moon + 1))), # moon에서 단어의 비중
         ratio_park = ((park + 1)/(sum(park + 1)))) # park에서 단어의 비중
frequency_wide

각 단어가 두 연설문에서 차지하는 비중을 나타낸 변수, 연설문별로 '각 단어의 빈도'를 '모든 단어 빈도의 합'으로 나눔

 

 

오즈비 변수 추가하기

frequency_wide <- frequency_wide %>% mutate(odds_ratio = ratio_moon/ratio_park)
frequency_wide

top10 <- frequency_wide %>%
  filter(rank(odds_ratio) <= 10 | rank(-odds_ratio) <= 10)
top10 %>%
  arrange(-odds_ratio)

한 텍스트의 단어 비중을 다른 텍스트의 단어 비중으로 나눔

 

 

비중이 큰 연설문을 나타낸 변수 추가하기

top10 <- top10 %>% mutate(president = ifelse(odds_ratio >1, "moon", "park"), n = ifelse(odds_ratio >1, moon, park))
top10

 

 

막대그래프 만들기

ggplot(top10, aes(x = reorder_within(word, n, president),
                  y = n,
                  fill = president)) +
  geom_col() +
  coord_flip() +
  facet_wrap(~ president, scales = "free_y") +
  scale_x_reordered()

 

그래프별로 축 설정하기

ggplot(top10, aes(x = reorder_within(word, n, president),
                  y = n,
                  fill = president)) +
  geom_col() +
  coord_flip() +
  facet_wrap(~ president, scales = "free") +
  scale_x_reordered() +
  labs(x = NULL) + # x축 삭제
  theme(text = element_text(family = "nanumgothic")) # 폰트

x축 크기가 그래프마다 다르므로 해석 조심
막대 길이 같아도 단어 빈도 다름
두 텍스트 단어 빈도 비교 X
각 텍스트에서 상대적으로 중요한 단어가 무엇인지 중심으로 해석

 

 

 

주요 단어가 사용된 문장 살펴보기

speeches_sentence <- bind_speeches %>%
  as_tibble() %>%
  unnest_tokens(input = value,
                output = sentence,
                token = "sentences")
speeches_sentence

 

 

주요 단어가 사용된 문장 추출하기 - str_detect()

speeches_sentence %>%
  filter(president == "moon" & str_detect(sentence, "복지국가"))

 

중요도가 비슷한 단어 살펴보기

frequency_wide %>%
  arrange(abs(1 - odds_ratio)) %>%
  head(10)

odds_ratio가 1에 가까운 단어 추출, 대부분 보편적인 의미를 지니는 단어

 

 

중요도가 비슷하면서 빈도가 높은 단어: 두 텍스트에서 모두 강조한 단어

frequency_wide %>%
  filter(moon >= 5 & park >= 5) %>%
  arrange(abs(1 - odds_ratio)) %>%
  head(10)

중요도가 비슷하면서 빈도가 높은 단어: 두 텍스트에서 모두 강조한 단어