Python/Deep Learning

LSTM을 활용한 문장 생성 모델 만들기

임베디드 친구 2026. 3. 2. 16:32
728x90
반응형

LSTM을 활용한 문장 생성 모델 만들기

1. 서론

자연어 처리(NLP) 분야에서 순환 신경망(Recurrent Neural Network, RNN)은 연속적인 데이터를 다룰 때 유용하게 사용됩니다. 하지만 기본적인 RNN 구조는 긴 시퀀스를 학습하는 데 한계를 보입니다. 이러한 문제를 해결하기 위해 장단기 기억 네트워크(Long Short-Term Memory, LSTM)가 도입되었습니다.

이번 글에서는 LSTM을 활용하여 문장 생성 모델을 구현하는 방법을 설명하겠습니다. 기본적인 LSTM 구조를 이해하고, 텍스트 데이터를 전처리한 후, LSTM 기반의 문장 생성 모델을 학습하는 과정까지 다뤄보겠습니다.


2. 데이터 준비 및 전처리

문장 생성 모델을 학습하기 위해서는 먼저 적절한 텍스트 데이터가 필요합니다. 이 예제에서는 공개된 문장 데이터를 활용하여 모델을 훈련하겠습니다.

2.1 필요한 라이브러리 설치 및 불러오기

import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Embedding
from tensorflow.keras.optimizers import Adam

2.2 데이터 로드 및 전처리

우선 훈련할 텍스트 데이터를 로드하고, 이를 LSTM 모델이 이해할 수 있도록 정제해야 합니다.

# 훈련 데이터 예제
text_data = """
딥러닝 모델을 이용한 자연어 처리는 매우 흥미로운 분야입니다.
LSTM은 시퀀스 데이터를 처리하는 데 강력한 성능을 보입니다.
문장을 생성하는 것은 자연어 처리에서 중요한 연구 주제입니다.
"""

토크나이징(Tokenization): 문장을 단어 단위로 분할하고, 각 단어를 고유한 정수로 변환합니다.

tokenizer = Tokenizer()
tokenizer.fit_on_texts([text_data])
word_index = tokenizer.word_index

# 전체 단어 사전 크기 계산
vocab_size = len(word_index) + 1
print(f'단어 사전 크기: {vocab_size}')

시퀀스 생성: 문장의 일부를 입력으로 사용하여 다음 단어를 예측하도록 학습 데이터셋을 만듭니다.

input_sequences = []
for sentence in text_data.split('\n'):
    token_list = tokenizer.texts_to_sequences([sentence])[0]
    for i in range(1, len(token_list)):
        input_sequences.append(token_list[:i+1])

시퀀스 패딩(Padding): 길이가 다른 시퀀스를 동일한 길이로 맞춰야 합니다.

max_sequence_length = max(len(seq) for seq in input_sequences)
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre')

3. LSTM 모델 설계 및 학습

이제 LSTM 모델을 설계하고 학습을 진행하겠습니다.

3.1 모델 설계

model = Sequential([
    Embedding(input_dim=vocab_size, output_dim=50, input_length=max_sequence_length),
    LSTM(100, return_sequences=True),
    LSTM(100),
    Dense(100, activation='relu'),
    Dense(vocab_size, activation='softmax')
])

model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.01), metrics=['accuracy'])
model.summary()

3.2 모델 학습

LSTM 모델을 학습시키기 위해 입력 데이터를 원-핫 인코딩(one-hot encoding) 형식으로 변환한 후, 훈련을 진행합니다.

X = input_sequences[:, :-1]
y = input_sequences[:, -1]
y = tf.keras.utils.to_categorical(y, num_classes=vocab_size)

model.fit(X, y, epochs=100, verbose=1)

4. 문장 생성 모델 평가 및 테스트

학습된 LSTM 모델을 활용하여 문장을 생성해 보겠습니다.

def generate_text(seed_text, next_words=10):
    for _ in range(next_words):
        token_list = tokenizer.texts_to_sequences([seed_text])[0]
        token_list = pad_sequences([token_list], maxlen=max_sequence_length, padding='pre')
        predicted = np.argmax(model.predict(token_list), axis=-1)

        for word, index in word_index.items():
            if index == predicted:
                seed_text += " " + word
                break
    return seed_text

4.1 문장 생성 테스트

print(generate_text("LSTM은"))

위 코드를 실행하면 학습 데이터 기반으로 문장이 자동으로 생성됩니다.


5. 결론

이번 글에서는 LSTM을 활용하여 문장 생성 모델을 구현하는 방법을 살펴보았습니다. 문장을 단어 단위로 학습시키고, LSTM 모델을 훈련하여 새로운 문장을 생성할 수 있도록 했습니다.

사전 훈련된 임베딩(Pretrained Embeddings)과 Transformer 기반 모델을 활용하여 더 정교한 문장 생성 모델을 만들 수도 있습니다.

반응형