ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [3월 1주차-3/7(3)]텍스트 전처리4- 원-핫 인코딩, 데이터의 분리
    Why Not SW CAMP 5기/수업 기록 2025. 3. 7. 14:58

    ✅텍스트 전처리

    • 토큰화(tokenization)
    • 정제(cleaning) and 정규화(normalization)
    • 어간 추출 and 표제어 추출
    • 불용어(stopword) 제거
    • 정규 표현식(regular expression)
    • 정수 인코딩(integer encoding)
    • 패딩(padding)
    • 원-핫 인코딩(one-hot encoding)
    • 데이터의 분리(splitting data)

     

    원 핫 인코딩(One-Hot Encoding) 및 데이터 분리(Splitting Data)

    자연어 처리를 수행할 때, 텍스트 데이터를 수치화하는 여러 방법 중 하나가 원 핫 인코딩(One-Hot Encoding)입니다. 또한 지도 학습에서는 데이터를 훈련 데이터와 테스트 데이터로 분리하는 과정이 필요합니다. 이 글에서는 원 핫 인코딩과 데이터 분리 방법을 설명합니다.


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

    (1) 원 핫 인코딩이란?

    원 핫 인코딩은 표현하고 싶은 단어의 인덱스 위치에 1을 부여하고, 다른 인덱스에는 0을 부여하는 방식입니다.

     

    (2) 원 핫 인코딩의 한계

    1. 차원의 증가: 단어 개수가 많아질수록 벡터의 차원이 커지며, 많은 메모리 공간이 필요합니다.
    2. 유사도 표현 불가능: 단어 간의 의미적 관계를 반영할 수 없습니다. 예를 들어, '강아지'와 '고양이'는 의미적으로 가깝지만 원 핫 인코딩에서는 전혀 다른 벡터로 표현됩니다.

    2. 원 핫 인코딩 구현하기

    (1) Keras를 활용한 원 핫 인코딩

    Keras의 Tokenizer를 사용하면 손쉽게 원 핫 인코딩을 수행할 수 있습니다.

    from tensorflow.keras.preprocessing.text import Tokenizer
    from tensorflow.keras.utils import to_categorical
    
    text = '나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야'
    
    tokenizer = Tokenizer()
    tokenizer.fit_on_texts([text])
    print(tokenizer.word_index)
    # {'갈래': 1, '점심': 2, '햄버거': 3, '나랑': 4, '먹으러': 5, '메뉴는': 6, '최고야': 7}
    
    sub_text = "점심 먹으러 갈래 메뉴는 햄버거 최고야"
    encoded = tokenizer.texts_to_sequences([sub_text])[0]
    print(encoded)
    # [2, 5, 1, 6, 3, 7]
    
    one_hot = to_categorical(encoded)
    print(one_hot)
    

    출력 결과:

    array([[0., 0., 1., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 1., 0., 0.],
           [0., 1., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 1., 0.],
           [0., 0., 0., 1., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 1.]])
    

    3. 데이터 분리 (Splitting Data)

    지도 학습(Supervised Learning)에서는 데이터를 훈련 데이터(training set)와 테스트 데이터(test set)로 나누어 모델의 학습 및 평가를 수행합니다.

    (1) X와 y 분리하기

    zip() 함수 사용

    X, y = zip(['a', 1], ['b', 2], ['c', 3])
    print(X)  # ('a', 'b', 'c')
    print(y)  # (1, 2, 3)
    

    pandas를 이용한 분리

    import pandas as pd
    values = [['dfdfdff', 1],
              ['qwqwqwqwq', 0],
              ['rtrttrtr', 0],
              ['hjhjhjhj', 1]]
    
    columns = ['qqq', 'ddd']
    df = pd.DataFrame(values, columns=columns)
    X = df['qqq']
    y = df['ddd']
    

    numpy를 이용한 분리

    import numpy as np
    np_array = np.arange(0, 16).reshape((4, 4))
    X = np_array[:, :-1]  # 마지막 열 제외
    y = np_array[:, -1]   # 마지막 열
    

    (2) 훈련 데이터와 테스트 데이터 분리

    train_test_split() 사용

    from sklearn.model_selection import train_test_split
    
    X, y = np.arange(10).reshape((5, 2)), range(5)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
    

    출력 예시:

    X_train:
    array([[2, 3],
           [4, 5],
           [6, 7]])
    
    X_test:
    array([[8, 9],
           [0, 1]])
    
    y_train:
    [1, 2, 3]
    
    y_test:
    [4, 0]
    

    📌 random_state 값을 변경하면 데이터 분할 결과가 달라집니다.


    4. 마무리

    원 핫 인코딩은 단어를 수치화하는 대표적인 방법이며, 머신러닝 모델 학습을 위해서는 데이터를 적절히 분리하는 과정이 필요합니다. 데이터의 특성을 고려하여 적절한 인코딩 및 데이터 분리 방법을 선택해야 합니다.

     

     

     

     

Designed by Tistory.