Un'esplorazione della tokenizzazione¶
Luca Mari, settembre 2024
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 4.0 Internazionale.
Obiettivo: comprendere la logica della "tokenizzazione", il processo con cui un testo viene trasformato in una successione di elementi linguistici elementari ("token").
Precompetenze: basi di Python.
Per eseguire questo notebook, supponiamo con VSCode, occorre:
- installare un interprete Python
- scaricare da https://code.visualstudio.com/download e installare VSCode
- eseguire VSCode e attivare le estensioni per Python e Jupyter
- ancora in VSCode:
- creare una cartella di lavoro e renderla la cartella corrente
- copiare nella cartella i file di questa attività: tokenize.ipynb, tokenizeutils.py]
- aprire il notebook
tokenize.ipynb
- creare un ambiente virtuale locale Python (Select Kernel | Python Environments | Create Python Environment | Venv, e scegliere un interprete Python):
- installare i moduli Python richiesti, eseguendo dal terminale:
pip install torch transformers multimethod colorama python-docx
Una prima elaborazione di un testo dato -- una frase, un paragrafo, un documento, ... -- è spesso la sua trasformazione in una successione di elementi linguistici elementari ("token"), tratti da un vocabolario dato.
Per mostrare un esempio di questo processo di tokenizzazione, per prima cosa importiamo il modulo che contiene le funzioni per consentire un accesso "di alto livello" al modello pre-addestrato che opererà come tokenizzatore, usando in questo caso una versione pre-addestrata e fine tuned, su testi in italiano, di BERT
, che è un transformer "open" (https://it.wikipedia.org/wiki/BERT) ed eseguibile anche localmente (alla prima esecuzione sarà dunque necessario attendere che il modello sia scaricato dal sito di Hugging Face: è un file di circa 400 MB che viene copiato nella cartella HFdata della propria cartella personale).
from tokenizeutils import Model, colorize
model = Model('dbmdz/bert-base-italian-xxl-cased', True)
print(f"Il tokenizzatore ha un vocabolario di {model.vocab_size} token che riconosce.")
Il tokenizzatore ha un vocabolario di 31102 token che riconosce.
Data una frase, chiediamo al tokenizzatore di trasformarla nella lista dei suoi token, ognuno dei quali corrispondente a un identificatore numerico univoco nel vocabolario.
Può accadere ovviamente che una parola non sia presente nel vocabolario, cioè non sia riconosciuta come un token: in tal caso il tokenizzatore la separa in componenti, ognuno dei quali sia invece un token (per rendere evidente questa separazione, il tokenizzatore aggiunge la stringa "##").
frase = "I sistemi di intelligenza artificiale generativa stanno evolvendo rapidamente."
tokens = model.tokenizer.tokenize(frase)
print(tokens)
token_ids = model.tokenizer.convert_tokens_to_ids(tokens)
print(token_ids)
['I', 'sistemi', 'di', 'intelligenza', 'artificiale', 'generati', '##va', 'stanno', 'evol', '##vendo', 'rapidamente', '.'] [184, 2839, 120, 21486, 13435, 29518, 187, 2799, 8599, 4802, 5798, 697]
Alternando i colori, il risultato della tokenizzazione è forse ancora più chiaro.
print(colorize(tokens, clean=True))
I sistemi di intelligenza artificiale generati va stanno evol vendo rapidamente .
Poiché la funzione che associa un identificatore numerico a ogni token è invertibile, è sempre possibile ricostruire la frase di partenza dalla successione degli identificatori numerici.
print(model.tokenizer.decode(token_ids))
I sistemi di intelligenza artificiale generativa stanno evolvendo rapidamente.
Per curiosità, possiamo facilmente esplorare il contenuto del vocabolario, elencando alcuni dei token che contiene: è chiaro che non c'è una logica chiara nell'ordine con cui i token compaiono.
for i in range(6100, 6200):
print(model.tokenizer.decode([i]), end=('\n' if i % 10 == 9 else ' '))
dichiarato opportuno ordini arrivo lasci SP Può sogno bellezza ##OD ##scritto Zo vicin impegno lavorato conformemente ##ttorno Ancora faceva esplo magari Max ##tria produttore ricordare ##mentato dottor Slo quota resti presentazione 92 é ##nno privata UN accol strade Air collegamento ##isca Antonio Dan arma offerta spettacolo ##ustralia ##uori occidentale ##74 Ricor My fla ##-200 custo Belgio ##.12. Barcellona ##autorità motori assicurare ##esercizio ##bio sport ##95 bol frattempo deten ##cenze ##TER ##uogo disciplina numeri ##teriormente ##gelo ottimo registrato ##esame ricord selezione ##inione consegui ##ds ##tentri conosco tradizionale trasferimento qualifica interni ##derci rea proposto Natura ##monian adulti World ##glione ##onale ##ffo ##Com