Analisi pratica di FineWeb: streaming, filtri di qualità, deduplicazione e tokenizer
FineWeb è il dataset di Hugging Face con oltre 15 trilioni di token di crawl web, già filtrato per qualità. In questo tutorial vediamo come esplorarlo senza scaricare i multi-terabyte, applicando in Python semplificato i suoi stessi controlli di qualità, la deduplicazione con MinHash e la verifica dei conteggi token.
Partiamo installando le librerie necessarie: datasets per lo streaming, datasketch per MinHash, tiktoken per il tokenizer GPT-2, pandas per l’analisi e matplotlib per i grafici. Tutto in Python, tutto eseguibile in locale.
Streaming e struttura del dataset
Con load_dataset('HuggingFaceFW/fineweb', name='sample-10BT', split='train', streaming=True) carichiamo 3.000 documenti dal subset sample-10BT. Non si scarica l’intero corpus. Convertiamo i record in un DataFrame e ispezioniamo le colonne principali: url, language, language_score e token_count. Un esempio mostra la struttura completa del record, con testo, metadati e punteggi.
Filtri di qualità: Gopher, C4 e personalizzati
FineWeb è già pulito, ma riproduciamo le sue euristiche per capire cosa viene scartato. Implementiamo tre controlli:
- Gopher-style: verifica che il numero di parole sia tra 50 e 100.000, che la lunghezza media delle parole sia tra 3 e 10, che la frazione di simboli come # e … non superi il 10%, che le liste non siano più del 90% delle righe e che ci siano almeno 2 stopwords comuni.
- C4-style: controlla che non ci sia boilerplate (es. “lorem ipsum”, “javascript is disabled”) e che le parentesi graffe non siano eccessive.
- Custom FineWeb: misura la frazione di righe duplicate (soglia 30%) e la frazione di righe corte (soglia 67% se ci sono più di 5 righe).
Nei nostri 3.000 documenti la quasi totalità supera tutti i filtri, come previsto per un dataset già curato. Le poche rejection riguardano casi limite di testo non standard.
Deduplicazione con MinHash
Per trovare duplicati vicini (non identici al 100%, ma simili per soglia Jaccard) usiamo MinHash con Locality Sensitive Hashing. Ogni documento viene convertito in shingles di 5 parole (minuscole), su cui calcoliamo 128 permutation hash. Inseriamo i MinHash in una LSH con soglia 0.7. Nei nostri 3.000 documenti non troviamo coppie duplicate, segno che il dataset è ben deduplicato a livello di crawl. Se ci fossero, stamperemmo un esempio con la stima dello score Jaccard.
Verifica del token_count con GPT-2
Il campo token_count di FineWeb è calcolato con il tokenizer GPT-2. Lo riconfermiamo sui primi 200 documenti usando tiktoken. La differenza assoluta media rispetto al valore archiviato è di poche unità, con circa il 90% di match esatti. Le piccole discrepanze sono dovute a versioni diverse del tokenizer. Inoltre calcoliamo i caratteri per token: in media circa 4.5 caratteri per token, un valore tipico per testi in inglese.
Analisi dei domini e distribuzioni
Dal campo url estraiamo il dominio (senza www) e vediamo i primi 15. La distribuzione è piuttosto uniforme, senza un dominio dominante. Poi plottiamo quattro grafici:
- Token count per documento: istogramma con limite superiore a 4000 token. La maggior parte dei documenti ha tra 200 e 1000 token.
- Language score: il punteggio di lingua inglese da fastText. FineWeb usa una soglia a 0.65: i nostri dati hanno la maggior parte dei punteggi sopra 0.8, con la linea rossa che segna la soglia.
- Caratteri per token: distribuzione concentrata tra 3 e 6 caratteri per token.
