토픽 모델을 만들면 문서가 어떤 주제로 구성되었는지 파악할 수 있다.
주제를 찾으면 비슷한 내용끼리 분류할 수 있기 때문에 다량의 문서를 분석할 때 특히 유용하다.
한편, 토픽은
1. 여러 단어의 혼합으로 구성된다
1-1. 한 토픽에 여러 단어가 서로 다른 확률로 포함된다.
1-2. 같은 단어가 여러 토픽에 서로 다른 확률로 포함된다.
2. 문서는 여러 토픽의 혼합으로 구성된다.
토픽 모델링 중 가장 많이 쓰이는 것이 LDA(Latent Dirichlet Allocation, 잠재 디리클레 할당)이다.
https://github.com/youngwoos/Doit_textmining
GitHub - youngwoos/Doit_textmining: <Do it! 쉽게 배우는 R 텍스트 마이닝> 저장소
<Do it! 쉽게 배우는 R 텍스트 마이닝> 저장소. Contribute to youngwoos/Doit_textmining development by creating an account on GitHub.
github.com
단계를 정리하면
1. 전처리 하기
- 중복 문서 제거하기
: 중복 문서는 계산량이 늘어나 모델을 만드는 시간이 오래걸리기 때문에 dplyr 패키지의 distinct( )를 이용해 중복 댓글을 제거한다. 이때, 댓글이 들어있는 reply 이외에 다른 변수들 모두 보유하도록 .keep_alll=T를 입력한다.
- 짧은 문서 제거하기
: 문서 여러 개의 공통으로 사용된 단어를 이용해 토픽으 찾기 때문에 짧은 문서는 다른 문서와 공통으로 사용된 단어가 적어 토픽 모델을 만들기 적합하지 않다. 짧은 문서를 제거하기 위해 str_count( )로 n 개의 단어 이상으로 사용된 댓글만 추출한다.
2. 명사 추출하기
문서의 주제는 명사로 결정되기 때문에 unnest_tokens에서 token = extractNoun을 사용해 명사만 추출한다.
3. 빈도가 높은 단어는 제거하기
빈도가 높으면 모든 토픽에 포함될 가능성이 높아서 토픽의 특징을 파악하기 어렵다. 따라서 빈도가 높은 단어를 제거함으로써 발생할 문제를 예방한다.
4. 불용어 및 유의어 처리하기
분석상황에 따라 필요하지 않은 단어 및 유의어는 적절하게 수정한다. 따로 라이브러리나 함수가 있지 않고 분석가가 직접 판단하에 진행한다 ^^
5. LDA 모델 만들기
5-1. Document-Term Matrix 만들기
DTM은 행에 문서, 열에 단어로 구성해 빈도를 나타낸 행렬이다.
이를 구하기 위해서는 우선 문서별 단어 빈도를 구한다.
그 후, tidytext 패키지의 cast_dtm( )에 document, term, value 파라미터를 입력해 구할 수 있다.
* 토픽에서 document는 text를 의미한다. (문장 단위)
* term은 단어를 의미한다.
5-2. topicmodels 패키지의 LDA( )에 적용하기
k: 토픽수
method: 샘플링 방법, 토픽 모델은 샘플링을 반복하며 단어의 분포를 추정하는데 주로 "Gibbs"를 사용한다.
control = list(seed=1234) : 시드배정
이후
glimpse( LDA model name ) 을 이용하면 LDA 모델의 내용을 확인할 수 있고
단어가 각 토픽에 등장할 확률 (beta) 와 문서가 각 토픽에 등장할 확률(gamma)가 있다.
beta는 확률 값이므로 한 토픽의 beta를 더하면 1이 나온다.
5-3. beta 값을 바탕으로 모든 토픽의 주요 단어를 살펴보기
topicmodels 패키지의 terms( )를 이용하면 토픽별로 등장 확률이 높은 단어를 한눈에 확인할 수 있다.
이후 다양한 시각화 작업을 거쳐 토픽의 성향을 파악할 수 있다.
5-4. gamma 값을 바탕으로 document를 토픽별로 분류하기
tidytext 패키지의 tidy( ),
tidy(lda_model, matrix="gamma")를 이용해서 구할 수 있다.
5-5. 적절한 토픽명 설정하기
임의로 하시면 됩니다.
5-6. 최적의 토픽 수 정하기 (hyperparameter 튜닝)
토픽 수는 정답이 없기 때문에 분석가가 적당한 개수를 정해 모델을 만든 다음 내용을 보고 주요 단어가 토픽을 잘 대표하는지 비슷하게 분류는 되었는지, 모델이 텍스트를 해석하는데 도움이 되는지를 보고 판단한다.
이때 하이퍼 파라미터 튜닝을 통해 LDA 모델 여러개를 만들 수 있다 (시간은 많이 소요되겠지만 최적값을 찾을 수 있을 것)
ldatuning 패키지의 FindTopicsNumber(dtm = dtm, topic= 개수 범위, return_models=T, control=list(seed=1234)) 를 사용해서 구할 수 있고 이때 성능지표로 Griffiths2004를 사용한다. 텍스트의 구조를 잘 설명할 수록 큰 값을 가진다. 물론 다른 복잡도 지표도 있다.
# 다양한 성능지표
result <- FindTopicsNumber( dtm, topics = seq(from = 2, to = 15, by = 1),
metrics = c("Griffiths2004", "CaoJuan2009", "Arun2010", "Deveaud2014"),
method = "Gibbs", control = list(seed = 77), mc.cores = 2L, verbose = TRUE )
https://cran.r-project.org/web/packages/ldatuning/vignettes/topics.html
Select number of topics for LDA model
Package can be installed from CRAN install.packages("ldatuning") or downloaded from the GitHub repository (developer version). install.packages("devtools") devtools::install_github("nikita-moor/ldatuning") Package ldatuning realizes 4 metrics to select per
cran.r-project.org
한편 이를 min-max scaling으로 스케일링하여 도표화 한다면 더욱 직관적으로 해석할 수 있다.
'T&DI LAB > 토픽모델링' 카테고리의 다른 글
STM 실습 (4) 토픽모델링의 해석 / 의의와 한계 (1) | 2023.11.15 |
---|---|
STM 실습 (3) 토픽모델링 적용 (1) | 2023.11.15 |
STM 실습 (2) 데이터 가공 (0) | 2023.11.14 |
STM 실습 (1) 데이터 탐색 및 목표 설정 (1) | 2023.11.14 |
LDA modeling 실습 : 타다 금지법 기사 댓글 분석 (0) | 2023.11.05 |