이전 포스팅에서 Correlated Topic Model을 통해서 뉴스 기사를 분석하고 주제 간의 상관관계를 뽑아낸 적이 있습니다. 최근 tomotopy에 CTM을 추가해서 누구나 쉽게 따라해볼 수 있게 된 김에 간단하게 따라해볼 수 있는 코드를 공유드립니다!
기본 코드는 tomotopy github의 예제코드(https://github.com/bab2min/tomotopy/blob/master/examples/ctm_network.py)와 동일하되, 전처리 부분만 한국어 전용으로 변경되었습니다.
분석이 잘 되었다면 최종적으로 생성된 topic_network.html 파일을 열어 결과물을 확인해보시면 됩니다.
네트워크를 그린 결과는 위와 같습니다. 노드(동그라미)는 각각의 주제를 나타내며 안에 들어가 있는 단어 3개는 상위 단어입니다. 상관계수가 상위 10% 안에 드는 경우 노드 사이에 선을 그어주었습니다. 선의 굵기는 상관계수의 크기를 나타냅니다. 마우스를 올리면 상관계수 값을 볼 수도 있습니다. 주제 간의 상관관계를 분석해야하는 경우가 있다면 CTM을 사용해보시기를 권합니다!
Kiwi로 한국어 문장 분리하기 (8) | 2021.12.23 |
---|---|
Lamon : 라틴어 품사 태거 개발기 (4) | 2020.10.20 |
범용적인 감정 분석(극성 분석)은 가능할까 (9) | 2020.07.08 |
[Python] tomotopy로 Correlated Topic Model 수행하고 시각화하기 (14) | 2020.06.09 |
[Python] tomotopy로 문헌별 토픽 비중 계산하기 (5) | 2019.12.01 |
Chrono-gram을 이용해 라틴어 고문헌 연대 추정하기 (3) | 2019.09.16 |
[토픽 모델링] 대량의 문헌을 주제에 따라 클러스터링해보기 (3) | 2019.07.10 |
댓글 영역
배려해주신 코드를 무심코 돌려 보았습니다. 그런데 토픽 내용이 매번 바뀌는것이 정상인가요?
매번 토픽모델이 바뀌어서 혼란스럽네요.. 약 200여개의 논문초록을 한줄씩 csv 화일에 저장하여 그데로 돌려보았더니 멈춤현상 등 아무것도 안나와 문헌등장횟수1, 출현빈도1, 상위5개 제외, 주제11개로 변경하고 베타샘플을 20으로 해보았더니 나름 의미 있는 데이터와 시각화가 되던데 문제는 매번 토픽뭉치 단어가 바뀌네요..제가 무언가 잘못한거죠?
초짜가 해서 그런듯...사실 gensim으로 해도 그러던데 제가 분명 무엇을 모르는지...힘들겠지만 올바른 방향지도 부탁드립니다.
만약 iteration을 충분히 수행했는데도 시행시마다 결과가 너무 많이 바뀐다면 하이퍼 파라미터 세팅이 잘못되어 제대로 수렴이 안된것일 수도 있으니 이를 확인해보시는 것도 필요합니다.
결과를 고정하시고 싶다면 seed를 주어 항상 동일한 랜덤값이 나오도록 하면 됩니다.
https://github.com/bab2min/tomotopy/blob/main/examples/lda_visualization.py#L50
위 링크에 나오는 50번째줄부터의 코드를 사용해봤는데 "* Not all rows (distributions) in doc_topic_dists sum to 1."이라는 validation error가 뜨네요..
CTM은 LDA모델이 아니라서 pyLDAvis로 시각화해보는 게 불가능한 걸까요?
51번째 줄에서 doc_topic_dists를 구한뒤
doc_topic_dists /= doc_topic_dists.sum(axis=1, keepdims=True) 로 전체 합이 1이 되도록 정규화해주시면 에러가 해결될듯 합니다.
corpus = tp.utils.Corpus(tokenizer=tp.utils.SimpleTokenizer())
# 입력 파일에는 한 줄에 문헌 하나씩이 들어가 있습니다.
corpus.process(open('입력 텍스트 파일.txt', encoding='utf-8'))
# 전처리한 코퍼스를 저장한다.
corpus.save('k.cps')
github 이슈에도 남겼는데, 혹시 HLDA는 시각화 할 수 있는 방법이 있을지 여쭤봅니다!
HLDA 올려주신 예제 활용해서, tmm 파일까지는 save했는데,
이후 어떻게 각 토픽들을 확인해야 하는지를 모르다보니, 활용을 못하고 있습니다 ㅠ
감사합니다!!!
자동으로 시각화하는 툴은 없는것 같구요 토픽별 단어 목록을 뽑으셔서 직접 그리시는게 오히려 제일 쉬워보입니다.
https://github.com/bab2min/tomotopy/issues/155 에도 답변드렸듯이 mdl.summary() 메소드를 이용하면 토픽의 계층 구조와 단어 목록을 뽑으실 수가 있습니다.
정말 감사합니다!!!
말씀해주신 것처럼
토픽의 계층 구조와 목록을 뽑아서
수동으로 시각화 해보겠습니다 :)
감사합니다!