🇨🇷
CR Decide 2026

⚙️ 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

PDF

PyMuPDF (fitz)

Activo

Librerí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
📚 Documentación oficial →
👁️

Tesseract OCR

v5.5.1

Motor 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)
📚 Repositorio GitHub →
🔗

pytesseract

Python wrapper

Wrapper de Python para Tesseract OCR que facilita su integración.

pip install pytesseract
📚 PyPI →
🖼️

Pillow (PIL)

Procesamiento de imágenes

Fork 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
📚 Documentación oficial →

⚙️ 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

1

Lectura del PDF

fitz.open(pdf_path) abre el documento PDF.

2

Detección de Texto Corrupto

Se muestrean las primeras 10 páginas. Si >2% son caracteres de fuentes privadas, se activa OCR.

3

Extracción de Texto

Modo normal: page.get_text()
Modo OCR: Renderiza a imagen → Tesseract → texto

4

Búsqueda de Propuestas

Se buscan keywords por pilar y se extraen propuestas con contexto.

5

Evaluación y Penalización

Se evalúan las 4 dimensiones y se aplican penalizaciones por irresponsabilidad y por omisión.

6

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