59doit

토픽 모델링 #5 최적의 토픽 수 본문

텍스트마이닝

토픽 모델링 #5 최적의 토픽 수

yul_S2 2022. 12. 21. 11:29
반응형

 최적의 토픽 수 정하기 

토픽 수를 정하는 방법 알아보기

토픽 모델의 구조는 토픽 수에 따라 달라지므로 적절한 토픽 수를 정해야 한다

토픽 수 너무 적으면 대부분의 단어가 한 토픽의 주요 단어가 되어 의미가 불분명해짐

토픽 수 너무 많으면 여러 토픽에 주요 단어가 중복되어 토픽의 개성이 드러나지 않음

 

 

 방법 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

 

 

반응형
Comments