Uso de Lift para convertir archivos PDF de investigación en JSON estructurado con evaluación a nivel de campo controlada y guiada por esquemas
def render_pdf(d, ruta): “””Dibuje un informe realista de 3 páginas. Los saltos de página se fuerzan para que la métrica del título en la página 1 (resumen) esté físicamente separada de la tabla de resultados en la página 3.””” de reportlab.lib.pagesizes import LETTER de reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle de reportlab.lib.units import inch de reportlab.lib import colores de reportlab.platypus import (SimpleDocTemplate, Párrafo, Espaciador, Tabla, TableStyle, PageBreak) ss = getSampleStyleSheet() H1 = ParagraphStyle(“H1”, parent=ss[“Title”]fontSize=16, interlineado=20, spaceAfter=6) AUTH = ParagraphStyle(“AUTH”, parent=ss[“Normal”]fontSize=9.5, textColor=colors.grey, spaceAfter=10) H2 = ParagraphStyle(“H2”, parent=ss[“Heading2”]fontSize=12, spaceBefore=8, spaceAfter=4) BODY = ParagraphStyle(“BODY”, parent=ss[“Normal”]fontSize=10, líder=14, spaceAfter=6) sota_phrase = (f”superando lo mejor anterior de {d[‘prior_best’]}” si d[“beats_sota”] else f”acercarse pero no superar el mejor resultado anterior de {d[‘prior_best’]}”) autores_line = “, “.join(f”{n} ({a})” para (n, a) en d[“authors”]) historia = []
historia += [Paragraph(d[“title”]H1), Párrafo(autores_línea, AUTH), Párrafo(“Resumen”, H2)]historia += [Paragraph(
f”We introduce {d[‘method’]}, un modelo para {d[‘task’]}. El {d[‘primary_benchmark’]} “f”punto de referencia, {d[‘method’]} alcanza {d[‘test_acc’]} {d[‘metric_name’]} en el conjunto de prueba ” f” retenido, {sota_phrase}. Nuestro {d[‘params_m’]}El modelo de parámetros M se evalúa en ” f”{len(d[‘datasets’])} conjuntos de datos ({‘, ‘.join(d[‘datasets’])}). ” f”Ablaciones extensas confirman la contribución de cada componente.”, CUERPO)]historia += [Paragraph(“Keywords”, H2),
Paragraph(f”{d[‘task’]}; aprendizaje de representación; {d[‘primary_benchmark’]}”, CUERPO), Salto de página()]historia += [Paragraph(“1 Method and Training Details”, H2)]
historia += [Paragraph(
f”{d[‘method’]} se entrena de un extremo a otro con {d[‘optimizer’]} optimizador. ” f”Ajustamos una división de validación e informamos los números finales de la división de prueba. ” f”La configuración de entrenamiento completa se resume en la Tabla 1.”, CUERPO)]hp = [[“Hyperparameter”, “Value”],
[“Optimizer”, d[“optimizer”]],
[“Learning rate”, str(d[“lr”])],
[“Batch size”, str(d[“batch”])],
[“Epochs”, str(d[“epochs”])],
[“Parameters”, f”{d[‘params_m’]}M”]]t1 = Tabla(hp, colWidths=[2.4 * inch, 2.0 * inch]) t1.setStyle(TableStyle([
(“BACKGROUND”, (0, 0), (-1, 0), colors.HexColor(“#2b3a67”)),
(“TEXTCOLOR”, (0, 0), (-1, 0), colors.white),
(“FONTSIZE”, (0, 0), (-1, -1), 9.5),
(“GRID”, (0, 0), (-1, -1), 0.4, colors.grey),
(“ROWBACKGROUNDS”, (0, 1), (-1, -1), [colors.white, colors.HexColor(“#eef1f8”)]), (“LEFTPADDING”, (0, 0), (-1, -1), 8), (“TOPPADDING”, (0, 0), (-1, -1), 4), (“BOTTOMPADDING”, (0, 0), (-1, -1), 4)])) historia += [Spacer(1, 4), t1, Spacer(1, 6),
Paragraph(“Table 1. Training configuration.”, BODY),
Paragraph(“2 Datasets”, H2),
Paragraph(
f”We evaluate on {‘, ‘.join(d[‘datasets’])}. {d[‘primary_benchmark’]} es nuestro punto de referencia principal “f”; los conjuntos de datos restantes se utilizan para la generalización ” f”estudios.”, BODY), PageBreak()]historia += [Paragraph(“3 Results”, H2)]
res = [[“Method”, f”Val. {d[‘metric_name’]}”, f”Prueba {d[‘metric_name’]}”],
[f”{d[‘baseline_name’]} (línea de base)”, str(d[“baseline_val”]), cadena(d[“baseline_test”])],
[f”{d[‘method’]} (nuestro)”, str(d[“val_acc”]), cadena(d[“test_acc”])]]t2 = Tabla(res, colWidths=[2.6 * inch, 1.7 * inch, 1.7 * inch]) t2.setStyle(TableStyle([
(“BACKGROUND”, (0, 0), (-1, 0), colors.HexColor(“#7a2e2e”)),
(“TEXTCOLOR”, (0, 0), (-1, 0), colors.white),
(“FONTSIZE”, (0, 0), (-1, -1), 9.5),
(“GRID”, (0, 0), (-1, -1), 0.4, colors.grey),
(“FONTNAME”, (0, 2), (-1, 2), “Helvetica-Bold”),
(“ROWBACKGROUNDS”, (0, 1), (-1, -1), [colors.white, colors.HexColor(“#f7eeee”)]), (“LEFTPADDING”, (0, 0), (-1, -1), 8), (“TOPPADDING”, (0, 0), (-1, -1), 4), (“BOTTOMPADDING”, (0, 0), (-1, -1), 4)])) historia += [Spacer(1, 4), t2, Spacer(1, 6),
Paragraph(f”Table 2. Results on {d[‘primary_benchmark’]}. ” f”Mejor resultado de la prueba en negrita.”, CUERPO), Párrafo(“4 Limitaciones”, H2)]para lim en d[“limitations”]: historia += [Paragraph(“• ” + lim, BODY)]
historia += [Paragraph(“5 Funding and Code Availability”, H2),
Paragraph(d[“funding_note”]CUERPO)]SimpleDocTemplate(ruta, tamaño de página=LETRA, margen superior=0,8 * pulgada, margen inferior=0,8 * pulgada, margen izquierdo=0,9 * pulgada, margen derecho=0,9 * pulgada).build(story) print(“PASO 3/7 · Generación de archivos PDF de informes sintéticos…”) CORPUS = []
para i, d en enumerar(DOCS): ruta = f”/content/report_{i}.pdf” if os.path.isdir(“/content”) else f”report_{i}.pdf” render_pdf(d, ruta) CORPUS.append((d, ground_truth(d), ruta)) print(f” ✓ {os.path.basename(ruta)} — {d[‘method’]}”) print() si SHOW_FIRST_PAGE: intente: importar pypdfium2 como pdfium, matplotlib.pyplot como plt pg = pdfium.PdfDocument(CORPUS[0][2])[0]
img = pg.render(scale=2.0).to_pil() plt.figure(figsize=(6.4, 8.3)); plt.imshow(img); plt.axis(“off”) plt.title(“Lo que lee el ascensor: página 1 de report_0.pdf”, fontsize=10); plt.show() excepto Excepción como e: print(” (vista previa de la página omitida:”, e, “)\n”)