+ 개발

단어 표현(Word Representation)

AI.Logger 2024. 9. 6. 00:10
  • 수업 내용 리마인드 및 아카이빙 목적의 업로드


 

기계는 우리가 사용하는 문자를 그대로 이해할 수 없어요. 그래서 자연어 처리에서는 문자를 숫자로 변환하는 방법이 필요해요. 이 글에서는 단어를 숫자로 변환하는 대표적인 방법인 원-핫 인코딩(One-Hot Encoding)을 직접 구현하고, Scikit-learn을 이용한 방법까지 단계별로 설명드릴게요.

 

1. 원-핫 인코딩 (One-Hot Encoding)

원-핫 인코딩은 단어를 고유한 숫자로 변환한 후, 해당 단어의 위치에만 1을 부여하고 나머지에는 0을 채우는 방법이에요. 이 방식은 단어 간의 관계나 유사성을 표현하지 않지만, 간단하고 명확하게 텍스트 데이터를 숫자로 변환할 수 있죠.

 

1) 직접 원-핫 인코딩 구현하기

파이썬의 기본 라이브러리만 사용해서 원-핫 인코딩을 구현할 수 있어요. 여기서는 defaultdict와 numpy를 이용해 단어 리스트를 원-핫 인코딩하는 방법을 소개할게요.

from collections import defaultdict
import numpy as np

word_ls = ['원숭이', '바나나', '사과', '개', '고양이']

def one_hot_encode(word_ls):
    word2id_dic = defaultdict(lambda: len(word2id_dic))
    
    for word in word_ls:
        word2id_dic[word]
    
    n_unique_words = len(word2id_dic)
    one_hot_vectors = np.zeros((len(word_ls), n_unique_words))
    
    for i, word in enumerate(word_ls):
        index = word2id_dic[word]
        one_hot_vectors[i, index] = 1
    
    return one_hot_vectors

one_hot_vectors = one_hot_encode(word_ls)
print(one_hot_vectors)

이 코드에서는 각 단어에 고유한 인덱스를 부여한 후, 해당 인덱스에만 1을 할당하여 원-핫 벡터를 만들어줍니다. 단순하지만 효과적인 방법이에요!

 

2) Scikit-learn을 활용한 원-핫 인코딩

Scikit-learn을 사용하면 훨씬 간편하게 원-핫 인코딩을 할 수 있어요. 특히 대규모 데이터나 복잡한 전처리 작업이 있을 때는 유용하답니다.

from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd

word_ls = ['원숭이', '바나나', '사과', '개', '고양이']
values = np.array(word_ls).reshape(-1, 1)

encoder = OneHotEncoder(sparse_output=False)
one_hot_encoded = encoder.fit_transform(values)

df = pd.DataFrame(one_hot_encoded, index=word_ls, columns=encoder.get_feature_names_out())
print(df)

여기서 OneHotEncoder를 사용해 단어를 자동으로 인코딩해주고, 결과를 데이터프레임으로 깔끔하게 정리할 수 있어요. Sklearn은 이런 작업을 매우 쉽게 처리해줍니다!

 

 

2. 텍스트 데이터 예시

이제 실제 텍스트 데이터를 가지고 원-핫 인코딩을 적용하는 예시를 보여드릴게요. 간단한 리뷰 데이터를 가지고 시작해봅시다.

 

1) 텍스트 데이터 준비 및 전처리

먼저 리뷰 데이터를 준비한 후, 정규 표현식을 사용해 소문자로 변환하고, 구두점을 제거합니다.

import re

reviews = [
    "The product is great",
    "The product is not good",
    "I love this product",
    "I will buy this product again",
    "The product broke after one use",
    "Great product and fast delivery",
    "Not satisfied with the product",
    "The delivery was delayed",
    "I am very happy with this purchase",
    "The product is worth the price"
]

reviews = [re.sub(r'[^\w\s]', '', review.lower()) for review in reviews]
print(reviews)

이렇게 전처리된 텍스트는 단어의 대소문자나 불필요한 구두점이 제거되어서 더 깨끗하게 처리됩니다.

 

2) 토큰화 및 고유 단어 추출

문장을 단어 단위로 나누고, 모든 단어에서 중복을 제거해 고유 단어 리스트를 만듭니다.

tokens = [review.split() for review in reviews]
all_tokens = sum(tokens, [])
unique_words = list(set(all_tokens))
print(unique_words)

 

3) One-Hot 인코딩 적용

이제 고유 단어 리스트를 바탕으로 각 리뷰를 원-핫 인코딩합니다.

from sklearn.preprocessing import OneHotEncoder
import numpy as np

one_hot_encoder = OneHotEncoder(categories=[unique_words], sparse_output=False)
one_hot_encoded_reviews = [one_hot_encoder.fit_transform(np.array(review).reshape(-1, 1)).sum(axis=0) for review in tokens]

# 각 리뷰에서 단어가 등장하면 1, 그렇지 않으면 0으로 표시
one_hot_encoded_reviews = np.clip(one_hot_encoded_reviews, 0, 1)
df_one_hot = pd.DataFrame(one_hot_encoded_reviews, columns=unique_words)
print(df_one_hot)

이 결과로 리뷰 데이터가 원-핫 인코딩된 형태로 변환되고, 각 리뷰에서 등장한 단어가 데이터프레임에 1로 표시돼요. 이렇게 하면 리뷰 데이터가 숫자 벡터로 변환되어, 기계 학습 모델에서 사용할 수 있는 형태로 바뀌게 되죠!