A machine learning system that classifies user text into predefined intents using TF-IDF vectorization and Support Vector Machine (SVM) classification. Built with scikit-learn for natural language understanding in Spanish.
Project Name: modelo.py Location: ~/workspace/source/proyectos/ai creator/kamutini/detecsion de intencion/modelo.py Algorithm: TF-IDF + Linear SVM
Based on the actual dataset (490+ samples), the system recognizes:
investigacion
clima
musica
conversacion_ai
Research and information queries:
- "¿Qué es la inteligencia artificial?"- "¿Cuáles son las personas más ricas del mundo?"- "¿Cómo funciona un motor de búsqueda?"- "¿Quién inventó el internet?"- "¿Cuándo se inventó la computadora?"- "¿Dónde nació Jesucristo?"
Weather-related queries:
- "¿Qué clima hace hoy?"- "¿Cuál es el pronóstico del clima?"- "¿Cuándo va a llover?"- "¿Cómo está el clima?"- "¿Por qué hace tanto calor hoy?"
def cargar_datos(ruta_archivo): """Carga el dataset desde la ruta especificada.""" try: with open(ruta_archivo, 'r', encoding='utf-8') as f: data = json.load(f) return data except FileNotFoundError: print(f"Error: No se encontró el archivo en {ruta_archivo}") sys.exit(1) except json.JSONDecodeError: print("Error: El archivo no tiene un formato JSON válido.") sys.exit(1)
def entrenar_modelo(dataset, ruta_guardado): print("Preparando datos para el entrenamiento...") # Validate and clean data datos_validos = [] for i, item in enumerate(dataset): if 'text' in item and 'intent' in item: datos_validos.append(item) else: print(f"Advertencia: El elemento en el índice {i} fue omitido porque le falta 'text' o 'intent'.") if not datos_validos: print("Error: No se encontraron datos válidos para entrenar.") sys.exit(1) # Extract texts and intents textos = [item['text'] for item in datos_validos] intenciones = [item['intent'] for item in datos_validos]
TfidfVectorizer( ngram_range=(1, 2), # Unigrams and bigrams lowercase=True, # Convert to lowercase stop_words=None # Keep all words (Spanish-specific))
ngram_range=(1, 2): Captures both single words and two-word phrases
# Split data for validationif len(datos_validos) < 2: print("Entrenando con un conjunto de datos muy pequeño...") modelo.fit(textos, intenciones)else: test_size = 0.2 if len(datos_validos) > 5 else 0.1 X_train, X_test, y_train, y_test = train_test_split( textos, intenciones, test_size=test_size, random_state=42 ) print(f"Entrenando con {len(X_train)} ejemplos...") modelo.fit(X_train, y_train) if len(X_test) > 0: y_pred = modelo.predict(X_test) print("\n--- Reporte de Calidad del Modelo ---") print(classification_report(y_test, y_pred, zero_division=0))
def iniciar_interfaz_chat(modelo): """Abre un bucle de entrada para detectar intenciones en tiempo real.""" print("\n" + "="*50) print("IA DE DETECCIÓN DE INTENCIÓN LISTA") print("Escribe tu mensaje para detectar la intención.") print("Escribe 'salir' para finalizar.") print("="*50 + "\n") while True: try: entrada_usuario = input("Tú: ") except EOFError: break if entrada_usuario.lower() in ['salir', 'exit', 'quit']: print("Cerrando el programa...") break if not entrada_usuario.strip(): continue # Predict intent intencion_detectada = modelo.predict([entrada_usuario])[0] # Get confidence score probabilidades = modelo.predict_proba([entrada_usuario]) confianza_maxima = max(probabilidades[0]) print(f"Intención detectada: [{intencion_detectada}] (Confianza: {confianza_maxima:.2%})") print("-" * 30)
==================================================IA DE DETECCIÓN DE INTENCIÓN LISTAEscribe tu mensaje para detectar la intención.Escribe 'salir' para finalizar.==================================================Tú: ¿Qué tiempo hace hoy?Intención detectada: [clima] (Confianza: 94.32%)------------------------------Tú: reproduce una canción de rockIntención detectada: [musica] (Confianza: 97.81%)------------------------------Tú: ¿quién inventó la computadora?Intención detectada: [investigacion] (Confianza: 89.45%)------------------------------Tú: hola, ¿cómo estás?Intención detectada: [conversacion_ai] (Confianza: 92.17%)------------------------------Tú: salirCerrando el programa...
{ "id": 500, "text": "¿cuánto es 5 más 3?", "intent": "matematicas"}
2
Add Variations
Include diverse phrasings (minimum 20-30 samples):
{"text": "suma 10 y 5", "intent": "matematicas"},{"text": "¿cuál es el resultado de 7 por 8?", "intent": "matematicas"},{"text": "calcula 100 dividido entre 4", "intent": "matematicas"}