Skip to content

NMF

전처리는 토픽 모델링을 위한 전처리를 참조

SVD로 스크리 플롯

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=100, random_state=1234)
svd.fit(dtm)

스크리 플롯

import matplotlib.pyplot as plt
plt.plot(svd.explained_variance_)

NMF

from sklearn.decomposition import NMF
NUM_TOPICS = 14
nmf = NMF(n_components=NUM_TOPICS)
doc_emb = nmf.fit_transform(dtm)

단어 임베딩

word_emb = nmf.components_.T

words = cv.get_feature_names_out().tolist()
i = words.index('모발')

plt.plot(word_emb[i])

코사인 유사도

from sklearn.metrics.pairwise import cosine_similarity
sim = cosine_similarity(word_emb)


import numpy as np
s = np.argsort(sim[i])
related = s[-2:-12:-1]
for j in related:
    print(words[j])

시각화

다차원 척도법

indices = []
target = ['모발', '손상', '두피', '모공',
          '용기', '내용물']
for w in target:
    i = words.index(w)
    indices.append(i)
    print(w, i)

dist = 1 - sim[indices, ][:, indices]

from sklearn.manifold import MDS
mds = MDS(dissimilarity='precomputed', random_state=1234)
pos = mds.fit_transform(dist)

plot에서 글자가 겹치지 않도록 조정해주는 adjustText

!pip install adjusttext
from adjustText import adjust_text
plt.plot(pos[:, 0], pos[:, 1], '.')
texts = [plt.text(pos[i, 0], pos[i, 1], w) for i, w in enumerate(target)]
adjust_text(texts)

토픽별 관련 단어 보기

for t in range(NUM_TOPICS):
    print(t)
    topic_words_idx = np.argsort(word_emb[:, t])

    for j in topic_words_idx[-1:-11:-1]:
        print(words[j])

문서별 토픽 보기

0번 문서

doc_id = 0
df.iloc[doc_id]

0번 문서 토픽 보기

plt.plot(doc_emb[doc_id])

0번 문서에서 가장 강한 토픽

topic_id = np.argmax(doc_emb[doc_id])
topic_id

해당 토픽의 문서 보기

topic_docs_idx = np.argsort(doc_emb[:,topic_id])[-1:-11:-1]
df.iloc[topic_docs_idx]

토픽 패턴이 가장 비슷한 문서 찾기

sims = cosine_similarity(doc_emb[[doc_id]], doc_emb).flatten()
sim_idx = np.argsort(sims)[-1:-11:-1]
df.iloc[sim_idx]

유사도 보기

sims[sim_idx]