⚙️ Detalles Técnicos del Análisis
Esta página está dirigida a personas con conocimientos técnicos que deseen entender cómo funciona el sistema de análisis. Si buscas una explicación más general, visita la página de metodología.
🐍 Stack Tecnológico
Python 3.10+
Lenguaje principal
Scripts de procesamiento de PDFs, extracción de propuestas y cálculo de puntajes.
Astro 4.x
Framework web
Generador de sitios estáticos para la visualización de resultados.
📄 Procesamiento de PDFs
PyMuPDF (fitz)
ActivoLibrería de alto rendimiento para lectura y manipulación de documentos PDF.
pip install PyMuPDF ¿Para qué se usa?
- Extracción de texto página por página
- Detección de texto corrupto (fuentes mal embebidas)
- Renderización de páginas como imágenes para OCR
Tesseract OCR
v5.5.1Motor de reconocimiento óptico de caracteres (OCR) de código abierto, mantenido por Google.
# macOS brew install tesseract tesseract-lang # Ubuntu/Debian apt install tesseract-ocr tesseract-ocr-spa ¿Para qué se usa?
- Lectura de PDFs con texto corrupto o escaneado
- Extracción de texto de imágenes de páginas
- Soporte multiidioma (español configurado)
pytesseract
Python wrapperWrapper de Python para Tesseract OCR que facilita su integración.
pip install pytesseract Pillow (PIL)
Procesamiento de imágenesFork moderno de Python Imaging Library para manipulación de imágenes.
pip install Pillow ¿Para qué se usa?
- Conversión de páginas PDF a imágenes PNG
- Preparación de imágenes para OCR
⚙️ Configuración del OCR
# Configuración en process_plans_v7.py
# Resolución para renderizar páginas como imagen
RENDER_DPI = 200
# Configuración de Tesseract
# --psm 1: Automatic page segmentation with OSD
# -l spa: Idioma español
TESSERACT_CONFIG = '--psm 1 -l spa'
# Caracteres que indican fuentes corruptas
CORRUPT_CHARS = set([
'\uf0b7', '\uf0a7', '\uf0d8', '\uf020', '\uf06c',
'\uf06f', '\uf073', '\uf061', '\uf065', '\uf06e',
# ... más caracteres de fuentes privadas
])
# Umbral: si más del 2% del texto son caracteres corruptos, usar OCR
CORRUPT_THRESHOLD = 0.02 🔄 Flujo de Procesamiento
Lectura del PDF
fitz.open(pdf_path) abre el documento PDF.
Detección de Texto Corrupto
Se muestrean las primeras 10 páginas. Si >2% son caracteres de fuentes privadas, se activa OCR.
Extracción de Texto
Modo normal: page.get_text()
Modo OCR: Renderiza a imagen → Tesseract → texto
Búsqueda de Propuestas
Se buscan keywords por pilar y se extraen propuestas con contexto.
Evaluación, Penalización y Bonos
Se evalúan las 4 dimensiones, se aplican penalizaciones (fiscales, omisión, viabilidad legal), se calculan bonos (múltiples propuestas, calidad, financiamiento) y se generan flags informativos.
Generación de JSON
Se exportan los resultados a archivos JSON que consume el sitio web.
📊 Archivos de Datos Generados
| Archivo | Descripción | Tamaño aprox. |
|---|---|---|
| candidates.json | Datos de candidatos y partidos (editado manualmente) | ~5 KB |
| pillars.json | Definición de los 10 pilares y pesos | ~2 KB |
| proposals.json | Todas las propuestas extraídas con evidencia | ~150 KB |
| candidate_scores.json | Puntajes por pilar y totales por candidato | ~100 KB |
| ranking.json | Rankings ordenados (general, prioritario, crítico) | ~12 KB |
| detailed_analysis.json | Análisis detallado con fortalezas y debilidades | ~50 KB |
🔧 Ejecución del Análisis
# 1. Instalar dependencias
pip install PyMuPDF Pillow pytesseract
# 2. Instalar Tesseract (macOS)
brew install tesseract tesseract-lang
# 3. Ejecutar el análisis v7
cd analysis/
python process_plans_v7.py
# Salida esperada:
# ================================================================================
# PROCESADOR DE PLANES v7.0 - NEUTRAL + ESTRICTO + BONOS + VIABILIDAD + FLAGS
# 10 pilares | OCR automático | Penalizaciones | Bonos | Viabilidad legal | Flags informativos
# ================================================================================
# 📄 ACRM...
# 📄 CAC...
# ...
# ✅ PROCESO COMPLETADO 📐 Constantes de Penalización
# Penalizaciones por irresponsabilidad (basadas en ley vigente)
FISCAL_PENALTIES = {
"attacks_fiscal_rule": -2, # Ataca la regla fiscal (Ley 9635)
"proposes_debt_increase": -1, # Propone más deuda sin plan
}
# Penalizaciones por omisión (urgencias nacionales)
OMISSION_PENALTIES = {
"ignores_security_operations": -1, # No menciona seguridad operativa
"ignores_ccss_crisis": -1, # No menciona crisis CCSS
"ignores_formal_employment": -0.5, # No menciona empleo formal
"ignores_organized_crime": -0.5, # No menciona crimen organizado
"missing_priority_pillar": -0.5, # Por cada pilar prioritario faltante
}
# Penalizaciones por viabilidad legal (v7)
VIABILITY_PENALTIES = {
"violates_separation_powers": -1.0, # Viola separación de poderes
"violates_fundamental_rights": -1.0, # Viola derechos fundamentales
"violates_constitutional_guarantees": -1.0, # Viola garantías constitucionales
"violates_constitutional_procedures": -0.5, # Viola procedimientos constitucionales
}
# Bonos (v7)
BONUSES = {
"multiple_proposals": 1.0, # 3+ propuestas válidas por pilar
"complete_proposal": 0.25, # Propuesta completa (4/4 dimensiones)
"funding_clarity": 0.1, # Propuesta con financiamiento claro (score >=3)
}
# Pilares prioritarios (P3=Seguridad, P4=Salud, P1=Fiscal, P7=Reforma)
PRIORITY_PILLARS = {"P3", "P4", "P1", "P7"}
# Pesos por pilar (v7)
PILLAR_WEIGHTS = {
"P1": 0.14, # Sostenibilidad fiscal
"P2": 0.11, # Empleo y competitividad
"P3": 0.18, # Seguridad ciudadana
"P4": 0.16, # Salud pública (CCSS)
"P5": 0.10, # Educación
"P6": 0.03, # Ambiente
"P7": 0.12, # Reforma del Estado
"P8": 0.05, # Política social
"P9": 0.02, # Política exterior
"P10": 0.09, # Infraestructura
}
# Flags Informativos (v7 - NO penalizan, solo informan)
INFORMATIVE_FLAGS = {
"current_proposals": {
"violates_separation_powers": "Viola separación de poderes",
"violates_fundamental_rights": "Viola derechos fundamentales",
"violates_constitutional_guarantees": "Viola garantías constitucionales",
"violates_constitutional_procedures": "Viola procedimientos constitucionales",
},
"dictatorial_patterns": "Similitudes con modelos dictatoriales (Cuba, Venezuela)",
"power_negotiation_requirements": "Requisitos de negociación entre poderes",
"historical": "Evidencia histórica verificable",
"contradictions": "Contradicciones histórico-actual",
} ℹ️ Flags Informativos (v7)
¿Qué son los Flags Informativos?
Los flags informativos NO penalizan el score. Son señales de información objetiva basadas en evidencia verificable que ayudan al ciudadano a tomar decisiones más informadas.
1. Propuestas Actuales Problemáticas
Detecta violaciones constitucionales en propuestas actuales (separación de poderes, derechos fundamentales, garantías constitucionales, procedimientos).
2. Similitudes con Modelos Dictatoriales
Detecta patrones objetivos similares a modelos históricos (Cuba, Venezuela) basados en evidencia verificable. NO juzga ideología, solo detecta patrones de comportamiento.
3. Requisitos de Negociación
Indica complejidad de implementación (requiere aprobación de Asamblea, mayoría calificada, coordinación entre poderes). NO es un problema, solo informa sobre complejidad.
4. Evidencia Histórica Verificable
Muestra evidencia histórica verificable de comportamiento del candidato/partido basada en sentencias judiciales, resoluciones internacionales, informes de Contraloría.
5. Contradicciones Histórico-Actual
Detecta patrones consistentes entre evidencia histórica y propuestas actuales problemáticas.
⚠️ Importante: Los flags informativos NO afectan el score. Son solo información para que el ciudadano pueda tomar decisiones más informadas.
Motor de análisis (Neutral + Estricto + Bonos + Viabilidad Legal + Flags Informativos) · Enero 2026