co-code 님의 블로그

LSA(Latent Semantic Analysis) 본문

python

LSA(Latent Semantic Analysis)

co-code 2026. 6. 4. 20:00
  • LSA ( Latent Semantic Analysis : 잠재 의미 분석)
    • 문서 안에서 단어 사이의 잠재적인 의미 구조를 추출하는 기법
    • TF-IDF 방식은 단어 간의 의미적 유사성을 반영하지 X
    • TF-IDF 방식에서 SVD(특이값 분해)를 단어 간의 의미를 파악
    • 차원 축소를 통해서 관계성을 확인
    • LSA효과
      • 벡터 공간의 차원을 줄여서 계산, 효율의 증가 (차원 축소)
      • '영화', '필름' 등 비슷한 문맥의 단어를 가까운 벡터로 이동 (의미 유추)
      • 문서들을 주제별로 분류 (토픽 분석)
    • TruncatedSVD (차원 축소 모델)
      • 절단된 특이값 분해
      • 고차원 희소행렬(값이 0인 행렬SA ( Latent Semantic Analysis : 잠재 의미 분석)
      • 문서 안에서 단어 사이의 잠재적인 의미 구조를 추출하는 기법
      • TF-IDF 방식은 단어 간의 의미적 유사성을 반영하지 X
      • TF-IDF 방식에서 SVD(특이값 분해)를 단어 간의 의미를 파악
      • 차원 축소를 통해서 관계성을 확인
      • LSA효과
      • 벡터 공간의 차원을 줄여서 계산, 효율의 증가 (차원 축소)
      • '영화', '필름' 등 비슷한 문맥의 단어를 가까운 벡터로 이동 (의미 유추)
      • 문서들을 주제별로 분류 (토픽 분석)
      • TruncatedSVD (차원 축소 모델)
      • 절단된 특이값 분해
      • 고차원 희소행렬(값이 0인 행렬)을 낮은 차원으로 압축하여 데이터의 구조적 의미를 유지
      • 자연어 처리, 추천 시스템, 의미 분서그 잠재적인 토픽 분석에서 주로 사용
      • TF-IDF 행렬은 고차원 -> 저차원
      • 0으로 이루어진 희소 행렬들을 구조적인 의미를 유지하면서 값들을 부여
      • 같은 토픽의 문서는 같은 벡터 공간에서 가깝개 위치 -> 유사도 기반 자연어 처리에서 활용
from sklearn.decomposition import TruncatedSVD
from konlpy.tag import Okt
okt = Okt()
def tokenize(text):
    result = []
    for word, pos in okt.pos(text):
        if pos in ['Noun', 'Adjective', 'Verb']:
            result.append(word)
    return result
docs=[
    '이 영화가 정말 재미있었다.',
    '이 영화 별로다.',
    '배우의 연기가 뛰어났다.',
    '지루한 영화는 보기 어렵다',
    '정말 훌륭한 연기였다',
    '연기가 별로라서 지루했다'
]
tfidf = TfidfVectorizer(
    tokenizer=tokenize, 
    ngram_range= (1,1), 
    min_df=1, 
    max_df=0.8, 
    lowercase=False
)
X_tfidf=tfidf.fit_transform(docs)

X_tfidf.shape
>>> (6, 14)

 


#차원 축소
lsa=TruncatedSVD(n_components=2, random_state=42)
X_lsa=lsa.fit_transform(X_tfidf)

df_lsa=pd.DataFrame(X_lsa, columns=['topic1','topic2'])
df_lsa


df_lsa['doucment']=docs
df_lsa


features=tfidf.get_feature_names_out()
features
>>> array(['뛰어났다', '배우', '별로', '보기', '어렵다', '연기', '였다', '영화', '이', '재미있었다',
       '정말', '지루한', '지루했다', '훌륭한'], dtype=object)

components=lsa.components_

print(components)
print('-'*60)
print(components.shape)
>>>	[[ 2.78580010e-02  3.50174274e-02  1.34691193e-03 ...  2.27806351e-03
   	1.79250990e-03  9.76074462e-04]
 	[-2.89788616e-02 -2.83608092e-02 -2.59746733e-03 ... -2.92130616e-03
   	5.55172509e-04 -3.70315576e-03]
 	[-1.79101771e-02 -4.70370496e-02 -1.76423643e-03 ... -4.55112680e-03
  	-2.90204067e-04  1.33176455e-02]
 	...
 	[-2.70648135e-02 -2.03094338e-02  8.93329465e-04 ... -3.33561364e-04
  	-7.18428897e-03 -7.26483112e-03]
 	[ 1.04393047e-02 -8.73767705e-03  3.90651787e-03 ... -4.53754144e-03
   	5.00904557e-03  2.59149477e-03]
 	[ 2.65958640e-02 -8.49798229e-05  5.88085281e-03 ... -3.14770122e-03
  	-5.33492881e-03  2.34336254e-02]]
	------------------------------------------------------------
	(200, 4730)

pd.DataFrame(components, index=['topic1','topic2'], columns=features).T

 

'python' 카테고리의 다른 글

Doc2Vec  (0) 2026.06.11
Word2Vec, FastText  (0) 2026.06.10
TF-IDF(Term Frequency-Inverse Document Frequency)  (0) 2026.06.02
RNN(순환 신경망 : Recurrent Neural Network), LSTM  (0) 2026.05.27
군집 분석  (0) 2026.05.19