상세 컨텐츠

본문 제목

[Python] tomotopy로 Correlated Topic Model 수행하고 시각화하기

프로그래밍/NLP

by 적분 ∫2tdt=t²+c 2020. 6. 9. 22:37

본문

이전 포스팅에서 Correlated Topic Model을 통해서 뉴스 기사를 분석하고 주제 간의 상관관계를 뽑아낸 적이 있습니다. 최근 tomotopy에 CTM을 추가해서 누구나 쉽게 따라해볼 수 있게 된 김에 간단하게 따라해볼 수 있는 코드를 공유드립니다!

기본 코드는 tomotopy github의 예제코드(https://github.com/bab2min/tomotopy/blob/master/examples/ctm_network.py)와 동일하되, 전처리 부분만 한국어 전용으로 변경되었습니다.


분석이 잘 되었다면 최종적으로 생성된 topic_network.html 파일을 열어 결과물을 확인해보시면 됩니다.

네트워크를 그린 결과는 위와 같습니다. 노드(동그라미)는 각각의 주제를 나타내며 안에 들어가 있는 단어 3개는 상위 단어입니다. 상관계수가 상위 10% 안에 드는 경우 노드 사이에 선을 그어주었습니다. 선의 굵기는 상관계수의 크기를 나타냅니다. 마우스를 올리면 상관계수 값을 볼 수도 있습니다. 주제 간의 상관관계를 분석해야하는 경우가 있다면 CTM을 사용해보시기를 권합니다!

관련글 더보기

댓글 영역

  • 프로필 사진
    2020.06.29 07:00 신고
    유익한 내용이네요. 잘 봤습니다.
  • 프로필 사진
    2020.09.04 07:01
    비밀댓글입니다
    • 프로필 사진
      2020.09.04 09:38 신고
      네 그렇게 하셔도 됩니다. Corpus는 나중에 편하게 재사용하기 위해 생성하는거구요 내부적으로는 add_doc으로 문서들이 입력되는거거든요.
  • 프로필 사진
    2020.11.09 21:36
    이분야 진정한 프로 이신 듯합니다.

    배려해주신 코드를 무심코 돌려 보았습니다. 그런데 토픽 내용이 매번 바뀌는것이 정상인가요?
    매번 토픽모델이 바뀌어서 혼란스럽네요.. 약 200여개의 논문초록을 한줄씩 csv 화일에 저장하여 그데로 돌려보았더니 멈춤현상 등 아무것도 안나와 문헌등장횟수1, 출현빈도1, 상위5개 제외, 주제11개로 변경하고 베타샘플을 20으로 해보았더니 나름 의미 있는 데이터와 시각화가 되던데 문제는 매번 토픽뭉치 단어가 바뀌네요..제가 무언가 잘못한거죠?
    초짜가 해서 그런듯...사실 gensim으로 해도 그러던데 제가 분명 무엇을 모르는지...힘들겠지만 올바른 방향지도 부탁드립니다.
    • 프로필 사진
      2020.11.09 21:50 신고
      네, 토픽 모델링은 확률적 추론을 하기 때문에 수행할때마다 결과가 달라집니다. 다만 iteration을 충분히 많이 돌리면, 특정 상태로 수렴하게 됩니다. (단 토픽이 등장하는 순서 정도는 바뀔수 있습니다. 이에 따라 시각화 결과도 달라질 수 있구요)
      만약 iteration을 충분히 수행했는데도 시행시마다 결과가 너무 많이 바뀐다면 하이퍼 파라미터 세팅이 잘못되어 제대로 수렴이 안된것일 수도 있으니 이를 확인해보시는 것도 필요합니다.
      결과를 고정하시고 싶다면 seed를 주어 항상 동일한 랜덤값이 나오도록 하면 됩니다.
  • 프로필 사진
    2021.01.23 20:20
    안녕하세요, 좋은 코드 감사드립니다. 혹시 CTM으로 뽑힌 topic들끼리의 distance와, topic을 이루는 단어들이 전체 token에서 몇퍼센트를 차지하는지 확인하고 싶어서 pyLDAvis를 사용해보고 싶은데요,
    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로 시각화해보는 게 불가능한 걸까요?
    • 프로필 사진
      2021.01.23 22:42 신고
      아뇨 가능한데요, 아마 연산 중의 오차로 doc_topic_dists의 총합이 정확히 1이 되지 않은게 문제로 보이네요.
      51번째 줄에서 doc_topic_dists를 구한뒤
      doc_topic_dists /= doc_topic_dists.sum(axis=1, keepdims=True) 로 전체 합이 1이 되도록 정규화해주시면 에러가 해결될듯 합니다.
  • 프로필 사진
    2021.03.10 21:42
    비밀댓글입니다
    • 프로필 사진
      2021.03.11 00:41 신고
      음, 그러면 아마 doc_topic_dists를 계산하는 부분에서 오류가 있을거 같은데요, 괜찮으시다면 제 메일(bab2min@gmail.com)로 코드와 데이터를 보내주시면 어느 부분에서 오류가 발생하는지 검토해서 수정 가능한거면 수정하도록 할게요.
  • 프로필 사진
    2021.07.08 17:01
    공백으로 구분되어 있는, 형태소 분석이 완료된 명사형 키워드를 메모장 형태로 가지고 있습니다. 이런 경우에는 어떻게 업로드를 시켜야 할까요? 코린이라 잘 모르겠어요..ㅠ