정수 인코딩: 단어를 정수로 바꿔 모델이 읽게 만드는 방법

정수 인코딩의 개념부터 Counter·NLTK·Keras Tokenizer 구현, OOV 처리, 원-핫 인코딩·임베딩으로 이어지는 다음 단계까지 정리한다.

2026-08-14 · 최초 발행 2025-05-23

텍스트를 숫자로 바꿔야 모델이 읽는다

정수 인코딩(Integer Encoding)은 단어를 고유한 정수값으로 매핑하는 과정이다. 텍스트 데이터는 기계가 직접 이해할 수 없으므로 수치화가 필요하고, 이를 위해 단어장(vocabulary)을 만들고 각 단어에 인덱스를 부여하는 방식으로 작동한다. 빈도수 기반 인코딩이 일반적이며, 자주 등장하는 단어에 낮은 정수값을 부여한다.

빈도수를 기준으로 삼으면 얻는 것

자주 사용되는 n개 단어만 선택하면 데이터 크기를 축소할 수 있고, 등장 빈도가 낮은 단어(오타, 특수 용어 등)는 노이즈로 보고 제외할 수 있다. 처리해야 할 고유 단어 수가 줄어드니 모델 학습 속도도 빨라지고, 빈도수가 높은 단어는 보통 중요한 의미를 갖기 때문에 일반화 능력도 좋아진다.

Counter부터 Keras Tokenizer까지, 구현하는 방법들

Python의 Counter 클래스 활용

from collections import Counter
import numpy as np

# 샘플 텍스트 데이터
text_data = ["나는 자연어 처리를 배우고 있다",
             "자연어 처리는 재미있다",
             "나는 데이터 분석가가 되고 싶다"]

# 모든 문장을 단어로 분리
words = []
for sentence in text_data:
    words.extend(sentence.split())

# 단어 빈도수 계산
word_counts = Counter(words)
vocab = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)

# 상위 n개 단어만 선택 (예: 10개)
vocab_size = 10
vocab = vocab[:vocab_size]

# 단어에 인덱스 부여 (빈도수 기준)
word_to_index = {word[0]: i+1 for i, word in enumerate(vocab)}

# OOV 처리를 위한 인덱스 추가
word_to_index['OOV'] = len(word_to_index) + 1

# 문장을 정수 시퀀스로 변환
encoded_sentences = []
for sentence in text_data:
    encoded_sentence = []
    for word in sentence.split():
        try:
            encoded_sentence.append(word_to_index[word])
        except KeyError:
            encoded_sentence.append(word_to_index['OOV'])  # OOV 처리
    encoded_sentences.append(encoded_sentence)

print(encoded_sentences)

NLTK의 FreqDist 활용

from nltk import FreqDist

# 단어 빈도수 계산
fdist = FreqDist(words)
vocab = fdist.most_common(vocab_size)

# 나머지 과정은 Counter와 유사

enumerate 함수 활용

# 중복 제거 후 고유 단어 목록 생성
unique_words = list(set(words))

# enumerate를 사용해 인덱스 부여
word_to_index = {word: idx for idx, word in enumerate(unique_words, 1)}

Keras Tokenizer 활용

from tensorflow.keras.preprocessing.text import Tokenizer

tokenizer = Tokenizer(num_words=vocab_size, oov_token='OOV')
tokenizer.fit_on_texts(text_data)

# 단어 인덱스 확인
word_index = tokenizer.word_index

# 텍스트를 시퀀스로 변환
sequences = tokenizer.texts_to_sequences(text_data)

OOV, 단어 집합에 없는 단어를 만났을 때

OOV는 단어 집합에 없는 단어를 처리하는 중요한 문제다. 테스트 데이터에서 훈련 데이터에 없던 단어가 등장할 때 발생하며, 해결 방법은 다음과 같다.

  1. 특별한 토큰(예: 'OOV', 'UNK')으로 대체
  2. 무시하고 건너뛰기
  3. 가장 유사한 단어로 대체
  4. 하위 단어(subword) 단위로 분할하여 처리
텍스트 데이터단어 분리빈도수 계산빈도수 기준 정렬상위 n개 단어 선택단어-인덱스 매핑 생성OOV 토큰 추가문장을 정수 시퀀스로 변환결과: 정수 인코딩된 텍스트

스팸 필터와 감성 분석에 적용하기

스팸 메일 분류 시스템

# 이메일 텍스트 데이터
emails = ["특별 할인 행사 중입니다. 지금 바로 확인하세요!",
          "회의는 내일 오전 10시에 진행됩니다.",
          "100% 당첨 보장! 지금 응모하세요!"]
labels = [1, 0, 1]  # 1: 스팸, 0: 정상

# Keras Tokenizer로 정수 인코딩
tokenizer = Tokenizer(num_words=100, oov_token='OOV')
tokenizer.fit_on_texts(emails)
X = tokenizer.texts_to_sequences(emails)

# 패딩 추가
from tensorflow.keras.preprocessing.sequence import pad_sequences
X_pad = pad_sequences(X, maxlen=10)

# 모델 구축 및 학습
# ...

감성 분석 시스템

# 리뷰 데이터
reviews = ["이 제품은 정말 훌륭합니다. 강력 추천합니다!",
           "배송이 너무 늦고 제품 품질도 좋지 않습니다.",
           "가격 대비 성능이 괜찮은 제품입니다."]
sentiments = [1, 0, 1]  # 1: 긍정, 0: 부정

# 정수 인코딩 및 모델링
# ...

정수 인코딩만으로는 부족한 지점

정수 인코딩은 '강아지'와 '개'가 의미적으로 유사해도 전혀 다른 숫자로 표현해 의미적 유사성을 반영하지 못한다. 빈도수 기반 인코딩은 단어 간 관계를 고려하지 않아 단어 순서 정보도 손실되고, 원-핫 인코딩으로 변환하면 고차원의 희소 벡터 문제가 생긴다. 훈련 시 보지 못한 새로운 단어를 처리하기도 어렵다.

다음 단계: 원-핫 인코딩과 임베딩으로

정수 인코딩은 보통 텍스트 전처리의 중간 단계다.

  1. 정수 인코딩 후 원-핫 인코딩으로 변환 가능
  2. 임베딩 레이어의 입력으로 사용 가능(Word2Vec, GloVe, FastText 등)
  3. 패딩(Padding)을 통해 동일한 길이의 시퀀스로 변환 필요
텍스트 데이터토큰화정수 인코딩원-핫 인코딩임베딩 레이어머신러닝 모델딥러닝 모델

어휘 크기를 얼마로 잡을지

데이터 특성에 맞는 어휘 크기(vocab_size) 선택이 중요하다. 너무 작으면 중요한 단어가 OOV로 처리되어 정보 손실이 발생하고, 너무 크면 노이즈 단어가 포함되고 모델 복잡도가 증가한다. 전처리(소문자 변환, 불용어 제거, 표제어 추출 등) 후 인코딩을 수행하는 편이 효과적이며, 의학 용어나 법률 용어 같은 도메인 특화 단어는 별도로 처리하는 것을 고려해야 한다.

고급 임베딩 기법도 정수 인코딩에서 출발한다

현대 NLP에서는 단순 정수 인코딩에서 발전해 Word2Vec, BERT와 같은 고급 임베딩 기법이 주로 사용되지만, 이러한 고급 기법들도 내부적으로는 정수 인코딩을 기반으로 한다. 정수 인코딩의 원리와 구현 방법을 정확히 이해하는 것이 NLP 이해의 기초가 되는 이유다. 효과적인 정수 인코딩을 위해서는 데이터의 특성, 모델의 요구사항, OOV 처리 전략을 종합적으로 고려해야 하며, 특히 도메인 특화 데이터를 다룰 때는 일반적인 접근법을 그대로 적용하기보다 데이터 특성에 맞게 조정하는 것이 중요하다.

정수 인코딩NLP 전처리OOVTokenizer단어 집합