[파이썬] 텍스트 생성을 위한 자연어 생성 기법

자연어 생성은 컴퓨터가 인간과 같은 자연어를 생성하는 것을 의미합니다. 이는 자연어 처리 분야에서 중요한 주제이며, 다양한 응용 분야에서 사용됩니다. 자연어 생성은 기계 번역, 대화 시스템, 문서 요약 등 다양한 곳에서 사용될 수 있습니다.

Python은 자연어 생성을 위한 다양한 기법과 라이브러리를 제공합니다. 이 글에서는 몇 가지 인기 있는 자연어 생성 기법을 살펴보겠습니다.

1. 마르코프 연쇄

마르코프 연쇄는 통계적인 방법을 사용하여 다음 단어를 예측하는 방식입니다. 텍스트 데이터에서 단어들의 연쇄를 분석하고 각 단어가 다음에 나올 단어의 확률을 계산합니다. 이를 기반으로 다음 단어를 선택하여 텍스트를 생성할 수 있습니다.

import random

def generate_text(corpus, n=100):
    words = corpus.split()
    pairs = [(words[i], words[i+1]) for i in range(len(words)-1)]
    word_dict = {}
    
    for pair in pairs:
        word, next_word = pair
        if word in word_dict:
            word_dict[word].append(next_word)
        else:
            word_dict[word] = [next_word]
    
    current_word = random.choice(list(word_dict.keys()))
    text = current_word
    
    for _ in range(n-1):
        next_words = word_dict[current_word]
        next_word = random.choice(next_words)
        text += " " + next_word
        current_word = next_word
        
    return text

corpus = "This is a sample text for generating random text using Markov chain."
generated_text = generate_text(corpus)
print(generated_text)

2. 순환 신경망 (RNN)

순환 신경망(RNN, Recurrent Neural Network)은 자연어 생성에 많이 사용되는 딥러닝 모델입니다. RNN은 시퀀스 데이터를 처리할 수 있는데, 이를 활용하여 텍스트를 생성할 수 있습니다. RNN은 이전에 생성된 단어의 정보를 유지하여 다음 단어를 예측하는 능력이 있습니다.

from keras.models import Sequential
from keras.layers import LSTM, Dense

def train_rnn(corpus):
    # 전처리와 학습 데이터 생성

    model = Sequential()
    model.add(LSTM(128, input_shape=(maxlen, num_chars)))
    model.add(Dense(num_chars, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')

    model.fit(X, y, batch_size=128, epochs=20)
    
    return model

def generate_text_rnn(model, seed, num_chars):
    generated_text = seed
    
    for _ in range(num_chars):
        x_pred = np.zeros((1, maxlen, num_chars))
        for t, char in enumerate(generated_text):
            x_pred[0, t, char_indices[char]] = 1.

        preds = model.predict(x_pred, verbose=0)[0]
        next_index = np.random.choice(range(num_chars), p=preds)
        next_char = indices_char[next_index]

        generated_text += next_char
        
    return generated_text

corpus = "This is a sample text for generating random text using RNN."
model = train_rnn(corpus)
generated_text = generate_text_rnn(model, seed='T', num_chars=100)
print(generated_text)

3. GPT (Generative Pre-trained Transformer)

GPT는 최근에 등장한 자연어 생성 모델로, Transformer 아키텍처를 사용합니다. GPT는 전체 문맥을 모델링하여 자연스러운 텍스트를 생성할 수 있으며, 다양한 응용 분야에서 좋은 성능을 보입니다. GPT는 사전 훈련된 가중치를 사용하여 적은 데이터로도 좋은 성능을 낼 수 있습니다.

from transformers import GPT2LMHeadModel, GPT2Tokenizer

def generate_text_gpt(prompt, model_name='gpt2', num_tokens=100):
    model = GPT2LMHeadModel.from_pretrained(model_name)
    tokenizer = GPT2Tokenizer.from_pretrained(model_name)

    input_ids = tokenizer.encode(prompt, return_tensors='pt')
    output = model.generate(input_ids, max_length=num_tokens, num_return_sequences=1, no_repeat_ngram_size=2)

    generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
    return generated_text

prompt = "This is a sample text for generating random text using GPT."
generated_text = generate_text_gpt(prompt)
print(generated_text)

위에서 소개한 세 가지 방법은 각각의 장단점이 있으며, 문제의 성격에 맞게 선택하여 사용할 수 있습니다. 파이썬을 사용하여 자연어 생성을 구현하는 것은 간단하며, 다양한 라이브러리와 모델을 활용하여 원하는 결과물을 얻을 수 있습니다.

텍스트 생성을 위한 자연어 생성 기법에 대한 소개였습니다. 더 자세한 내용은 해당 기법에 대한 문서와 튜토리얼을 참고하시기 바랍니다.