데이터 분석/키워드 분석

[이론] 벡터화

toraa 2025. 1. 21. 15:20

one-hot 인코딩 : 배열이 너무 길어지고 효율성이 떨어져서 임베딩 기법 사용

 

1. 빈도 벡터화

단어를 의미하는 단어 벡터가 아닌, 하나의 문장을 의미

sklearn에서 제공하는 counvectorizer 객체 사용

from sklearn.feature_extraction.text import CountVectorizer 
import pandas as pd

df = pd.read_csv('./data/sentence2_tag.csv').dropna()

## max_df : 해당 확률 이상으로 빈도가 많은 토큰을 제외
#내가 설정한 빈도 이상으로 등장하는 토큰 제외
## min_df: 해당 확률 이하로 빈도가 적은 토큰을 제외
#내가 설정한 빈도 이하로 등장하는 토큰 제외
cvec = CountVectorizer(max_df=0.9, min_df=10) #인스턴스 가져옴
cvec.fit(df['text_tag']) # 토큰생성 (띄어쓰기 기반) / fit시켜줌
#여기 들어가는 df[]구조는 문장단위로 문장이 여러개 들어있는 리스트가 들어가야 함
#문장 하나가 벡터로 변환됨
names = cvec.vocabulary_ # vocabulary 변수에 접근하여 토큰셋 확인
print(len(names))
print(names)


결과) 1891개의 토큰이 나옴
X = cvec.transform(df.loc[:100,'text_tag']) # 인코딩
x = X.toarray()
#toarray로 만들어서 넣어줌
x.shape


(101, 1891)
# (샘플갯수(문장갯수), 총 단어의 갯수(벡터의 수, 즉 토큰갯수))
import numpy as np

np.sum(x, axis = 0)[812]

배열에서 sum함수를 이용해서 쭉 더해줌

→ 내가 가지고있는 토큰에 대한 전체 빈도수를 알 수 있음

자주 등장하는 키워들은 높은 숫자가 나옴

 

특정 키워드

names['선물']

812

선물은 812가 키값임을 알수 있음

선물의 인덱스 가져옴

import numpy as np

np.sum(x, axis = 0)[812]

16

총 16번 나옴

 

2. TF-IDF 벡터화

특정토큰(단어)의 중요도를 나타내는 수치

1에 가까울수록 중요

TF(단어빈도) X IDF(역문서빈도)

from sklearn.feature_extraction.text import TfidfVectorizer #tfid

tfvec = TfidfVectorizer(max_df=0.9, min_df=10)
tfvec.fit(df['text_tag']) # fit함수로 텍스트 뭉치 넣어줌 /토큰생성 (띄어쓰기 기반)
names = tfvec.vocabulary_ # 토큰셋 확인
print(len(names))
print(names)
X = tfvec.transform(df.loc[:5,'text_tag']) # 인코딩
x = X.toarray()
print(x.shape)
print(x[0])

빈도가 아닌, 0과1사이의 Tf-IDF값이 출력

x[3,812]


0.20958416714400754
import pandas as pd

store_df = pd.read_csv('./data/sentence2_test.csv')
store_df

mean으로 TF-IDF를 더 중요시한 접근