2024-01-08 77th Class
Vectorization
#️⃣ 벡터란
벡터는 크기와 방향을 가진 양
수학과 물리학에서 널리 사용되며, 다차원 공간에서의 점이나 이동을 나타낼 때 사용
컴퓨터 과학에서는 데이터의 배열이나 목록으로 벡터를 표현
예를 들어, 2차원 벡터는 [x, y] 형태로, 3차원 벡터는 [x, y, z] 형태로 표현
벡터로 표현 하면 공간상에 위치하게 되어서 가까운 벡터와 먼벡터와 같이 벡터간의 거리를 계산 가능
벡터 거리
- 유클리디안 거리 : 유클리디안 거리는 가장 기본적인 거리 측정 방법으로, 두 점 사이의 “직선” 거리를 계산. 2차원에서는 피타고라스 정리를 사용하여 계산 가능
- 자카드 거리 : 자카드 거리는 두 집합 간의 유사성과 다양성을 측정하는 방법. 이는 자카드 유사도의 보완으로, 1에서 자카드 유사도를 뺀 값. 주로 집합 간의 유사성을 측정할 때 사용
- 해밍 거리 :해밍 거리는 두 문자열이 얼마나 다른지를 측정하는 데 사용. 이는 같은 길이의 두 문자열 간에 서로 다른 위치의 문자 개수로 정의. 특히, 바이너리 데이터의 오류를 찾는 데 유용함
- 코사인 유사도 : 코사인 유사도는 두 벡터 간의 코사인 각도를 이용하여 유사성을 측정. 이는 방향성이 중요할 때 사용되며, 벡터의 크기보다는 방향에 더 중점. 텍스트 데이터의 유사성을 비교할 때 자주 사용
#️⃣ 빈도 방식 벡터화 방법
[1] 원핫인코딩 (One-Hot Encoding)
- 단어에 인덱스 할당:
- 나는 = 0
- 커피를 = 1
- 마신다 = 2
- 그녀는 = 3
- 차를 = 4
- 원-핫 벡터 표현:
- “나는” → [1, 0, 0, 0, 0]
- “커피를” → [0, 1, 0, 0, 0]
- “마신다” → [0, 0, 1, 0, 0]
- “그녀는” → [0, 0, 0, 1, 0]
- “차를” → [0, 0, 0, 0, 1]
[2] Bag of Words (BoW)
Bag of Words (BoW) 모델은 텍스트 데이터를 수치적으로 표현하는 가장 기본적인 방법 중 하나
핵심 아이디어는 문서 내의 단어들을 그 순서나 문맥과 상관없이 빈도수에 따라 표현하는 것
#️⃣ 빈도 방식의 한계
- 문맥 무시: 단어의 순서와 문맥을 무시하기 때문에 문장의 실제 의미를 완전히 포착하지 못함
- 높은 차원: 매우 많은 단어를 포함하는 큰 어휘집을 가진 경우, 벡터 표현이 매우 커짐
- 빈도 중심: 자주 등장하지 않는 중요한 단어는 무시될 수 있으며, 자주 등장하지만 중요하지 않은 단어(예: 조사, 관사)가 과도하게 강조될 수 있음
#️⃣ TF-IDF (Term Frequency-Inverse Document Frequency)
TF-IDF는 단어의 빈도(TF)와 그 단어가 얼마나 많은 문서에 걸쳐 나타 나는지를 반영하는 역문서 빈도(IDF)를 결합한 방법
그래서 문서 내에서 중요한 단어에 더 높은 가중치를 부여해서 문맥을 강조할 수 있음
계산 식
실제 계산에서는 0으로 나누어 주는 것을 방지하기 위해서 분모에 1을 더해준 값을 사용
#️⃣ N-gram
N-gram은 연속된 'N’개의 아이템(주로 단어나 문자)을 하나의 시퀀스로 취급하는 방법
예를 들어, "The quick brown fox"라는 문장에서:
- Unigrams (N=1): “The”, “quick”, “brown”, “fox”
- Bigrams (N=2): “The quick”, “quick brown”, “brown fox”
- Trigrams (N=3): “The quick brown”, “quick brown fox”
N이 증가함에 따라 시퀀스는 더 긴 문맥 정보를 포함
n-gram 활용
- 자연어 처리 : 다음 단어나 문자의 확률을 예측하는 데 사용
- 텍스트 분류: 특정 키워드 조합의 빈도를 분석하여 텍스트를 분류하는 데 도움 됨
- 정보 검색: 검색 엔진에서 특정 단어 조합의 존재 여부를 파악하는 데 활용
**#️⃣벡터화 장단점
구분 | 장점 | 단점 |
---|---|---|
원-핫 인코딩 | 1. 구현이 간단하다. 2. 명확하게 구분된다. | 1. 말뭉치가 커지면 거질 수록 벡터의 차원이 커짐. 2. 각 벡터가 독립적으로, 관계를 표현 할 수 없음 |
Bag of Words | 1. 구현이 간단하다. 2. 명확하게 구분된다. | 1. 문장의 의미를 완전히 파악하는 데 한계가 있음 2. 대부분의 값이 0. 대부분의 벡터가 희소(sparse)할 수 있음 |
TF-IDF | 1. 단어의 중요도를 더 잘 포착 | 1. 대부분의 값이 0. 대부분의 벡터가 희소(sparse)할 수 있음. 2. 단어의 순서나 문맥을 고려하지 않음. |
n-gram | 1. 문맥과 단어 순서를 고려할 수 있어서 의미나 구조를 포착할 수 있다. | 1. N의 값이 커질수록 필요한 저장 공간과 계산량이 급격히 증가 2. 대부분의 값이 0. 대부분의 벡터가 희소(sparse). (n값이 높은 경우) 3. 적절한 n값을 선택하는 게 어려움 |
유사도 (Similarity)
#️⃣코사인 유사도 (Cosine Similarity)
두 벡터가 완전히 반대방향이면 -1, 90도의 각을 이루면 0, 완전히 같을 경우 1의 값을 가짐
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 예제 텍스트 데이터
text1 = "I love reading books"
text2 = "I enjoy books and magazines"
# TF-IDF 벡터라이저 초기화 및 텍스트 데이터에 적용
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([text1, text2])
# 코사인 유사도 계산
cosine_sim = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
print(f"Cosine Similarity: {cosine_sim[0][0]}")
'''
Cosine Similarity: 0.1707761131901165
'''
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 매우 비슷한 두 문장
text1 = "The weather today is sunny and pleasant"
text2 = "Today's weather is pleasant and sunny"
# TF-IDF 벡터라이저 초기화 및 텍스트 데이터에 적용
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([text1, text2])
# 코사인 유사도 계산
cosine_sim = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print(f"Cosine Similarity: {cosine_sim[0][0]}")
'''
Cosine Similarity: 0.8673636849609287
'''
자카드 유사도 (Jaccard Similarity)
실무에서 boolean 이면 cosine similarity가 어려움
따라서 Jacard Similarity 사용
# define two sets
set1 = {'dog', 'cat', 'bird'}
set2 = {'dog', 'cat', 'fish'}
# find intersection and union
intersection = set1.intersection(set2)
union = set1.union(set2)
print(intersection)
print(union)
'''
{'dog', 'cat'} {'bird', 'dog', 'fish', 'cat'}
'''
# calculate Jaccard similarity
jaccard_sim = len(intersection) / len(union)
print(jaccard_sim) # 0.5
차원축소 (Dimensional Reduction)
#️⃣ 차원 축소
차원 축소는 데이터의 차원을 줄이는 과정으로, 주로 고차원 데이터를 처리할 때 사용됨.
고차원 데이터는 종종 '차원의 저주’라고 불리는 문제를 야기하는데, 이는 데이터 포인트들이 고차원 공간에서 너무 멀리 떨어져 있어, 데이터 분석이나 기계학습에 어려움을 주는 현상
차원 축소는 이러한 문제를 해결하고 데이터의 해석을 용이하게 하기 위해 사용
종류
- 주성분 분석 (PCA, Principal Component Analysis): 가장 널리 사용되는 선형 차원 축소 방법. 데이터의 분산을 최대로 보존하는 주성분들을 찾아 차원을 축소
- Truncated SVD (Singular Value Decomposition): 희소 행렬에 적용 가능한 방법. 주요 특이값과 해당하는 특이 벡터를 사용하여 차원을 축소 주로 텍스트 데이터와 같은 고차원 희소 데이터 처리에 사용됨
- t-SNE (t-Distributed Stochastic Neighbor Embedding): 고차원 공간에서 가까운 점들을 저차원 공간에서도 가까이 배치하는 비선형 방법. 주로 시각화에 사용 됨
PCA
Step 1: 분산이 가장 큰 방향을 찾기. (성분 1)
- 가장 큰 분산은 가장 많은 정보를 담고 있음
- 다차원 데이터를 적은 수의 주성분으로 표현함으로써 차원을 축소하는데 사용 -> 정보 손실을 최소화
Step 2: 성분 1과 직각인 방향 중에서 가장 많은 정보를 담은 방향을 찾기
- 주성분은 서로 독립적이고 중복정보가 최소화된 방향으로 데이터 투영
- 데이터의 상관성을 최소화
Step 3: 고윳값 본해
PCA는 고유값 분해를 통해 주성분을 찾음. 이때, 고유값이 큰 고유벡터가 가장 큰 분산을 나타내며, 이 방향이 가장 중요한 주성분
# 1. 데이터불러오기
import pandas as pd
from sklearn.decomposition import PCA
import seaborn as sns
breast_cancer = pd.read_csv(
'https://raw.githubusercontent.com/jin0choi1216/dataset/main/breast_cancer.csv', index_col = 0)
breast_cancer.head()
breast_cancer.shape # (569, 31)
X = breast_cancer.drop('class', axis = 1)
y = breast_cancer['class']
# PCA
pca = PCA(n_components=2) # n_components : 축소할 차원의 개수
X_pca = pca.fit_transform(X)
print(f'스케일 변환 전 : {X.shape}') # 스케일 변환 전 : (569, 30)
print(f'스케일 변환 후 : {X_pca.shape}') # 스케일 변환 후 : (569, 2)
df = pd.DataFrame(X_pca, columns = ['com1', 'com2'])
df2 = pd.concat([df, y], axis = 1)
df2.head()
# 주성분 분석한 결과를 시각화
sns.scatterplot(data = df2, x = 'com1', y = 'com2', hue = 'class')
# 주성분이 가지고 있는 columne의 특징(feature)의 정보양 시각화
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize = (15,5))
sns.heatmap(components)
plt.xticks(np.arange(0.5, len(X.columns), 1), X.columns, rotation = 90)
plt.yticks([0.5, 1.5], ['com1', 'com2'])
plt.show()
Word Embedding
#️⃣ 워드 임베딩이란
단어를 고차원 공간에 밀집된 벡터로 표현
각 단어의 의미론적, 문법적 관계를 고려하여 비슷한 단어들이 비슷한 벡터 값을 갖도록 함
워드 임베딩의 특징
- 고차원 벡터 표현: 각 단어는 고차원 공간(예: 100~300차원)에서 하나의 점으로 표현
- 의미적 유사성: 비슷한 의미를 가진 단어들이 벡터 공간에서 서로 가까이 위치하도록 함. 예를 들어, "왕"과 “여왕”, "고양이"와 "강아지"와 같은 단어들은 서로 가까운 벡터를 가짐
- 문맥 학습: 단어의 문맥을 고려하여 학습. 이는 단어의 의미가 주변 단어에 의해 부분적으로 결정된다는 가정에 기반함
임베딩
- Word2Vec (Google): 주변에 사용된 이웃 단어가 비슷한 단어들이 비슷한 숫자 정보, 벡터 값을 갖게 한다는 아이디어. 문맥 내의 단어들을 기반으로 단어의 벡터를 학습. 두 가지 주요 아키텍처인 CBOW(Continuous Bag of Words)와 Skip-Gram을 사용
예를 들어 - 나는 어제 사과를 먹었다. - 나는 어제 국수를 먹었다. - 나는 강아지를 보았다. - 나는 구름을 보았다.
라고 할 때 ‘사과’라는 단어는 ‘국수’라는 단어가 벡터값이 유사하고, ‘강아지’와 ‘구름’의 벡터 값이 유사
- CBOW: 문맥 내의 주변 단어들을 사용해 타깃 단어를 예측
- Skip-Gram: 중심 단어를 기반으로 주변 단어들을 예측. Skip-Gram은 특히 적은 데이터에서 잘 작동하며, 더 많은 차원에서 더 정확한 결과를 제공
- GloVe (Stanford University): 전체 코퍼스에서 단어들 간의 공동 출현 빈도를 기반으로 벡터를 학습. 이는 Word2Vec과 다르게, 전역적인 통계 정보를 사용
- FastText (Facebook): Word2Vec과 유사하지만, 개별 단어 대신에 단어를 구성하는 n-gram의 시퀀스를 사용. 이를 통해 미등록 단어나 오타가 있는 단어에 대해 더 강력한 벡터 표현을 생성. Word2Vec의 Skip-Gram을 확장한 방법
Word2Vec 예시
예시 문장 데이터
- “고양이는 정말 귀엽다.”
- “개는 충성심이 깊은 동물이다.”
- “고양이와 개는 인기 있는 애완동물이다.”
Word2Vec 모델 학습
- 이 문장들을 기반으로 Word2Vec 모델을 학습. 학습 과정에서 모델은 각 단어의 문맥을 고려하여 벡터를 생성. 예를 들어, "고양이"라는 단어 주변에는 “귀엽다”, "애완동물"과 같은 단어들이 자주 등장
임베딩 결과
- 학습 후, 각 단어는 고차원 공간에서의 벡터로 표현
- "고양이"는 [0.2, -0.4, 0.7, …] 와 같은 벡터
- "개"는 [0.1, -0.3, 0.6, …] 와 같은 벡터
- "애완동물"은 [0.3, -0.2, 0.5, …] 와 같은 벡터
벡터 분석
- 벡터의 유사성: "고양이"와 "개"의 벡터는 서로 유사할 가능성이 높음. 두 단어가 비슷한 문맥에서 사용되기 때문 이 유사성은 벡터 간의 거리나 각도로 측정될 수 있습니다.
- 문맥 반영: "고양이"와 "귀엽다"의 벡터도 어느 정도 유사성을 보일 것. 이는 "고양이"라는 단어가 "귀엽다"라는 문맥에서 자주 나타나기 때문
- 단어 유사도 계산: 이러한 벡터를 사용하여 단어 간의 유사도를 계산 가능. 예를 들어, "고양이"와 "개"의 유사도는 "고양이"와 "차"의 유사도보다 높게 나올 것
#️⃣ Vectorization vs Word Embedding
특성 | 벡터화(Vectorization) | 워드 임베딩(Word Embedding) |
---|---|---|
정의 | 텍스트 데이터를 수치적 형태로 변환하는 과정 | 각 단어를 고차원 공간에서의 벡터로 표현하는 기술 |
목적 | 텍스트를 분석 가능한 형태로 변환 | 단어 간의 의미적 관계를 고차원 공간에서 표현 |
기술 예시 | Bag of Words, TF-IDF | Word2Vec, GloVe |
특징 | 단어의 출현 빈도에 집중, 문맥 무시 | 문맥 고려, 의미적 유사성 반영 |
장점 | 구현이 간단하고 이해하기 쉬움 | 단어의 의미적 관계를 포착하여 더 풍부한 정보 제공 |
단점 | 문맥과 의미적 뉘앙스를 놓침 | 계산 복잡도가 높고, 구현이 더 복잡할 수 있음 |
'Education > 새싹 TIL' 카테고리의 다른 글
새싹 AI데이터엔지니어 핀테커스 17주차 (수) - PJT 1 Cosmetic Recsys System with Chatbot Plans (0) | 2024.01.11 |
---|---|
새싹 AI데이터엔지니어 핀테커스 17주차 (화) - Word2Vec (1) | 2024.01.09 |
새싹 AI데이터엔지니어 핀테커스 16주차 (금) - NLP & Tokenizer & Regex (1) | 2024.01.05 |
새싹 AI데이터엔지니어 핀테커스 16주차 (목) - LSTM Pytorch (1) | 2024.01.04 |
새싹 AI데이터엔지니어 핀테커스 16주차 (수) - Transfer Learning & RNN, LSTM, GRU (1) | 2024.01.03 |