Codice Python che analizza il dataset FineWeb con grafici e dati

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.

Articoli simili