59doit
토픽 모델링 #5 최적의 토픽 수 본문
최적의 토픽 수 정하기
토픽 수를 정하는 방법 알아보기
토픽 모델의 구조는 토픽 수에 따라 달라지므로 적절한 토픽 수를 정해야 한다
토픽 수 너무 적으면 대부분의 단어가 한 토픽의 주요 단어가 되어 의미가 불분명해짐
토픽 수 너무 많으면 여러 토픽에 주요 단어가 중복되어 토픽의 개성이 드러나지 않음
방법 1. 모델의 내용을 보고 해석 가능성을 고려해 토픽 수 정하기
토픽 수 정하는 가장 일반적인 방법
분석가가 적당한 개수를 정해 모델을 만든 다음 내용을 보고 판단
(1) 주요 단어가 토픽을 잘 대표하는가?
(2) 문서가 비슷한 내용끼리 잘 분류되었는가?
(3) 모델이 텍스트를 해석하는 데 도움이 되는가?
일일이 모델의 내용을 확인해야 하므로 시간이 많이 소요됨
텍스트의 내용에 관한 전문 지식이 없으면 모델이 타당한지 판단하기 어려움
방법 2. 여러 모델의 성능 지표를 비교해 토픽 수 정하기
토픽 수 바꾸어 가며 여러 모델 만들어 성능 지표 비교: 하이퍼파라미터 튜닝(hyperparameter tuning)
전문적인 지식 없어도 적당한 토픽 수를 정할 수 있음
여러 모델 만들어야 하므로 시간이 많이 소요됨
성능 지표 높다고 반드시 좋은 모델 X 68 / 95
방법 3. 두 가지 방법을 함께 사용하기
(1) 하이퍼파라미터 튜닝으로 몇 개의 후보 모델 선정
(2) 후보 중 해석 가능성이 큰 모델 최종 선택
하이퍼파라미터 튜닝으로 토픽 수 정하기
ldatuning::FindTopicsNumber()
dtm : Document Term Matrix
topics : 비교할 최소-최대 토픽 수
return_models : 모델 저장 여부(기본값 FALSE )
control = list(seed = )) : 난수 고정
#1 토픽 수 바꿔가며 LDA 모델 여러 개 만들기
install.packages("ldatuning") library(ldatuning) models <- FindTopicsNumber(dtm = dtm_comment, topics = 2:20, return_models = T, control = list(seed = 1234)) models |
Error
Error in loadNamespace(name) : there is no package called ‘Rmpfr’ |
해결
install.packages("ldatuning", type = "binary") library(ldatuning) models <- FindTopicsNumber(dtm = dtm_comment, topics = 2:20, return_models = T, control = list(seed = 1234)) models |
FindTopicsNumber()
dtm : "DocumentTermMatrix" 클래스의 개체
topics : 서로 다른 모델을 비교할 수 있는 여러 항목이 있는 벡터
return_models : 클래스의 모델 객체를 반환할지 여부 LDA.
기본값은 false입니다. true로 설정하려면 tibble 패키지가 필요하다.
control : 파라미터의 명명된 목록 또는 ' >LDAcontrol ' 클래스의 개체
library(dplyr) models %>% select(topics, Griffiths2004) # topics Griffiths2004 # 1 20 -129968.8 # 2 19 -129746.4 # 3 18 -129688.6 # 4 17 -129470.6 # 5 16 -129283.3 # 6 15 -129618.2 # 7 14 -129452.5 # 8 13 -129317.1 # 9 12 -129357.2 # 10 11 -129102.5 # 11 10 -129424.2 # 12 9 -129339.9 # 13 8 -129630.4 # 14 7 -130394.7 # 15 6 -130877.5 # 16 5 -132124.8 # 17 4 -133551.7 # 18 3 -135553.7 # 19 2 -139731.1 |
Griffiths2004 : 복잡도(perplexity)
모델의 성능 지표, 텍스트를 설명하는 정도, 텍스트의 구조를 잘 설명할수록 큰값
#2 최적 토픽 수 정하기
FindTopicsNumber_plot(models)![]() |
x축: 토픽 수
y축: 성능 지표를 0~1로 최대-최소 정규화(min-max normalization)한 값
성능 좋을수록 큰 값. 후보 중 성능 가장 좋으면 1, 가장 나쁘면 0
- 토픽 수 늘려도 성능이 크게 향상되지 않고 등락 반복하기 시작하는 지점에서 토픽 수 결정
#3 모델 추출하기
optimal_model <- models %>% filter(topics == 8) %>% pull(LDA_model) %>% # 모델 추출 .[[1]] # list 추출 |
토픽 수가 8개인 모델 추출하기
pull(LDA_model) # 모델 추출
.[[1]] # list 추출
# 토픽 수를 8개로 지정해 만든 모델과 동일
library(tidytext) # tidy 함수 library |
# 8개로 지정해 만든 모델 tidy(optimal_model, matrix = "beta") # # A tibble: 49,256 x 3 # topic term beta # # 1 1 한국 0.0000363 # 2 2 한국 0.000388 # 3 3 한국 0.0000363 # 4 4 한국 0.0000346 # 5 5 한국 0.0563 # 6 6 한국 0.0000340 # 7 7 한국 0.0000355 # 8 8 한국 0.0111 # 9 1 방탄소년단 0.0000363 # 10 2 방탄소년단 0.0000353 # # ... with 49,246 more rows |
tidy(lda_model, matrix = "beta") # # A tibble: 49,256 x 3 # topic term beta # <int> <chr> <dbl> # 1 1 한국 0.0000363 # 2 2 한국 0.000388 # 3 3 한국 0.0000363 # 4 4 한국 0.0000346 # 5 5 한국 0.0563 # 6 6 한국 0.0000340 # 7 7 한국 0.0000355 # 8 8 한국 0.0111 # 9 1 방탄소년단 0.0000363 # 10 2 방탄소년단 0.0000353 # # ... with 49,246 more rows |
'텍스트마이닝' 카테고리의 다른 글
의미망 분석 #2 동시 출현 네트워크 (1) (0) | 2022.12.25 |
---|---|
의미망 분석 #1 동시 출현 단어 분석 (0) | 2022.12.25 |
토픽 모델링 #4 토픽 이름 짓기 (0) | 2022.12.21 |
토픽 모델링 #3 토픽분류 (0) | 2022.12.20 |
토픽 모델링 #2 주요단어 (0) | 2022.12.20 |