⚙️ 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_v6.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 y Penalización
Se evalúan las 4 dimensiones y se aplican penalizaciones por irresponsabilidad y por omisión.
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 v6
cd analysis/
python process_plans_v6.py
# Salida esperada:
# ================================================================================
# PROCESADOR DE PLANES v6.0 - NEUTRAL + ESTRICTO
# 10 pilares | OCR automático | Penalizaciones por omisión
# ================================================================================
# 📄 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": -1, # No menciona seguridad operativa
"ignores_ccss": -1, # No menciona crisis CCSS
"ignores_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
}
# Pilares prioritarios (P3=Seguridad, P4=Salud, P1=Fiscal, P7=Reforma)
PRIORITY_PILLARS = {"P3", "P4", "P1", "P7"}
# Pesos por pilar
PILLAR_WEIGHTS = {
"P1": 0.14, # Finanzas
"P2": 0.11, # Empleo
"P3": 0.18, # Seguridad
"P4": 0.16, # Salud
"P5": 0.10, # Educación
"P6": 0.03, # Ambiente
"P7": 0.12, # Reforma
"P8": 0.05, # Social
"P9": 0.02, # Exterior
"P10": 0.09, # Infraestructura
} Versión del análisis: v6 (Neutral + Estricto) · Enero 2026