텍스트마이닝

의미망 분석 #4 단어 간 상관 분석

yul_S2 2022. 12. 26. 19:45
반응형

(3) 단어 간 상관 분석

  • 동시 출현 빈도의 한계
    대부분의 단어와 자주 함께 사용되는 단어쌍 다수 ex) "영화"-"기생충"
    다른 단어에 비해 상대적으로 자주 함께 사용된 단어가 무엇인지 살펴봐야 한다

 

  • 파이 계수(phi coefficient)
    두 단어가 함께 사용되는 경우가 각각 사용되는 경우에 비해 얼마나 많은지 나타낸 지표
    상대적으로 관련성이 큰 단어 파악하는데 활용
    어떤 단어와 자주 함께 사용되지만 다른 단어와는 자주 함께 사용되지 않는 단어

 

  • 파이 계수의 의미
    X, Y 두 단어가 있을 때, 여러 텍스트에서 두 단어의 사용 여부를 놓고 가능한 모든 경우
    X, Y 모두 있음( )
    X, Y 모두 없음( )
    X만 있음( )
    Y만 있음( )
    +1에 가까울수록 두 단어가 자주 함께 사용되어 관련성이 크다는 의미
    -1에 가까울수록 함께 사용되는 경우가 드물어 관련성이 작다는 의미

 

# 파이 계수 구하기

widyr::pairwise_cor()

item : 단어

feature : 텍스트 구분 기준

sort = T : 파이 계수 높은순 정렬

 

#1

word_cors <- comment %>%
  add_count(word) %>%
  filter(n >= 20) %>%
  pairwise_cor(item = word,
               feature = id,
               sort = T)

word_cors

# # A tibble: 29,412 x 3
# item1      item2      correlation
# <chr>      <chr>            <dbl>
# 1 올리다     블랙리스트       0.436
# 2 블랙리스트 올리다           0.436
# 3 역사       쓰다             0.370
# 4 쓰다       역사             0.370
# 5 감독님     봉준호           0.334
# 6 봉준호     감독님           0.334
# 7 박근혜     블랙리스트       0.322
# 8 블랙리스트 박근혜           0.322
# 9 정경심     조국             0.309
# 10 조국       정경심           0.309
# # ... with 29,402 more rows

 

 

#2 특정 단어와 관련성이 큰 단어 살펴보기

word_cors %>%
  filter(item1 == "대한민국")

# # A tibble: 171 x 3
# item1    item2  correlation
# <chr>    <chr>        <dbl>
# 1 대한민국 국민        0.182 
# 2 대한민국 자랑        0.157 
# 3 대한민국 위상        0.148 
# 4 대한민국 국격        0.129 
# 5 대한민국 위대한      0.100 
# 6 대한민국 세계        0.0906
# 7 대한민국 문화        0.0754
# 8 대한민국 감사합      0.0722
# 9 대한민국 오늘        0.0712
# 10 대한민국 나라        0.0701
# # ... with 161 more rows
word_cors %>%
  filter(item1 == "역사")

# # A tibble: 171 x 3
# item1 item2    correlation
# <chr> <chr>          <dbl>
# 1 역사  쓰다          0.370 
# 2 역사  최초          0.117 
# 3 역사  한국          0.0979
# 4 역사  순간          0.0908
# 5 역사  한국영화      0.0819
# 6 역사  아니다        0.0771
# 7 역사  영광          0.0639
# 8 역사  감사          0.0600
# 9 역사  영화제        0.0595
# 10 역사  스카          0.0591
# # ... with 161 more rows

 

 

# 파이 계수로 막대 그래프 만들기

 

#1 관심 단어별로 파이 계수가 큰 단어 추출하기

target <- c("대한민국", "역사", "수상소감", "조국", "박근혜", "블랙리스트")

top_cors <- word_cors %>%
  filter(item1 %in% target) %>%
  group_by(item1) %>%
  slice_max(correlation, n = 8)

top_cors

# # A tibble: 48 x 3
# # Groups:   item1 [6]
# item1    item2      correlation
# <chr>    <chr>            <dbl>
# 1 대한민국 국민            0.182 
# 2 대한민국 자랑            0.157 
# 3 대한민국 위상            0.148 
# 4 대한민국 국격            0.129 
# 5 대한민국 위대한          0.100 
# 6 대한민국 세계            0.0906
# 7 대한민국 문화            0.0754
# 8 대한민국 감사합          0.0722
# 9 박근혜   블랙리스트      0.322 
# 10 박근혜   이미경          0.241 
# # ... with 38 more rows

target 에 관심 단어 목록 생성하여 담기

 

 

 

#2 막대 그래프 만들기

top_cors$item1 <- factor(top_cors$item1, levels = target)

library(ggplot2)

ggplot(top_cors, aes(x = reorder_within(item2, correlation, item1),
                     y = correlation,
                     fill = item1)) +
  geom_col(show.legend = F) +
  facet_wrap(~ item1, scales = "free") +
  coord_flip() +
  scale_x_reordered() +
  labs(x = NULL) +
  theme(text = element_text(family = "nanumgothic"))


 

# 파이 계수로 네트워크 그래프 만들기

#1 네트워크 그래프 데이터 만들기. 연결 중심성과 커뮤니티 추가하기

set.seed(1234)

graph_cors <- word_cors %>%
  filter(correlation >= 0.15) %>%
  as_tbl_graph(directed = F) %>%
  mutate(centrality = centrality_degree(),
         group = as.factor(group_infomap()))

graph_cors

# # A tbl_graph: 58 nodes and 90 edges
# #
# # An undirected multigraph with 18 components
# #
# # Node Data: 58 x 3 (active)
# name       centrality group
# <chr>           <dbl> <fct>
# 1 올리다              4 22   
# 2 블랙리스트         14 1    
# 3 역사                2 11   
# 4 쓰다                2 11   
# 5 감독님              2 10   
# 6 봉준호              6 10   
# # ... with 52 more rows
# #
# # Edge Data: 90 x 3
# from    to correlation
# <int> <int>       <dbl>
# 1     1     2       0.436
# 2     1     2       0.436
# 3     3     4       0.370
# # ... with 87 more rows

 

 

#2 네트워크 그래프 만들기

set.seed(1234)

ggraph(graph_cors, layout = "fr") +
  geom_edge_link(color = "gray50",
                 aes(edge_alpha = correlation, # 엣지 명암
                     edge_width = correlation), # 엣지 두께
                 show.legend = F) + # 범례 삭제
  scale_edge_width(range = c(1, 4)) + # 엣지 두께 범위
  geom_node_point(aes(size = centrality,
                      color = group),
                  show.legend = F) +
  scale_size(range = c(5, 10)) +
  geom_node_text(aes(label = name),
                 repel = T,
                 size = 5,
                 family = "nanumgothic") +
  theme_graph() 

 

  • 동시 출현 빈도, 파이 계수로 만든 네트워크 그래프의 차이점
    동시 출현 빈도를 이용한 네트워크 그래프
    여러 단어와 자주 함께 사용된 단어쌍 중심으로 네트워크 형성
    노드 대부분이 서로 연결되어 구조가 복잡하고 군집이 잘 드러나지 않음
    자주 사용된 단어를 파악할 때 활용

 

  • 파이 계수를 이용한 네트워크 그래프
    다른 단어에 비해 상대적으로 자주 함께 사용된 단어쌍 중심으로 네트워크 형성
    관련성이 큰 단어끼리만 연결되어 단어 군집이 명확하게 드러남
    밀접하게 관련된 단어쌍 파악할 때 활용
반응형