- Es un experimento para clasificar cerca de 8,4 millones de PDF de SafeDocs usando metadatos de URL, no el contenido original, y así etiquetar un corpus masivo de documentos a un costo realista
- En lugar de los 8 TB completos de PDF, usa alrededor de 8 GB de metadatos y etiquetas generadas por un LLM, aplicando el enfoque teacher/student tipo FineWeb a la clasificación de URL de PDF
- Un único clasificador de deep learning se quedó en 59,14% de exactitud con
Alibaba-large-gte-1.5, pero la combinación de embeddings de URL y XGBoost llegó hasta 85,26% después de una búsqueda de hiperparámetros - Un ensamble de XGBoost y LinearRegressor basado en TF-IDF también registró 67,52% y 70,68%, respectivamente, superando la línea base inicial de deep learning con métodos simples de NLP tradicional
- Se publicaron el dataset final de etiquetas, los embeddings, la información de descarga original y el código, para reutilizarlos en experimentos de clasificación de PDF o pipelines de datos para modelos VLM/Omni
Corpus de PDF SafeDocs y objetivo de clasificación
- Common Crawl es un archivo web de Internet y, cuando encuentra un PDF, no guarda el archivo completo, sino solo el primer 1 MB y recorta el resto
- SafeDocs o
CC-MAIN-2021-31-PDF-UNTRUNCATEDes un corpus creado volviendo a obtener los PDF de una snapshot de Common Crawl en versiones sin recortar - Este dataset está compuesto por cerca de 8,4 millones de PDF y tiene un tamaño total de 8 TB descomprimido
- El objetivo es clasificar los PDF con etiquetas temáticas
- Ej.: un PDF de Linear Algebra es Math
- Ej.: un libro de texto de Anatomy es Medicine
Crear etiquetas con metadatos de URL
- En vez de procesar directamente los 8 TB completos de contenido original, se usan los metadatos del dataset original
- Los metadatos son alrededor de 8 GB de texto
- La columna principal es
url
- El nombre de archivo en la URL sirve como pista para inferir el tipo de documento
- Ej.:
Introduction_to_Python_Programming_-_WEB.pdf - Ese nombre de archivo sugiere que podría ser un documento educativo o relacionado con tecnología
- Ej.:
- El método de etiquetado se toma del enfoque de FineWeb
- Un teacher, donde el LLM genera etiquetas a partir de texto no estructurado
- Un student, donde se entrena un clasificador más pequeño con las etiquetas generadas
- Se usaron el prompt y Llama-3-70B mediante la API de together para generar las primeras 100.000 etiquetas
- Como la distribución de etiquetas estaba desbalanceada y había muchas clases pequeñas, las etiquetas con menos de 250 ejemplos se combinaron en
other - Luego se tomaron como máximo 5.000 muestras de cada etiqueta para balancear y crear un dataset total de 59.000 etiquetas
Intento de fine-tuning de modelos de embeddings
- El primer enfoque fue procesar el texto de las URL con un modelo de embeddings y hacer fine-tuning para el problema de clasificación
- FineWeb Edu usó snowflake-arctic-embed-m, pero en el experimento también se revisaron modelos superiores del Massive Text Embeddings Benchmark
- Se consideró que los modelos de unos 7B parámetros serían difíciles de usar para clasificar rápidamente 8 millones de PDF, así que se probaron candidatos más pequeños
Stella_en_400Mgte-large-1.5- Arctic Embed
all-mpnet-basedistillbertflant-t5-smallbert-base-uncased
- Con Hugging Face se congeló el modelo base y solo se entrenaron los embeddings y la cabeza de clasificación, lo que permitió ejecutarlo incluso en una notebook
- El mejor modelo con este método fue
Alibaba-large-gte-1.5, con 59,14% de exactitud
Mejorar el rendimiento con XGBoost
- El segundo enfoque no usa el modelo de embeddings directamente como clasificador, sino que crea embeddings de URL y los usa como entrada para XGBoost
- Después de convertir el texto en embeddings, se entrena XGBoost como si fueran datos tabulares
- Se generaron embeddings para todos los enlaces de PDF, con un tamaño aproximado de 40 GB descomprimidos
- Los datos de embeddings están publicados en Kaggle
- En lugar de un único clasificador grande, se entrenaron clasificadores binarios por clase
- La idea viene de una antigua competencia de Kaggle
- El rendimiento promedio del modelo XGBoost con embeddings fue el siguiente
- accuracy: 0.839750
- precision: 0.859758
- recall: 0.819733
- f1: 0.838937
- Este enfoque produjo una exactitud 24,83 puntos porcentuales mayor que el enfoque inicial de deep learning
Resultados con TF-IDF y LinearRegressor
- El tercer enfoque consiste en crear características de texto con TF-IDF, sin embeddings de deep learning, y entrenar un modelo
- TF-IDF asigna mayor peso a palabras que aparecen con frecuencia en un documento específico, pero son raras en todo el corpus
- El rendimiento de XGBoost basado en TF-IDF fue el siguiente
- accuracy: 0.675200
- precision: 0.683185
- recall: 0.646316
- f1: 0.662497
- También se probó un ensamble de LinearRegressor basado en TF-IDF
- accuracy: 0.706802
- precision: 0.723558
- recall: 0.663038
- f1: 0.690286
- Ambos métodos lograron una exactitud superior a la línea base inicial de deep learning de 59,14%
Reintento de deep learning con más etiquetas de LLM
- Se fijó como objetivo para un único clasificador de deep learning una exactitud del 70%, y se generaron más etiquetas
- Las etiquetas adicionales se generaron con Llama3.1-7B, por un total de 400.000
- La razón para usar un modelo más pequeño que antes fue reducir el costo de inferencia
- En los experimentos, a mayor cantidad de datos, mejor fue el rendimiento
- Influenciados por The Llama 3 Herd of Models de Meta, se probaron
roberta-basey elgte-largeexistente gte-largealcanzó hasta 69,22% de exactitud en el dataset de entrenamiento
Rendimiento final por modelo
- Los resultados del experimento son los siguientes
| Model Name | Accuracy |
|---|---|
| gte-large naïve (59k labels) | 59.14% |
| XGBoost embeddings | 83.97% |
| XGBoost Tf-Idf | 67.52% |
| LinearRegressor Tf-Idf | 70.68% |
| gte-large naïve (400k labels) | 69.22% |
| XGBoost Embeddings HyperParameter Sweep | 85.26% |
- Finalmente, el mejor modelo fue XGBoost embeddings
- El modelo XGBoost con embeddings y búsqueda de hiperparámetros obtuvo el resultado más alto, con 85,26% de exactitud
Clasificación y visualización del corpus completo
- El código final tiene una estructura simple: carga los embeddings en memoria y luego realiza las predicciones
- La predicción de etiquetas para todos los PDF tardó alrededor de 1 hora
- No se usó GPU porque no se configuró la ejecución con GPU
- Se visualizaron los resultados de predicción y los embeddings con PCA y UMAP
- PCA visualizó cerca de 8,5 millones de puntos de todo el dataset en una sola imagen
- UMAP se ejecutó alquilando una máquina más grande
- Azure
Standard_E48s_v3 - 48 cores
- 384 GB de RAM
- 768 GB de disco
- UMAP se ejecutó hasta 6,5 millones de puntos; más allá de eso estaba cerca de quedarse sin memoria
- Azure
Datos y código publicados
- El dataset final está publicado en un repo de Hugging Face
- Si solo se necesitan los embeddings, se pueden obtener desde el dataset de Kaggle
- La información de descarga del dataset original de SafeDocs está en el bucket de S3
- El código de clasificación está en la ruta classify_metadata del monorepo de GitHub
- Como los PDF combinan datos e imágenes, se considera que podrían usarse con más frecuencia en pipelines de entrenamiento para modelos VLM/Omni
1 comentarios
Opiniones en Hacker News
Alrededor de 2009 hice un trabajo de visualización similar con unos 5,7 millones de artículos de investigación (PDF, corpus privado) de editoriales científicas como Elsevier y Springer.
Newton, G., A. Callahan & M. Dumontier. 2009. Semantic Journal Mapping for Search Visualization in a Large Scale Article Digital Library. Second Workshop on Very Large Digital Libraries at the European Conference on Digital Libraries (ECDL) 2009. https://lekythos.library.ucy.ac.cy/bitstream/handle/10797/14...
Soy el primer autor.
Si el benchmark de 2009 era de 13 horas, me da curiosidad saber qué tan rápido terminaría el cálculo hoy.
Hoy en día probablemente todos meterían esos datos en UMAP.
Y también si el ampersand
&tiene un significado distinto deand, o si simplemente es un formato de cita.Una de las ventajas de los embeddings de la que se habla menos últimamente es que se les pueden aplicar casi tal cual las técnicas tradicionales de modelado estadístico, y de paso se evitan las sutilezas y trampas del preprocesamiento habitual de NLP, como el stemming.
Este artículo muestra muy bien por qué es práctico usar directamente embeddings de LLM como primer paso de procesamiento de lenguaje natural, en especial para documentos largos.
Soy el autor. No esperaba que este artículo llegara a lo más alto de HN; pueden preguntarme lo que sea.
Revisé el código y había muchas cosas que no conocía; más que Python en sí, parece que hay muchas técnicas de análisis que desconozco.
¿Los PDF ya estaban clasificados?
Fue un artículo interesante y con muchos detalles. Pero al hacer aprendizaje binario uno contra todos, si se equilibra la distribución de clases y luego en la inferencia se usa la probabilidad máxima, puede haber problemas porque las probabilidades quizá no estén bien calibradas.
Me pregunto si haces alguna calibración de probabilidades por separado antes de tomar el
argmax.En 2006 ya había varias colecciones de torrents de libros de texto de 1 TB.
Imagino que ahora el tamaño y la cantidad habrán aumentado.
Recuerdo que todavía en 2008 era mucho más fácil encontrar libros de texto, solucionarios, PDF relacionados y otros materiales que 6 u 8 años después.
La mayor diferencia fue que varios sitios como Chegg empezaron a absorber ese material y a revenderlo de alguna forma.
La mayoría son materiales de electrónica e ingeniería, y los bajé de torrents hace unos 2 años cuando quería experimentar con GraphQL y materiales de OSR.
Yo tengo entre 20 y 40 TB de PDF (antes de deduplicar).
8 TB es mucho, sí, pero no está ni cerca del tamaño total de los PDF que existen en el mundo.
Yo también tengo una colección considerable de ebooks, PDF y cómics que junté para leer, pero no logro imaginar qué tan grande es una biblioteca de 20 TB.
Está claro que existen muchísimos más PDF que 8 TB. Probablemente haya muchos duplicados allí, pero como hay muchas imágenes, parece que la deduplicación no funcionaría tan bien.
Es un artículo interesante y entretenido. Probé varias soluciones de LLM/IA generativa para extraer datos tabulares de PDF, pero los resultados fueron peores de lo que esperaba.
Funcionan bien para extraer cadenas de texto o resumir, por ejemplo para preguntas como cuál es el monto total o cuándo se imprimió, pero tienen bastante error al extraerlo de forma confiable como CSV.
Podrías probar el servicio de particionamiento de Aryn: https://www.aryn.ai/post/announcing-the-aryn-partitioning-se...
Lo lanzamos recientemente y también hay un ejemplo de cómo convertir datos de tablas en PDF a dataframes de pandas. Después se pueden convertir a CSV: https://sycamore.readthedocs.io/en/stable/aryn_cloud/get_sta...
Genial. En Airtrain también comprobamos que los embeddings son muy valiosos para crear modelos de clasificación.
Si quieres trabajar con mucho texto y embeddings, recientemente deduplicamos e hicimos embeddings de todo fineweb-edu (también mencionado en el artículo) y subimos el dataset resultante a Hugging Face: https://huggingface.co/datasets/airtrain-ai/fineweb-edu-fort...
Es una idea muy buena. Últimamente no tengo mucho tiempo libre, pero hace poco pensé en hacer un proyecto parecido, aunque distinto.
Quería crear una herramienta open source para descargar datos de series temporales útiles para las ciencias sociales. Por ejemplo, una serie temporal de comentarios en redes sociales sobre precios de alimentos.
Creo que los LLM abrieron varios nuevos ángulos de investigación que la gente todavía no está usando mucho.
Si algún día hago ese proyecto paralelo, tal vez pueda tomar prestadas algunas buenas ideas.
Excelente trabajo. Usaste varios enfoques en conjunto, parecido a lo que a veces se hace en bibliotecas nacionales. Yo también he probado todo tipo de embeddings → clasificadores o LDA.
Me da curiosidad el prompt: https://github.com/snat-s/m/blob/main/classify_metadata/prom...
¿No es esto prácticamente lo mismo que dar un prompt para clasificar por tipo de URL?