Classer tous les PDF d’Internet
(snats.xyz)- Il s’agit d’une expérimentation visant à classer environ 8,4 millions de PDF de SafeDocs à partir des métadonnées d’URL plutôt que du texte intégral, afin d’étiqueter un vaste corpus documentaire à un coût réaliste
- Au lieu des 8 To de PDF complets, l’approche utilise environ 8 Go de métadonnées et des labels générés par LLM, en appliquant une approche teacher/student à la FineWeb à la classification d’URL de PDF
- Un classifieur deep learning unique plafonnait à 59,14 % de précision avec
Alibaba-large-gte-1.5, mais la combinaison embeddings d’URL + XGBoost monte à 85,26 % après recherche d’hyperparamètres - Un ensemble XGBoost et LinearRegressor basé sur TF-IDF a aussi obtenu respectivement 67,52 % et 70,68 %, montrant que des méthodes NLP traditionnelles simples dépassent la baseline deep learning initiale
- Le dataset final de labels, les embeddings, les informations de téléchargement d’origine et le code sont publiés pour pouvoir être réutilisés dans des expériences de classification de PDF ou de pipelines de données pour des modèles VLM/Omni
Corpus PDF SafeDocs et objectif de classification
- Common Crawl est une archive web d’Internet et, lorsqu’il rencontre un PDF, il ne stocke que le premier mégaoctet du fichier complet avant de tronquer le reste
- SafeDocs ou
CC-MAIN-2021-31-PDF-UNTRUNCATEDest un corpus constitué en retéléchargeant les PDF d’un snapshot Common Crawl pour en faire une version non tronquée - Ce dataset contient environ 8,4 millions de PDF, pour un volume total d’environ 8 To une fois décompressé
- L’objectif est de classer les PDF par labels thématiques
- Ex. : un PDF de Linear Algebra relève de Math
- Ex. : un manuel d’Anatomy relève de Medicine
Créer des labels à partir des métadonnées d’URL
- Au lieu de traiter directement les 8 To de contenu complet, l’approche utilise les métadonnées du dataset d’origine
- Les métadonnées représentent environ 8 Go de texte
- La colonne clé est
url
- Le nom de fichier dans l’URL donne des indices sur la nature du document
- Ex. :
Introduction_to_Python_Programming_-_WEB.pdf - Ce nom de fichier suggère qu’il s’agit probablement d’un document pédagogique ou technique
- Ex. :
- La méthode de labellisation reprend l’approche de FineWeb
- un teacher où un LLM génère des labels à partir de texte non structuré
- un student entraîné ensuite sur ces labels générés
- Le prompt et Llama-3-70B via l’API together ont servi à générer un premier lot de 100 000 labels
- Comme la distribution des labels est déséquilibrée et comporte beaucoup de petites classes, les labels avec moins de 250 occurrences ont été regroupés dans
other - En prenant ensuite au maximum 5 000 échantillons par label pour rééquilibrer l’ensemble, cela donne un dataset final de 59 000 labels
Tentative de fine-tuning d’un modèle d’embeddings
- La première approche consiste à traiter le texte des URL avec un modèle d’embeddings, puis à le fine-tuner pour le problème de classification
- FineWeb Edu utilisait snowflake-arctic-embed-m, mais l’expérimentation a aussi examiné des modèles bien classés dans le Massive Text Embeddings Benchmark
- Les modèles d’environ 7B de paramètres ont été jugés peu adaptés à une classification rapide de 8 millions de PDF, donc des candidats plus petits ont été testés
Stella_en_400Mgte-large-1.5- Arctic Embed
all-mpnet-basedistillbertflant-t5-smallbert-base-uncased
- Avec Hugging Face, le modèle de base a été figé et seuls les embeddings et la tête de classification ont été entraînés, afin de pouvoir exécuter le tout même sur notebook
- Dans cette configuration, le meilleur modèle a été
Alibaba-large-gte-1.5, avec une précision de 59,14 %
Faire monter les performances avec XGBoost
- La deuxième approche n’utilise pas directement le modèle d’embeddings comme classifieur, mais génère des embeddings d’URL pour les donner en entrée à XGBoost
- Le texte est transformé en embeddings, puis XGBoost est entraîné comme sur des données tabulaires
- Les embeddings de l’ensemble des liens PDF ont été générés, pour un volume d’environ 40 Go une fois décompressé
- Les données d’embeddings sont publiées sur Kaggle
- Plutôt qu’un seul gros classifieur, l’approche entraîne des classifieurs binaires par classe
- L’idée vient d’une ancienne Kaggle competition
- Les performances moyennes du modèle XGBoost sur embeddings sont les suivantes
- accuracy: 0.839750
- precision: 0.859758
- recall: 0.819733
- f1: 0.838937
- Cette approche gagne 24,83 points de précision par rapport à l’approche deep learning initiale
Résultats TF-IDF et LinearRegressor
- La troisième approche construit des caractéristiques textuelles avec TF-IDF sans embeddings deep learning, puis entraîne le modèle
- TF-IDF donne plus de poids aux mots fréquents dans un document donné mais rares dans l’ensemble du corpus
- Les performances de XGBoost basé sur TF-IDF sont les suivantes
- accuracy: 0.675200
- precision: 0.683185
- recall: 0.646316
- f1: 0.662497
- Un ensemble LinearRegressor basé sur TF-IDF a aussi été testé
- accuracy: 0.706802
- precision: 0.723558
- recall: 0.663038
- f1: 0.690286
- Les deux méthodes dépassent la baseline deep learning initiale de 59,14 %
Refaire du deep learning avec davantage de labels LLM
- L’objectif pour le classifieur deep learning unique a été fixé à 70 % de précision, ce qui a conduit à générer davantage de labels
- 400 000 labels supplémentaires ont été générés avec Llama3.1-7B
- Ce modèle plus petit a été choisi pour réduire le coût d’inférence
- Les expériences montrent que les performances augmentent avec la quantité de données
- Inspiré par l’article de Meta The Llama 3 Herd of Models, l’auteur a testé
roberta-baseet legte-largedéjà utilisé gte-largea atteint jusqu’à 69,22 % de précision sur le dataset d’entraînement
Performances finales par modèle
- Les résultats expérimentaux sont les suivants
| 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% |
- Au final, le meilleur modèle est XGBoost embeddings
- Le modèle XGBoost sur embeddings avec recherche d’hyperparamètres obtient le meilleur résultat, avec 85,26 % de précision
Classification du corpus complet et visualisation
- Le code final repose sur une structure simple : charger les embeddings en mémoire puis lancer les prédictions
- La prédiction des tags sur l’ensemble des PDF prend environ 1 heure
- Aucun réglage d’exécution GPU n’ayant été activé, le GPU n’a pas été utilisé
- Les prédictions et embeddings ont été visualisés avec PCA et UMAP
- La PCA visualise environ 8,5 millions de points du dataset complet dans une seule image
- UMAP a été exécuté sur une machine plus puissante louée pour l’occasion
- Azure
Standard_E48s_v3 - 48 cœurs
- 384 Go de RAM
- 768 Go de disque
- UMAP a pu monter jusqu’à 6,5 millions de points, au-delà la mémoire était presque saturée
- Azure
Données et code publiés
- Le dataset final est publié dans ce repo Hugging Face
- Si seuls les embeddings sont nécessaires, ils peuvent être récupérés depuis ce dataset Kaggle
- Les informations de téléchargement du dataset SafeDocs d’origine sont disponibles dans ce bucket S3
- Le code de classification se trouve dans le chemin classify_metadata du monorepo GitHub
- Comme les PDF mélangent données et images, ils pourraient être davantage utilisés dans les pipelines d’entraînement de modèles VLM/Omni
1 commentaires
Avis de Hacker News
Vers 2009, j’ai réalisé un travail de visualisation similaire sur environ 5,7 millions d’articles de recherche (PDF, corpus privé) d’éditeurs scientifiques comme Elsevier et 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...
J’en suis le premier auteur
Si le benchmark de 2009 était de 13 heures, je me demande à quelle vitesse le calcul se terminerait aujourd’hui
De nos jours, tout le monde aurait probablement envoyé ces données dans UMAP
Et si l’esperluette
&a un sens différent deand, ou si c’est simplement un format de citationL’un des avantages des embeddings dont on parle moins aujourd’hui, c’est qu’on peut leur appliquer presque tels quels les méthodes de modélisation statistique classiques, avec en prime l’évitement des subtilités et pièges des prétraitements NLP courants comme la racinisation
Cet article montre particulièrement bien pourquoi il est pratique d’utiliser directement des embeddings LLM comme première étape de traitement du langage naturel, surtout pour les documents longs
Je suis l’auteur. Je ne pensais pas que cet article arriverait en tête de HN, vous pouvez me poser n’importe quelle question
J’ai regardé le code et beaucoup de choses m’étaient inconnues ; ce ne semble pas être Python lui-même, mais plutôt de nombreuses techniques d’analyse que je ne connais pas
Les PDF étaient-ils déjà classés ?
Article intéressant et très détaillé. Cela dit, lorsqu’on fait de l’apprentissage binaire un-contre-tous, équilibrer les classes puis utiliser la probabilité maximale à l’inférence peut poser problème, car les probabilités risquent de ne pas être correctement calibrées
Je me demande si une calibration des probabilités est effectuée séparément avant de prendre l’
argmaxEn 2006 déjà, il existait plusieurs collections de torrents d’1 To de manuels scolaires
Aujourd’hui, elles doivent être plus grosses et plus nombreuses
Je me souviens qu’en 2008 encore, il était beaucoup plus facile de trouver des manuels, corrigés, PDF liés et autres ressources que 6 à 8 ans plus tard
La plus grande différence, c’est que plusieurs sites comme Chegg ont commencé à aspirer ces ressources et à les revendre d’une manière ou d’une autre
Ce sont surtout des ressources liées à l’électronique et à l’ingénierie, récupérées sur des torrents il y a environ deux ans quand je voulais tester GraphQL et des ressources OSR
J’ai environ 20 à 40 To de PDF (avant déduplication)
8 To, c’est déjà beaucoup, mais on est très loin de l’ensemble des PDF existant dans le monde
J’ai moi aussi une collection assez conséquente d’ebooks, de PDF et de mangas accumulés pour les lire, mais j’ai du mal à imaginer à quel point une bibliothèque de 20 To est grande
Il y a clairement beaucoup plus de PDF que 8 To. Il y a sans doute beaucoup de doublons dedans, mais comme il y a beaucoup d’images, la déduplication risque de ne pas bien fonctionner
Article intéressant et amusant. J’ai testé plusieurs solutions LLM/IA générative pour extraire des données tabulaires depuis des PDF, mais les résultats ont été moins bons qu’espéré
Elles sont bonnes pour extraire des chaînes de texte ou résumer, par exemple répondre à des questions comme le montant total ou la date d’impression, mais il y a encore pas mal d’erreurs pour produire du CSV de manière fiable
Vous pourriez essayer le service de partitionnement d’Aryn : https://www.aryn.ai/post/announcing-the-aryn-partitioning-se...
Il est sorti récemment, et il y a aussi un exemple qui transforme les données de tableaux dans des PDF en dataframes pandas. On peut ensuite les convertir en CSV : https://sycamore.readthedocs.io/en/stable/aryn_cloud/get_sta...
Super. Chez Airtrain aussi, nous avons constaté que les embeddings sont très précieux pour créer des modèles de classification
Si vous voulez manipuler beaucoup de texte et d’embeddings, nous avons récemment dédupliqué et généré des embeddings pour l’intégralité de fineweb-edu (mentionné aussi dans l’article), puis publié le dataset résultant sur Hugging Face : https://huggingface.co/datasets/airtrain-ai/fineweb-edu-fort...
Très belle idée. Je n’ai pas beaucoup de temps libre ces jours-ci, mais j’ai récemment envisagé un projet similaire tout en étant différent
Je voulais créer un outil open source pour télécharger des données de séries temporelles utiles aux sciences sociales. Par exemple, des séries temporelles de commentaires sur les réseaux sociaux à propos du prix des produits alimentaires
Grâce aux LLM, j’ai l’impression que plusieurs nouveaux angles de recherche encore peu exploités s’ouvrent
Si je finis un jour par faire ce side project, je pourrai peut-être reprendre quelques bonnes idées
Excellent travail. Vous avez combiné plusieurs approches, un peu comme le font parfois les bibliothèques nationales. J’ai moi aussi essayé toutes sortes de pipelines embeddings → classifieur ou LDA
Le prompt m’intrigue : https://github.com/snat-s/m/blob/main/classify_metadata/prom...
N’est-ce pas en pratique assez proche d’un prompt qui demande de classer par type d’URL ?