One-Hot Encoding | Cosine Similarity | Word embedding

2024. 8. 11. 13:53AI/NLP 자연어 처리

반응형

 

 

 

 

 

 

 

 

자연어 처리(NLP)에서 One-Hot Encoding은 텍스트 데이터를 숫자로 변환하는 기법 중 하나로 범주형 데이터를 이진 벡터로 변환하여 컴퓨터가 이해할 수 있도록 만든다.


- 각 단어를 고유한 정수로 매핑: 텍스트 데이터의 단어들을 고유한 정수 인덱스로 변환한다.
- 이진 벡터로 변환: 각 단어의 정수 인덱스에 해당하는 위치에만 1을 두고, 나머지 위치에는 0을 두어 벡터를 만든다.

문장: "I love NLP"
단어: ["I", "love", "NLP"]



Mapping
- I -> 0
- love -> 1
- NLP -> 2

 


One-Hot Encoding으로 변환:
- I -> [1, 0, 0]
- love -> [0, 1, 0]
- NLP -> [0, 0, 1]

 

 

원 핫 인코딩 특징
- 고차원 희소 벡터: One-Hot Encoding은 벡터가 매우 고차원(단어의 수만큼 차원이 존재)이며 대부분의 값이 0인 희소 벡터를 만든다.
- 순서 정보 손실: 단어의 의미적 관계나 순서를 고려하지 않다. 단순히 단어가 존재하는지를 나타낸다.

 

 

 

 

 


 한계점

 

- 고차원 문제: 단어의 수가 많아질수록 벡터의 차원이 커져 비효율적이다. (17년 표준국어대사전 등재 단어 수 약 50만개의 차원이 필요함) 원핫 인코딩으로 변환된 벡터는 대부분의 요소가 0인 매우 고차원의 희소 벡터이다. 범주가 많아질수록 벡터의 차원이 커지고, 대부분의 값이 0이 되기 때문에 계산과 메모리 효율성이 떨어진다.


- 의미적 관계 무시: 단어 간의 유사성이나 관계를 표현하지 못한다. 예를 들어, "king"과 "queen"이 비슷한 의미를 가지더라도 One-Hot Encoding에서는 완전히 다른 벡터로 표현된다.

원핫 인코딩된 벡터 간의 유사도는 코사인 유사도 등으로 계산할 수 있지만, 모든 다른 범주 간 유사도는 0으로 계산된다. 즉, 서로 다른 범주에 대해 유사성을 전혀 반영하지 못한다. 예를 들어, "고양이"와 "개"는 서로 관련이 있을 수 있지만, 원핫 인코딩에서는 전혀 관계가 없는 것으로 나타난다.



- 코사인 유사도를 사용해 원핫 인코딩된 벡터 간의 유사도를 계산하면, 같은 범주에서는 1이 되고, 다른 범주에서는 0이 된다. 즉, 원핫 인코딩은 범주 간의 미묘한 차이나 유사성을 반영하지 못하고, 서로 다른 범주는 항상 완전히 다른 것으로 취급된다. 이 한계를 극복하기 위해 임베딩(Embedding) 기법이 등장했다. 임베딩은 범주를 밀집된 벡터로 표현하여 벡터 간의 유사성을 더 잘 반영할 수 있도록 한다.

 

 

 

 

 

 

 



 대안


- Word Embeddings: 단어를 저차원 벡터로 변환하면서 의미적 관계를 유지하는 방법( Word2Vec, GloVe, FastText 등)
One-Hot Encoding은 단순하지만, 텍스트 데이터를 모델에 입력하기 위해서 필요한 중요한 전처리 방법이나 실제 자연어 처리 모델에서는 Word Embedding과 같은 더 복잡한 기법이 자주 사용된다.

 

 

 

 

유사도 계산(Similarity Measurement)

 

 두 벡터 간의 유사성을 수치적으로 표현하기 위해 사용되며 유사도는 주로 0에서 1 사이의 값을 가지며, 값이 1에 가까울수록 두 벡터가 유사하고, 0에 가까울수록 두 벡터가 유사하지 않음을 의미한다.

 

 

 코사인 유사도(Cosine Similarity)

 

 코사인 유사도는 두 벡터 간의 각도를 기반으로 유사도를 측정하는 방법으로, 값은 -1과 1 사이의 범위에서 나타난다. 두 벡터가 완전히 같은 방향을 가리키면 코사인 유사도는 1, 서로 반대 방향을 가리키면 -1, 직각을 이루면 0이 된다.

수식은 다음과 같이 설명할 수 있다:

\[ \text{similarity} = \cos(\theta) = \frac{A \cdot B}{\|A\|\|B\|} = \frac{\sum_{i=1}^{n} A_i \times B_i}{\sqrt{\sum_{i=1}^{n} (A_i)^2} \times \sqrt{\sum_{i=1}^{n} (B_i)^2}} \]

- \( A \)와 \( B \)는 두 벡터를 나타낸다.
- \( A \cdot B \)는 두 벡터의 내적(Dot Product)을 의미한다.
- \( \|A\| \)와 \( \|B\| \)는 각 벡터의 크기(Norm)를 의미하며, 이는 각 벡터 요소의 제곱합에 제곱근을 취한 값이다.
- \( \theta \)는 두 벡터 간의 각도이다.

- 코사인 유사도는 벡터의 방향에 초점을 맞추며, 크기보다는 방향이 중요한 경우에 유용하며 유사도 계산, 텍스트 데이터 처리, 정보 검색에서 많이 사용된다.

 

 

 

 


 유클리드 거리 (Euclidean Distance):

 

   - 두 벡터 간의 직선 거리를 측정한다.
     \[
     \text{distance} = \sqrt{\sum_{i=1}^{n} (A_i - B_i)^2}
     \]
     유클리드 거리는 벡터가 가까울수록 작은 값을 가지며, 벡터가 멀어질수록 큰 값을 가진다. 벡터가 동일하다면 거리는 0이 된다.

   -  위치나 크기 차이가 중요한 경우에 사용된다.

 

 

 

 

자카드 유사도 (Jaccard Similarity):

 

   - 집합 간의 유사성을 측정하는 방법으로, 두 집합의 교집합 크기를 합집합 크기로 나눈 값으로 계산된다:
     \[
     \text{Jaccard similarity} = \frac{|A \cap B|}{|A \cup B|}
     \]
   - 자카드 유사도는 이진 속성(예: 이진 벡터, 집합)의 유사성을 계산할 때 주로 사용된다. (단어보다는 문장의 유사도를 측정한다,겹치는 토큰의 비율)  

 

 

 

 


 맨하탄 거리 (Manhattan Distance):

 

   - 유클리드 거리와 유사하지만, 각 차원의 차이의 절대값을 합산하여 계산한다:
     \[
     \text{Manhattan distance} = \sum_{i=1}^{n} |A_i - B_i|
     \]
   - 벡터가 서로 직각으로 만나는 격자 공간에서의 거리 측정에 사용된다.

 

 

 

 

 

 

 

Word Embedding(단어 임베딩)

 

 자연어 처리(NLP)에서 단어를 고정된 크기의 실수 벡터로 표현하는 방법으로 벡터가 공간에 꽉차있으며 새로운 단어 추가시 차원을 추가할 필요가 없어 연산을 줄일 수 있다.

 


1. 고차원에서 저차원으로 변환:
   - 단어 임베딩은 일반적으로 수백 차원(예: 100차원, 300차원)의 실수 벡터로 표현된다. 이러한 벡터는 단어의 의미를 반영하여 학습된 것으로, 의미적으로 유사한 단어들은 벡터 공간에서 가까운 위치에 있게 된다.

2. 밀집 벡터(Dense Vector):
   - 단어 임베딩은 밀집 벡터를 사용한다. 이는 벡터의 대부분의 요소가 0이 아닌 값을 가지는 벡터이다. 이는 원-핫 인코딩과 대조적이다.


3. 학습 기반 임베딩:
   - 단어 임베딩은 대규모 텍스트 코퍼스를 학습하여 얻어진다. 대표적인 단어 임베딩 알고리즘으로는 Word2Vec, GloVe, FastText 등이 있다. 이러한 알고리즘은 단어의 주변 단어(context)를 분석하여 단어 벡터를 학습한다.

 

 


주요 단어 임베딩 기법 Word Representation"(단어 표현)

 

 Local Representation과 Distributed Representation으로 나눌 수 있다.

Local Representation
   - One-hot vector: 각 단어를 고유한 인덱스로 인코딩하는 방법으로, 벡터의 하나의 요소만 1이고 나머지는 0인 벡터이다.
   - N-gram: 단어의 연속된 n개의 그룹을 분석하는 방법으로, 문맥을 고려할 수 있는 방법이다.
   - Count Based: 단어의 빈도수를 기반으로 표현하는 방법이다.
     - BoW (Bag of Words): 단어의 등장 여부를 기준으로 하는 방법이다.
     - TDM (Term Document Matrix): 문서에서 단어의 빈도를 나타내는 행렬이다.

 

 

 

 

 

Distributed Representation 
   - 단어를 밀집 벡터(dense vector)로 표현하는 방법이다. 이 방법은 단어 간의 의미적 유사성을 벡터 공간에서 반영할 수 있다.
   - Prediction Based: 주변 단어를 예측하여 단어 임베딩을 학습하는 방법이다.
     - Word2Vec: 구글에서 개발된 대표적인 단어 임베딩 알고리즘이다.
     - FastText: 페이스북에서 개발된, Word2Vec을 확장한 방법으로, 단어 내부의 n-gram을 고려한다.
   - Count Based: 단어의 빈도와 함께 단어 쌍 간의 상호작용을 고려하는 방법이다.
     - GloVe: 단어의 전역적인 동시 등장 빈도를 활용하여 단어 임베딩을 생성한다.
     - LSA (Latent Semantic Analysis): 문서 전체의 단어 간 관계를 고려하여 차원 축소를 통해 의미를 추출하는 방법이다.



- Local Representation은 단어의 개별적인 정보에 집중한 반면, Distributed Representation은 단어의 문맥적 의미를 반영하여 보다 복잡한 의미 관계를 벡터 공간에서 표현한다.
- 원-핫 인코딩은 Local Representation의 한 예로, 단어 간의 유사성을 반영하지 못하지만, Word2Vec이나 GloVe와 같은 Distributed Representation 방법은 단어 간의 의미적 유사성을 효과적으로 포착할 수 있다.

 

 

 

 

 

단어 임베딩 활용

 

- 텍스트 유사도 측정: 단어 임베딩을 사용해 문서나 문장 간의 유사도를 측정할 수 있다.
- 감정 분석: 텍스트 데이터를 기반으로 감정을 분석하는 데 사용될 수 있다.   
- 머신 트랜슬레이션(기계 번역): 단어 임베딩은 기계 번역에서 원본 언어와 목표 언어 간의 단어 간 유사성을 파악하는 데 사용된다.
- 챗봇: 챗봇은 사용자와의 대화에서 의미를 파악하기 위해 단어 임베딩을 사용한다.

 

 

 

 

 

 

 

■one hot encoding

 

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np

def onehotenc_sk(animals) :
    # LabelEncoder를 사용하여 문자열을 숫자로 변환
    label_enc = LabelEncoder()
    int_enc = label_enc.fit_transform(animals)
    
    print("Label Encoded Data:")
    print(int_enc)
    
    # OneHotEncoder를 사용하여 숫자를 원-핫 인코딩
    # reshape(-1, 1) : 1차원 배열을 2차원 배열로 변환 (필수)
    onehot_enc = OneHotEncoder(sparse_output=False)  # sparse=False는 결과를 dense 배열로 반환
    
    int_enc=int_enc.reshape(len(int_enc),1)
    onehot_enc_data = onehot_enc.fit_transform(int_enc)
    return onehot_enc_data

 

 

 

 - fit_transform(animals)는 animals 리스트의 각 문자열을 고유한 정수로 매핑한다.
- parse_output=False는 결과를 희소 행렬이 아닌 밀집 배열로 반환하도록 설정한다.

- int_enc.reshape(len(int_enc), 1)는 1차원 배열을 2차원 배열로 변환한다. One-Hot Encoder는 2차원 배열을 입력으로 받기 때문이다.

 


이 배열은 Label Encoded Data를 원-핫 인코딩한 결과이다. 

각 행은 원-핫 인코딩된 결과를 나타내며, 각 열은 고유한 클래스에 해당한다.:

- 행: int_enc의 각 값에 대한 원-핫 인코딩 벡터이다.
- 열: 각 열은 특정 클래스(숫자)와 관련된 원-핫 인코딩된 열을 나타낸다.

- Label Encoded Data는 문자열을 숫자로 변환한 결과이며 One-Hot Encoded Data는 이 숫자들을 원-핫 인코딩한 결과이다. 각 숫자는 고유한 열 위치를 갖는 벡터로 표현된다.

 

 

 

 


■ 유클리디안

 



 

 

■  자카드 유사도



 
 
 

 

 

반응형

'AI > NLP 자연어 처리' 카테고리의 다른 글

원-핫 인코딩과 패딩 과정  (5) 2024.10.08
딥러닝 개발환경 구성  (0) 2024.09.19