Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
tkddnd0214 opened this issue Jul 26, 2022 · 1 comment
Open
Labels
question Further information is requested

Comments

@tkddnd0214
Copy link

안녕하십니까
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 bab2min added the question Further information is requested label Aug 7, 2022
@bab2min
Copy link
Owner

bab2min commented Aug 7, 2022

안녕하세요 @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별로 모델을 나눠서 시각화하면 가능할거 같네요. 다음 예제 코드에 시각화 관련 코드를 추가했으니 참고하시면 되겠습니다.

tomotopy/examples/dtm.py

Lines 44 to 61 in 073c443

for timepoint in range(mdl.num_timepoints):
topic_term_dists = np.stack([mdl.get_topic_word_dist(k, timepoint=timepoint) for k in range(mdl.k)])
doc_topic_dists = np.stack([doc.get_topic_dist() for doc in mdl.docs if doc.timepoint == timepoint])
doc_topic_dists /= doc_topic_dists.sum(axis=1, keepdims=True)
doc_lengths = np.array([len(doc.words) for doc in mdl.docs if doc.timepoint == timepoint])
vocab = list(mdl.used_vocabs)
term_frequency = mdl.used_vocab_freq
prepared_data = pyLDAvis.prepare(
topic_term_dists,
doc_topic_dists,
doc_lengths,
vocab,
term_frequency,
start_index=0,
sort_topics=False
)
pyLDAvis.save_html(prepared_data, 'dtmvis_{}.html'.format(timepoint))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants