#MODELO import torch import torch.nn as nn # Define el dispositivo (CPU o GPU) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") class RNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): # Llama al constructor de la clase padre super(RNN, self).__init__() # Guarda el tamaño de la capa oculta self.hidden_size = hidden_size # Crea la capa RNN self.rnn = nn.RNN(input_size, hidden_size) # Crea la capa densa self.fc = nn.Linear(hidden_size, output_size) def forward(self, input, hidden): # Procesa la entrada por la RNN output, hidden = self.rnn(input, hidden) # Procesa la salida de la RNN por la capa densa output = self.fc(output) # Devuelve la salida y el estado oculto actualizado return output, hidden def init_hidden(self, batch_size): # Inicializa el estado oculto con ceros return torch.zeros(1, self.hidden_size).to(device)
@IN3DMEX2.0Ай бұрын
#ENTRENAMIENTO import torch import torch.nn as nn from modelo import RNN import torch.optim as optim from torch.utils.data import DataLoader import pandas as pd import nltk import numpy as np import sys import pickle # Importa la librería pickle # Descarga el paquete punkt si no está instalado nltk.download('punkt') nltk.download('stopwords') # Define el dispositivo (CPU o GPU) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Define los parámetros de la red input_size = 15 # Tamaño de la entrada (por ejemplo, 15 palabras) hidden_size = 120 # Tamaño de la capa oculta output_size = 3 # Tamaño de la salida (por ejemplo, 3 clases) # Crea una instancia de la RNN modelo = RNN(input_size, hidden_size, output_size) # Define el optimizador y la función de pérdida optimizer = optim.Adam(modelo.parameters(), lr=0.001) criterion = nn.NLLLoss() # Define el dataset dataset = pd.read_csv('dataset.csv') # Prepara el dataset frases = dataset['Frase'].tolist() etiquetas = dataset['Etiqueta'].tolist() # Tokeniza las frases tokens = [nltk.word_tokenize(frase) for frase in frases] # Elimina las stop words stop_words = nltk.corpus.stopwords.words('spanish') tokens = [[token for token in frase if token not in stop_words] for frase in tokens] # Stemming stemmer = nltk.stem.PorterStemmer() tokens = [[stemmer.stem(token) for token in frase] for frase in tokens] # Crea el vocabulario y el diccionario de palabras a índices vocabulario = set([token for frase in tokens for token in frase]) vocabulario_a_indice = {token: indice for indice, token in enumerate(vocabulario)} # Agrega las etiquetas al vocabulario etiquetas_unicas = set(etiquetas) for etiqueta in etiquetas_unicas: if etiqueta not in vocabulario_a_indice: vocabulario_a_indice[etiqueta] = len(vocabulario_a_indice) # Crea un diccionario de etiquetas a índices etiquetas_a_indice = {etiqueta: indice for indice, etiqueta in enumerate(etiquetas_unicas)} # Guarda el diccionario vocabulario_a_indice en un archivo with open('vocabulario_a_indice.pkl', 'wb') as f: # Abre el archivo en modo escritura binaria pickle.dump(vocabulario_a_indice, f) # Guarda el diccionario en el archivo datos = [] for i, tokens_frase in enumerate(tokens): # Crea un tensor de tamaño input_size (15 en este caso) vector = torch.zeros(input_size, dtype=torch.float32) # Rellena las frases más cortas con ceros for j, token in enumerate(tokens_frase): if j < input_size: vector[j] = vocabulario_a_indice[token] # Asegúrate de que la etiqueta esté dentro del rango válido etiqueta = etiquetas_a_indice[etiquetas[i]] datos.append((vector, etiqueta)) # Convierte a torch.float32 # Verifica que la lista datos no esté vacía if datos: # Crea un DataLoader dataloader = DataLoader(datos, batch_size=32, shuffle=True) else: # Si la lista datos está vacía, termina la ejecución print("La lista de datos está vacía. Terminando la ejecución.") sys.exit() # Mueve el modelo al dispositivo modelo.to(device) # Entrena la red num_epochs = 20 for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(dataloader): # Inicializa el estado oculto hidden = torch.zeros(1, hidden_size).to(device) # Inicializa con forma 2D # Mueve los datos al dispositivo inputs = inputs.to(device) labels = labels.long().to(device) # Convierte las etiquetas a LongTensor # Calcula la salida y la pérdida outputs, hidden = modelo(inputs, hidden) loss = criterion(outputs, labels) # Actualiza los pesos optimizer.zero_grad() loss.backward() optimizer.step() # Imprime el progreso print(f'Epoch {epoch+1}/{num_epochs}, Batch {i+1}/{len(dataloader)}, Loss: {loss.item():.4f}') # Guarda los pesos del modelo entrenado torch.save(modelo.state_dict(), 'modelo_pesos.pth')
@IN3DMEX2.0Ай бұрын
#DATASETUP import csv def crear_dataset(): """Crea un dataset de análisis de sentimientos.""" dataset = [] while True: # Solicita al usuario que introduzca una frase frase = input("Introduce una frase (o escribe 'fin' para terminar): ") # Si el usuario escribe 'fin', termina el bucle if frase == 'fin': break # Solicita al usuario que asigne una etiqueta de sentimiento while True: etiqueta = input("Asigna una etiqueta (positivo, negativo, neutral): ") if etiqueta.lower() in ('positivo', 'negativo', 'neutral'): break else: print("Etiqueta inválida. Por favor, introduce 'positivo', 'negativo' o 'neutral'.") # Agrega la frase y la etiqueta al dataset dataset.append([frase, etiqueta]) # Guarda el dataset en un archivo CSV with open('dataset.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['Frase', 'Etiqueta']) writer.writerows(dataset) print("Dataset creado correctamente en 'dataset.csv'") # Llama a la función para crear el dataset crear_dataset()
@IN3DMEX2.0Ай бұрын
#INFERENCIA import torch import torch.nn as nn from modelo import RNN import nltk import pickle # Importa la librería pickle # Descarga el paquete punkt si no está instalado nltk.download('punkt') nltk.download('stopwords') nltk.download('punkt_tab') # Define el dispositivo (CPU o GPU) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Define los parámetros de la red input_size = 15 # Tamaño de la entrada (por ejemplo, 10 palabras) hidden_size = 120 # Tamaño de la capa oculta output_size = 3 # Tamaño de la salida (por ejemplo, 3 clases) # Crea una instancia de la RNN modelo = RNN(input_size, hidden_size, output_size) # Carga los pesos del modelo entrenado modelo.load_state_dict(torch.load('modelo_pesos.pth')) # Elimina las stop words stop_words = nltk.corpus.stopwords.words('spanish') # Stemming stemmer = nltk.stem.PorterStemmer() # Mueve el modelo al dispositivo modelo.to(device)