- 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