La Generación de Texto con Redes Neuronales LSTM, hacen referencia a “Long Short-Term Memory” (Memoria a Largo Plazo y Corto Plazo). Es un tipo de red neuronal recurrente (RNN) que se utiliza comúnmente para tareas relacionadas con el procesamiento del lenguaje natural, como la generación de texto, la traducción automática y el análisis de sentimientos. A diferencia de las RNN tradicionales, las LSTM pueden aprender y recordar dependencias a largo plazo en secuencias de datos, lo que las hace especialmente útiles para tareas que involucran datos secuenciales.
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense
import numpy as np
# Leer el archivo de texto
with open('tu_texto.txt', 'r', encoding='utf-8') as file:
text = file.read()
# Preprocesar el texto y crear secuencias
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1
# Crear secuencias de entrada y objetivo
input_sequences = []
for i in range(1, len(text)):
n_gram_sequence = text[:i+1]
input_sequences.append(n_gram_sequence)
# Tokenizar las secuencias y rellenarlas
input_sequences = tokenizer.texts_to_sequences(input_sequences)
input_sequences = pad_sequences(input_sequences)
# Crear datos de entrada y objetivo
X = input_sequences[:, :-1]
y = input_sequences[:, -1]
# Modelo LSTM
model = tf.keras.Sequential([
Embedding(total_words, 64, input_length=X.shape[1]),
LSTM(100),
Dense(total_words, activation='softmax')
])
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
# Entrenar el modelo
model.fit(X, y, epochs=5, verbose=1)
Probar Modelo:
# Generar texto de prueba
seed_text = "El sol brilla en"
next_words = 10
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=X.shape[1], padding='pre')
predicted = model.predict(token_list, verbose=0)
predicted_word = tokenizer.index_word[np.argmax(predicted)]
seed_text += " " + predicted_word
print(seed_text)
El resultado que arrojará podría ser parecido al que resultó con el modelo:
El sol brilla en la nieve
El código anterior carga un archivo de texto, lo pre-procesa, construye un modelo LSTM simple, lo entrena y genera texto a partir de una semilla inicial. A medida que se ejecuta el bucle final, el modelo genera texto caracter por caracter.
El archivo tu_texto.txt
mencionado en el código debe contener el texto de entrenamiento en el que deseas que el modelo LSTM se base para generar texto. Puede ser cualquier archivo de texto que desees, como una novela, un conjunto de artículos, poesía o cualquier otro texto. El modelo aprenderá de ese texto y generará secuencias de caracteres similares.
El código carga este archivo, lo preprocesa dividiéndolo en fragmentos más cortos, mapea los caracteres a números para que la red neuronal pueda entenderlos y, finalmente, utiliza esos fragmentos para entrenar el modelo LSTM. Luego, el modelo genera texto basado en la semilla inicial proporcionada en generated_text
.
Es importante mencionar que, para obtener resultados más largos, significativos y coherentes, se necesita una cantidad suficientemente grande de texto de entrenamiento y una arquitectura de modelo LSTM más compleja. El ejemplo proporcionado es simplificado y se puede utilizar como punto de partida para comprender cómo funcionan las LSTM en la generación de texto.