본문 바로가기

DATA SCIENCE/NLP

[NLP] 잠재 의미 분석 (LSA)

이 포스트는 책 '한국어 임베딩(자연어 처리 모델의 성능을 높이는 핵심 비결 Word2Vec에서 ELMo, BERT까지, 이기창 저)'을 기반으로 작성되었습니다.

잠재 의미 분석 (LSA : Latent Semantic Analysis)이란, 특이값 분해를 통해 단어-문서 행렬, TF-IDF 등의 행렬 차원 수를 줄이고 잠재적 의미를 이끌어내는 방법론이다. 단어-문서 행렬 등에 잠재 의미 분석을 하여 나온 결과를 워드 임베딩으로 사용할 수 있다.

특이값 분해

특이값 분해 (SVD : Singular Value Decomposition)이란 행렬을 직교 행렬들과 대각 행렬로 분해하는 것을 말하며, 아래와 같이 나타난다. U와 V는 각각 AA^T와 A^TA를 고유값 분해하여 얻어진 행렬이며, Σ의 대각성분을 특이값이라고 한다.

특이값 분해 (SVD)

절단된 특이값 분해 (truncated SVD)는 특이값 중 가장 큰 d개를 골라, 이 특이값에 대응하는 특이 벡터로 원래 행렬을 근사하는 방법이다.

절단된 특이값 분해 (truncated SVD)

이를 임베딩에 대입하여 생각해보자.
m개 단어와 n개 문서로 구성된 단어-문서 행렬에 LSA를 수행하여 truncated SVD를 적용했다면,
U'는 단어 임베딩, V'는 문서 임베딩에 해당한다.
즉, truncated SVD를 통해 n, m차원에서 d차원으로 축소시킨 것이다.

 

Python 코드

from sklearn.decomposition import TruncatedSVD
from sonlpy.vectorizer import sent_to_word_contexts_matrix

corpus = [sent.replace('\n','').strip() for sent in open(file, 'r').readlines()]
input_matrix, index2voca = sent_to_word_contexts_matrix(corpus, windows=3, min_tf=10, dynamic_weight=True, verbose=True)

svd = TruncatedSVD(n_components=100)
vectors = svd.fit_transform(input_matrix)

 

반응형