텍스트마이닝
의미망 분석 #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() ![]() |
- 동시 출현 빈도, 파이 계수로 만든 네트워크 그래프의 차이점
동시 출현 빈도를 이용한 네트워크 그래프
여러 단어와 자주 함께 사용된 단어쌍 중심으로 네트워크 형성
노드 대부분이 서로 연결되어 구조가 복잡하고 군집이 잘 드러나지 않음
자주 사용된 단어를 파악할 때 활용
- 파이 계수를 이용한 네트워크 그래프
다른 단어에 비해 상대적으로 자주 함께 사용된 단어쌍 중심으로 네트워크 형성
관련성이 큰 단어끼리만 연결되어 단어 군집이 명확하게 드러남
밀접하게 관련된 단어쌍 파악할 때 활용
반응형