sentiment-analysis-service / INTEGRACION.md
jossy-gutierrez
feat: use HuggingFace Inference API with local model fallback
1212697
|
Raw
History Blame Contribute Delete
9.8 kB

✅ Integración Frontend Completada - Análisis de Sentimientos

📝 Resumen

La integración del sistema de análisis de sentimientos con el frontend ha sido completada. El tab de "Análisis de Sentimientos" ahora obtiene datos reales del backend en lugar de usar datos simulados.

🔧 Cambios Realizados

1. Hook personalizado para análisis de sentimientos

Archivo creado: D:\Projects\Personal\proyecto-de-grado\src\features\patients\hooks\useAnalisisSentimiento.ts

Funcionalidad:

  • Obtiene análisis agregado del backend mediante /api/analisis/:pacienteId?periodo=X
  • Maneja estados de carga y error
  • Permite cambiar el período de análisis (7, 14, 30 días)
  • Proporciona función refresh() para recargar datos

Ejemplo de uso:

const { analisis, loading, error, refresh } = useAnalisisSentimiento(pacienteId, 7);

2. Actualización del AnalisisSentimientoTab

Archivo modificado: D:\Projects\Personal\proyecto-de-grado\src\features\patients\components\tabs\AnalisisSentimientoTab.tsx

Cambios implementados:

  • ✅ Reemplazado todos los datos mock con datos reales del backend
  • ✅ Agregado manejo de estados de carga (CircularProgress)
  • ✅ Agregado manejo de errores (Alert)
  • ✅ Agregado manejo de datos vacíos
  • ✅ Implementado mapeo de emociones a emojis (EMOTION_EMOJI_MAP)
  • ✅ Implementado detección de sentimiento para palabras clave
  • ✅ Cambiado selector de período de string a número (7, 30, 90 días)
  • ✅ Integrado alertas e insights desde el backend
  • ✅ Integrado distribución de emociones desde el backend
  • ✅ Integrado evolución temporal desde el backend
  • ✅ Integrado palabras clave desde el backend

🎨 Características Implementadas

Estados de UI

  1. Loading State

    Muestra CircularProgress mientras carga datos del backend
    
  2. Error State

    Muestra Alert con mensaje de error si falla la petición
    
  3. Empty State

    Muestra mensaje cuando no hay entradas del diario para analizar
    
  4. Data State

    Muestra todos los componentes visuales con datos reales
    

Mapeo de Datos

Sentimientos (backend → frontend):

  • esperanzador → Color verde (#4CAF50) → "Esperanzador"
  • desafiante → Color rojo (#F44336) → "Desafiante"
  • equilibrado → Color naranja (#FF9800) → "Equilibrado"

Emociones → Emojis:

Ansioso → 😰
Tranquilo → 😌
Feliz → 😊
Estresado → 😫
Motivado → 🤩
Triste → 😢
Enojado → 😠
Frustrado → 😤
Esperanzado → 🙏
Cansado → 😴
Neutral → 😐

Palabras Clave - Detección de Sentimiento:

  • Palabras positivas: familia, alegría, esperanza, gratitud, feliz, amor, logro → Color verde
  • Palabras negativas: trabajo, preocupación, estrés, ansiedad, miedo, tristeza → Color rojo
  • Palabras neutrales: todo lo demás → Color naranja

🧪 Próximos Pasos para Testing

Paso 1: Iniciar Microservicio Python

cd D:\Projects\Personal\sentiment-analysis-service
source venv/Scripts/activate  # Git Bash
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

Verificar que funciona:

  • Abrir: http://localhost:8000
  • Debería mostrar: {"service": "Sentiment Analysis API", "version": "0.1.0", "status": "running"}

Paso 2: Verificar Backend tiene Variable de Entorno

Archivo: D:\Projects\Personal\mdg-backend\.env

SENTIMENT_SERVICE_URL=http://localhost:8000

Paso 3: Ejecutar Migraciones (si no se hizo antes)

cd D:\Projects\Personal\mdg-backend
npm run migration:run

Debería crear:

  • Tabla analisis_sentimiento
  • Campo estado_analisis en tabla diario_emocional

Paso 4: Iniciar Backend

cd D:\Projects\Personal\mdg-backend
npm run dev

Paso 5: Iniciar Frontend

cd D:\Projects\Personal\proyecto-de-grado
npm run dev

🎯 Flujo de Testing Completo

1. Como Paciente - Escribir Entrada de Diario

  1. Iniciar sesión como paciente
  2. Ir a "Mis Tareas""Diario Emocional"
  3. Seleccionar emoji
  4. Escribir texto (ejemplo: "Hoy me siento muy ansioso por el trabajo. Tengo miedo de no cumplir con los plazos.")
  5. Hacer clic en "Guardar Entrada"
  6. Esperar 2-5 segundos (análisis en background)

Qué sucede:

  • Backend guarda entrada con estado_analisis = "pendiente"
  • Backend llama async a microservicio Python
  • Python analiza texto y devuelve: sentimiento, emoción, keywords, alertas
  • Backend guarda análisis en tabla analisis_sentimiento
  • Backend marca entrada como estado_analisis = "analizado"

2. Como Psicólogo - Ver Análisis

  1. Iniciar sesión como psicólogo/administrador
  2. Ir a "Pacientes"
  3. Seleccionar el paciente que escribió la entrada
  4. Hacer clic en tab "Análisis de Sentimientos"

Qué deberías ver:

  • Alertas Detectadas: Si hay palabras de alto riesgo
  • Total de Entradas: Número de entradas analizadas
  • Sentimiento General: Esperanzador/Desafiante/Equilibrado con score
  • Emoción Predominante: Con emoji (ej: Ansioso 😰)
  • Tendencia: Mejorando/Empeorando/Estable
  • Distribución de Emociones: Gráfico de barras
  • Evolución Temporal: Timeline con barras positivas/negativas
  • Palabras Clave: Nube de palabras con colores según sentimiento
  • Insights Clave: Observaciones automáticas

3. Cambiar Período de Análisis

  1. En el tab de Análisis de Sentimientos
  2. Cambiar el dropdown de "Últimos 7 días" (predeterminado) a "Últimos 14 días" o "Últimos 30 días"
  3. Los datos se recargan automáticamente

🔍 Verificación de Datos en Base de Datos

Ver entradas del diario:

SELECT
  id,
  fecha_entrada,
  emocion_seleccionada,
  estado_analisis
FROM diario_emocional
WHERE paciente_id = 'uuid-del-paciente'
ORDER BY fecha_entrada DESC;

Ver análisis guardados:

SELECT
  fecha_analisis,
  sentimiento_general,
  emocion_predominante,
  confianza,
  palabras_clave,
  alertas
FROM analisis_sentimiento
WHERE paciente_id = 'uuid-del-paciente'
ORDER BY fecha_analisis DESC;

Ver entradas pendientes de análisis:

SELECT
  id,
  fecha_entrada,
  estado_analisis
FROM diario_emocional
WHERE estado_analisis = 'pendiente'
ORDER BY fecha_entrada DESC;

🐛 Troubleshooting

El tab muestra "No hay entradas del diario emocional para analizar"

Causas posibles:

  1. El paciente no ha escrito ninguna entrada
  2. Las entradas están pendientes de análisis
  3. El período seleccionado no tiene datos

Solución:

  • Verificar que el paciente tenga entradas en la base de datos
  • Forzar análisis de pendientes: POST /api/analisis/:pacienteId/procesar-pendientes

El tab muestra error de conexión

Causas posibles:

  1. El microservicio Python no está corriendo
  2. El backend no tiene la variable SENTIMENT_SERVICE_URL correcta
  3. El backend no está corriendo

Solución:

  1. Verificar que http://localhost:8000/health responda
  2. Verificar .env del backend
  3. Reiniciar backend

Los datos no se actualizan al cambiar el período

Solución:

  • Hacer refresh de la página
  • Verificar la consola del navegador por errores

Las palabras clave no tienen el color correcto

Nota: El sistema usa heurísticas simples para asignar colores. Palabras ambiguas pueden aparecer como neutrales (naranja). Esto es normal y se puede mejorar con un modelo más avanzado en el futuro.

📊 Ejemplo de Respuesta del Backend

{
  "total_entradas": 5,
  "sentimiento_promedio": -0.35,
  "distribucion_emociones": {
    "Ansioso": 3,
    "Tranquilo": 1,
    "Feliz": 1
  },
  "palabras_clave": [
    {"word": "trabajo", "frequency": 8},
    {"word": "miedo", "frequency": 5},
    {"word": "familia", "frequency": 3}
  ],
  "alertas": [
    {
      "type": "warning",
      "text": "Se detecta alta frecuencia de entradas con ansiedad (60% de las entradas)"
    }
  ],
  "evolucion_temporal": [
    {
      "fecha": "2026-01-25",
      "sentimiento": "desafiante",
      "score": -0.65,
      "emocion": "Ansioso",
      "confianza": 0.85
    },
    {
      "fecha": "2026-01-24",
      "sentimiento": "equilibrado",
      "score": 0.15,
      "emocion": "Tranquilo",
      "confianza": 0.72
    }
  ]
}

✨ Mejoras Futuras Posibles

  1. Exportar análisis como PDF para compartir con el paciente
  2. Comparación entre períodos (ej: comparar últimos 30 días vs 30 días anteriores)
  3. Alertas en tiempo real cuando se detecte riesgo crítico
  4. Gráficos más avanzados con bibliotecas como Chart.js o Recharts
  5. Análisis de temas mediante topic modeling
  6. Detección de patrones temporales (ej: ansiedad los lunes)
  7. Recomendaciones automáticas basadas en el análisis

📚 Documentación Relacionada

  • INSTALACION.md - Guía de instalación paso a paso
  • USO.md - Guía de uso para usuarios, psicólogos y desarrolladores
  • ARQUITECTURA_ANALISIS.md - Arquitectura técnica del sistema

✅ Checklist de Integración

  • Hook useAnalisisSentimiento creado
  • AnalisisSentimientoTab actualizado con datos reales
  • Estados de loading, error y vacío implementados
  • Mapeo de sentimientos implementado
  • Mapeo de emociones a emojis implementado
  • Detección de sentimiento para palabras clave implementada
  • Selector de período funcional
  • Integración con backend endpoints completada
  • Testing end-to-end realizado
  • Validación con datos reales de pacientes
  • Documentación de usuario actualizada

Estado:INTEGRACIÓN FRONTEND COMPLETA

Próximo paso: Iniciar servicios y realizar testing end-to-end