CTM과 DTM으로 토픽 상관성과 시간 변화를 분석하는 방법
CTM과 DTM의 확률 구조, 추론 방식, 전처리와 튜닝, 운영 진단을 통해 토픽 상관성과 시계열 변화를 분석하는 방법
2026-08-14 · 최초 발행 2024-04-29
LDA의 독립 가정으로는 설명하기 어려운 데이터
LDA는 비정형 문서에서 주제를 추출하는 표준적인 방법이지만, 실제 데이터에서는 주제들이 독립적으로 나타나지 않고 시간에 따라 단어 분포도 바뀐다. 규제와 리스크처럼 함께 등장하는 주제, 분기나 월별로 부상과 퇴조를 반복하는 이슈가 그 예다.
Correlated Topic Models(CTM)는 주제 비중 사이의 상관 구조를 모델에 포함한다. Dynamic Topic Models(DTM)는 시점별 토픽-단어 분포가 점진적으로 변한다는 가정으로 시간축을 다룬다. 하나는 문서 내부의 연결을, 다른 하나는 말뭉치의 변화 과정을 설명하는 데 초점이 있다.
문서 안에서 함께 움직이는 주제를 다루는 CTM
CTM은 문서의 주제 비율 벡터에 로지스틱 정규(Logistic-Normal) 사전분포를 적용하는 확률적 토픽 모델이다. LDA의 디리클레 사전분포 대신 공분산을 가진 정규분포를 사용하므로, 주제 비중 사이의 양·음 상관관계를 표현할 수 있다.
변분추론에서는 라플라스 근사 등으로 비선형 항을 근사한다. 이 구조는 “규제”와 “리스크”처럼 같은 문서에서 공기되는 주제 묶음을 더 일관되게 포착하며, 해석 가능성과 다운스트림 분류·추천의 특성 표현력을 높인다.
문서 주제비율 θ는 로지스틱 정규로 모델링하고, 공분산 Σ가 주제 간 상관 구조를 나타낸다. Σ를 안정적으로 추정하려면 정규화와 스파스화 옵션을 검토할 수 있다. 다만 변분 EM과 라플라스 근사 기반 업데이트가 필요하므로 LDA보다 연산량이 커지고 초기화에도 민감하다.
시간축에서 토픽이 바뀌는 방식을 다루는 DTM
DTM은 시간에 따라 토픽-단어 분포가 변화하는 상태공간(State-space) 기반 토픽 모델이다. 각 시점의 주제 파라미터가 가우시안 랜덤워크로 진화한다고 가정하고, 문서를 시점별 묶음(time-slice)으로 나누어 추정한다.
주제 파라미터인 단어 로짓 βt는 β{t-1}에서 랜덤워크로 변화한다. 시점 사이의 스무딩은 데이터가 희소한 구간에서도 추정 안정성을 제공한다. 반면 시점 수와 주제 수가 늘어날수록 메모리와 시간 복잡도는 그 곱에 근비례해 증가한다. 추론은 시점별 변분 업데이트와 칼만 필터 유사 스무딩으로 진행된다.
이 모델은 트렌드 탐지, 개념 변이(semantic drift), 신조어의 등장과 퇴조를 분석하는 데 맞는다. 예측·알림형 분석 파이프라인에서도 활용할 수 있다.
학습 전에 정리할 데이터와 조정 지점
두 모델 모두 토큰화, 불용어 제거, 품사 필터링, n-gram 확장, 어휘 축소(min_df/최대 상위어 제거)가 필요하다. DTM에서는 문서에 타임스탬프를 부여하고, 시점 단위의 time-slice를 균형 있게 구성해야 한다. 표본이 적은 시점은 병합하거나 가중 처리한다.
기본적으로 조정하는 항목은 K(주제 수), α(문서-주제 농도), η(주제-단어 농도)다. CTM은 Σ 규제(대각선 우선, shrinkage)를, DTM은 시점 간 분산인 진화 분산을 추가로 조절한다. K를 그리드 탐색한 뒤 일관성(Coherence)과 과적합을 점검하고, Σ 안정성 또는 진화 분산을 조정한 후 운영 데이터에서 다시 평가하는 흐름으로 진행한다.
평가 단계에서는 토픽 일관성(C_v/C_npmi), Perplexity, 토픽 다양성, 시점별 드리프트 속도를 본다. 운영 중에는 변화점 탐지 기반의 드리프트 경보, 신조어 폭증 같은 노이즈 유입, 모델 재학습 간격 SLA를 함께 관리한다.
리포트, VOC, 기술 문서에서의 활용
금융 리서치와 리스크 리포트에서는 CTM으로 “시장 변동성–유동성”처럼 공기되는 주제 묶음을 찾아 리포트 클러스터링과 요약에 활용할 수 있다. DTM은 분기별 키워드 이동과 규제 이슈의 부상·퇴조 시점을 추적하는 데 적합하다.
고객 VOC와 콜센터 데이터에서는 “배송 지연–환불 요청–CS 불만”의 상관 주제를 통해 근본 원인을 찾을 수 있다. 주차 또는 월차 단위의 DTM 결과는 이슈 선행지표를 추출하고 조기 경보 룰과 연결하는 데 쓰인다.
기술 트렌드와 특허를 모니터링할 때는 CTM으로 “LLM–지식증류–경량화” 같은 기술 모듈의 결합을 파악하고, DTM으로 연도별 토픽 진화를 시각화해 투자·연구 로드맵을 구성할 수 있다.
CTM은 토픽 일관성(C_v)을 515%p 개선하는 효과가 제시되며, DTM은 드리프트 민감도 향상을 통해 변화 탐지 리드타임을 1030% 단축할 수 있다. 다운스트림 분류·추천에서는 AUC/F1 1~3%p 개선 사례도 다수 제시된다. 주제 해석력과 기획·리서치·운영 간 커뮤니케이션 효율을 높이고, 시계열 내러티브로 경영 의사결정 지원 품질을 높이는 효과도 기대할 수 있다.
CTM 퀵스타트(tomotopy)
사전 조건은 다음과 같다.
- Python 3.9+
- tomotopy >= 0.12.0 (CTM), gensim >= 4.3.0 (DTM), scikit-learn(전처리), nltk(토큰화, 선택)
- OS 무관, 메모리는 K×V×T 규모에 비례. 예시 데이터는 소형.
설치:
- pip install tomotopy gensim nltk scikit-learn
# Python 3.9+, tomotopy 0.12.0+
import tomotopy as tp
# 샘플 토큰화 데이터
docs = [
"credit risk regulation liquidity ratio",
"customer refund delivery delay complaint",
"neural network distillation quantization llm",
"market volatility liquidity risk stress test",
"shipment delay customer service escalation"
]
docs = [d.lower().split() for d in docs]
# CTM 모델 생성 및 학습
K = 5
mdl = tp.CTModel(k=K, tw=tp.TermWeight.IDF, min_cf=1, rm_top=0)
for d in docs:
mdl.add_doc(d)
for i in range(100):
mdl.train(1)
# 토픽별 상위 단어 출력
for k in range(K):
print(f"Topic {k}:", [w for w, _ in mdl.get_topic_words(k, top_n=8)])
# 문서-주제 비율
for i, d in enumerate(mdl.docs):
dist = mdl.get_document_topic_dist(i)
print(f"Doc {i} theta:", [round(x, 3) for x in dist])
# 주제 간 상관(상위 페어) 추정치
# tomotopy는 내부적으로 로지스틱 정규 공분산을 추정함. 아래는 유사도 기반 간단 출력 예시
corr = mdl.get_correlations() # tomotopy 0.12+ 제공
print("Top correlated topic pairs:", corr[:5])
실제 코퍼스에서는 min_cf, rm_top을 이용해 어휘를 정리해야 한다. 상관 출력 API의 명칭은 tomotopy 버전에 따라 다를 수 있으므로 해당 버전 문서를 확인한다.
DTM 퀵스타트(gensim LdaSeqModel)
# Python 3.9+, gensim 4.3.0+
from gensim.corpora import Dictionary
from gensim.models import LdaSeqModel
# 시점별 문서 묶음 예시 (t0, t1, t2)
texts_t0 = [
"credit risk regulation liquidity".split(),
"market volatility liquidity risk".split(),
]
texts_t1 = [
"customer refund delivery delay".split(),
"service complaint escalation".split(),
]
texts_t2 = [
"neural network distillation quantization".split(),
"llm parameter efficient fine tuning".split(),
]
texts_all = texts_t0 + texts_t1 + texts_t2
time_slices = [len(texts_t0), len(texts_t1), len(texts_t2)]
dictionary = Dictionary(texts_all)
corpus = [dictionary.doc2bow(t) for t in texts_all]
ldaseq = LdaSeqModel(
corpus=corpus, id2word=dictionary, time_slice=time_slices,
num_topics=5, passes=10, chunksize=100
)
# 시점별 토픽 상위 단어 확인
for t in range(len(time_slices)):
print(f"Time {t}")
topics = ldaseq.print_topics(time=t, num_topics=3, num_words=8)
for tid, terms in topics:
print(f" Topic {tid}: {terms}")
time_slices는 시점별 문서 수 배열이며 합은 전체 문서 수와 일치해야 한다. 시점별 데이터 불균형이 심하면 다운샘플 또는 가중치 적용으로 안정화한다.
학습부터 모니터링까지의 흐름
입력 데이터에서 타임스탬프가 빠졌다면 기본 시점을 할당하거나 문서를 제외하는 규칙이 필요하다. 길이가 극단적인 문서는 길이 클리핑 대상으로 둔다. 학습 과정에서 Perplexity 악화나 NaN으로 발산이 감지되면 학습률·초기화를 재시도하고 어휘 축소를 강화한다. 추론 중 OOV가 급증하면 어휘 업데이트 또는 미적용 정책을 명시하며, 시점 데이터가 부족하면 인접 시점을 병합한다.
CTM과 DTM을 선택할 때 보는 차이
| 항목 | CTM | DTM |
|---|---|---|
| 성능(일관성) | 공기 주제 포착으로 C_v 개선 경향 | 시점 스무딩으로 드리프트 대비 안정 |
| 확장성 | K·V 증가 시 Σ 추정 비용 부담 | T 증가 시 메모리/시간 선형 증가 |
| 일관성 | 주제 묶음 해석 용이 | 시간 축 내 서사적 일관성 확보 |
| 안정성 | 초기화·규제에 민감 | 저밀도 시점에 강함(스무딩 효과) |
| 운영 편의 | 상관 해석 대시보드 필요 | 시점 관리·재학습 스케줄 필요 |
CTM은 리스크-규제, 제품-리뷰처럼 상관이 강한 주제 도메인에 우선 적용하고, Σ의 shrinkage로 과적합을 막는다. DTM은 분기 또는 월 단위 시계열 말뭉치를 구성하고 시점 최소 문서 수를 확보한다. 경험상 시점별 문서 수는 ≥50~200으로 두며, 변화점 탐지와 연계한다.
공통으로 K는 소규모 파일럿에서 예를 들어 10, 20, 30을 스윕한 뒤 C_v와 토픽 다양성으로 선택한다. CTM은 공분산 추정 복잡성과 계산비용이 표현력의 대가가 된다. DTM은 시간적 일관성을 얻는 대신 스무딩이 급격한 변화 감지를 지연시킬 수 있다.
전처리에서는 불용어·어간화·n-gram 품질과 상위 빈도어 제거를 점검한다. K는 C_v 상승이 둔화되는 지점에서 고르며, 지나치게 큰 K는 중복 토픽을 늘린다. CTM에서는 Σ가 대각선 지배적인지 보고 상관이 과도하면 어휘 노이즈를 의심한다. DTM에서는 time_slices 불균형을 완화하고 진화 분산, 즉 스무딩 강도를 조절해 과적합과 과스무딩 사이의 균형을 맞춘다.