bab2min / tomotopy

Python package of Tomoto, the Topic Modeling Tool
https://bab2min.github.io/tomotopy
MIT License
548 stars 62 forks source link

DTM 모델의 토픽넘버링과 관련하여 문의드립니다. #178

Open tkddnd0214 opened 1 year ago

tkddnd0214 commented 1 year ago

안녕하십니까 tomotopy의 dtm모델을 돌리다가 문의사항이 있어 글을 올립니다.

모델을 훈련시킨 후, 훈련에 사용된 문서들이 어느 토픽에 분류가 되었는지 확인하고자 DTModel.docs[i].get_topics를 활용하여 각 문서가 어떤 토픽으로 분류가 되었는지 확인하였습니다.

그 이후, tomotopy.label와 DTModel.get_topic_words를 이용하여 각 토픽에 대해 자동라벨링과 각 시점 별 토픽에 포함되는 단어들을 확인해 보았는데요.

이때 DTModel.docs[i].get_topics을 사용했을 때 나오는 토픽 넘버링과 tomotopy.label와 DTModel.get_topic_words를 이용했을 때 나오는 토픽 넘버링이 다르게 되는 것 같아 해당 사항에 대해 확인하고 싶어 연락드립니다. (ex. DTModel.docs[i].get_topics 에서의 0번 토픽 -> tomotopy.label와 DTModel.get_topic_words의 2번 토픽 DTModel.docs[i].get_topics 에서의 1번 토픽 -> tomotopy.label와 DTModel.get_topic_words의 13번 토픽 등)

DTModel.docs[i].get_topics을 사용했을 때 나오는 토픽 넘버링과 tomotopy.label와 DTModel.get_topic_words를 이용했을 때 나오는 토픽 넘버링이 일치하는 것인지, 일치하지 않다면 코드를 조정하여 일치시킬 방안이 있는지 문의드립니다.

ps. 추가로 DTModel의 결과물로 각 시점에 대해 gensim 패키지의 pyLDAvis 시각화를 할 수 있는지 문의드립니다.

bab2min commented 1 year ago

안녕하세요 @tkddnd0214 docs[i].get_topics는 i번째 doc에 포함된 상위 n개(주로 10개) 토픽 분포를 보여줍니다. DTModel.get_topic_words는 지정한 토픽의 상위 n개(주로 10개)의 단어 분포를 보여주고요. 애초에 전자는 상위 토픽을 보여주고 후자는 상위 단어를 보여주는 것이라 비교대상이 아닐거 같은데요. https://github.com/bab2min/tomotopy/blob/main/examples/dtm.py examples 폴더에 있는 예시 코드의 결과로 예를 들자면,

>>> mdl.docs[0].get_words() # 0번 doc이 가지고 있는 단어 분포. 
[('block', 0.06128782033920288), ('build', 0.0597362294793129), ('experi', 0.03258339688181877), ('neural', 0.02172226458787918), ('network', 0.020170675590634346), ('simul', 0.012412723153829575), ('structur', 0.011636927723884583), ('user', 0.011636927723884583), ('nontermin', 0.010085337795317173), ('provid', 0.010085337795317173)]
# neural network simulation과 관련된 문서인듯합니다.

>>>  mdl.docs[0].get_topics() # 0번 doc이 가지고 있는 토픽 분포
[(4, 0.8371965289115906), (0, 0.02513703890144825), (7, 0.024353954941034317), (9, 0.02200469933450222), (6, 0.01887235790491104), (3, 0.016523100435733795), (2, 0.01495693065226078), (8, 0.01495693065226078), (5, 0.014173844829201698), (1, 0.011824589222669601)]

# 4번 토픽이 대부분을 차지하고 있는 것을 볼 수 있음

>>> mdl.docs[0].timepoint # 0번 doc의 timepoint는 5
5

>>> mdl.get_topic_words(4, timepoint=5) # 토픽 4번의 timpoint=5일때의 단어 분포를 보면 다음과 같습니다
[('network', 0.028920229524374008), ('learn', 0.01488775946199894), ('train', 0.010986631736159325), ('neural', 0.008942276239395142), ('input', 0.006898850202560425), ('unit', 0.006708481349050999), ('model', 0.006247314158827066), ('weight', 0.005994639825075865), ('task', 0.0059022968634963036), ('system', 0.005719301290810108)]
# 이 토픽은 아마 neural network training과 관련된 단어들이 모여있는 토픽인듯하네요.

보시다시피 get_topics()으로 doc 0의 상위 토픽은 #4임을 알아낼 수 있었고, #4가 실제로 어떤 내용을 나타내는지를 get_topic_words()로 조회해보면, neural network training과 관련된 주제임을 알 수 있었습니다. 그리고 doc 0의 실제 내용을 보니 이와 일치하는 것도 확인할 수 있었구요. 토픽 넘버링이 다르게 된다는게 어떤 의미인지 잘 모르겠는데, 이에 대해서 자세히 설명해주시면 확인해보도록 하겠습니다~

그리고 두번째로 질문해주신 pyLDAvis를 이용한 DTM 모델 시각화는, timepoint별로 모델을 나눠서 시각화하면 가능할거 같네요. 다음 예제 코드에 시각화 관련 코드를 추가했으니 참고하시면 되겠습니다. https://github.com/bab2min/tomotopy/blob/073c44334a0141e4831ede575ad66b26343ff81d/examples/dtm.py#L44-L61