Suddivisione dei token
I modelli di linguaggio hanno limiti di token. Non si dovrebbe superare il limite di token. Pertanto, quando si suddivide il testo in frammenti, è meglio calcolare il numero di token. Esistono molti processori di token (tokenizer) disponibili. Quando si calcola il numero di token nel testo, si dovrebbe utilizzare lo stesso processore di token utilizzato nel modello di linguaggio.
Questo capitolo introduce come LangChain utilizza vari tokenizer per suddividere il contenuto del testo in base ai token.
tiktoken
tiktoken è un rapido tokenizer BPE open source sviluppato da OpenAI.
Possiamo usarlo per stimare il numero di token utilizzati. Potrebbe essere più accurato per i modelli OpenAI.
- Come viene suddiviso il testo: in base ai caratteri di input.
- Come viene misurata la dimensione del frammento: utilizzando il tokenizer
tiktoken
.
%pip install --upgrade --quiet langchain-text-splitters tiktoken
with open("../../../state_of_the_union.txt") as f:
state_of_the_union = f.read()
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
Madam Speaker, Signora Vice Presidente, la nostra Prima Signora e il Secondo Signore. Membri del Congresso e del Governo. Giudici della Corte Suprema. Miei cari americani.
L'anno scorso il COVID-19 ci ha tenuti separati. Quest'anno siamo finalmente di nuovo insieme.
Stasera ci incontriamo come Democratici, Repubblicani e Indipendenti. Ma soprattutto come americani.
Con il dovere l'uno verso l'altro, verso il popolo americano, verso la Costituzione.
Possiamo anche caricare direttamente lo splitter tiktoken.
from langchain_text_splitters import TokenTextSplitter
text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
spaCy
spaCy è una libreria software open source per l'elaborazione avanzata del linguaggio naturale scritta in Python e Cython.
Un'altra alternativa all'uso di NLTK è utilizzare il tokenizer spaCy.
- Come viene suddiviso il testo: utilizzando il tokenizer
spaCy
. - Come viene misurata la dimensione del frammento: contando il numero di caratteri.
with open("../../../state_of_the_union.txt") as f:
state_of_the_union = f.read()
from langchain_text_splitters import SpacyTextSplitter
text_splitter = SpacyTextSplitter(chunk_size=1000)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
SentenceTransformers
SentenceTransformersTokenTextSplitter
è uno splitter di testo progettato specificamente per il modello sentence-transformer. Il suo comportamento predefinito è quello di suddividere il testo in blocchi di dimensioni finestra dei token adatti al modello sentence-transformer desiderato.
from langchain_text_splitters import SentenceTransformersTokenTextSplitter
splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=0)
text = "Lorem "
count_start_and_stop_tokens = 2
text_token_count = splitter.count_tokens(text=text) - count_start_and_stop_tokens
print(text_token_count)
2
token_multiplier = splitter.maximum_tokens_per_chunk // text_token_count + 1
text_to_split = text * token_multiplier
print(f"token nel testo da suddividere: {splitter.count_tokens(text=text_to_split)}")
token nel testo da suddividere: 514
text_chunks = splitter.split_text(text=text_to_split)
print(text_chunks[1])
lorem
NLTK
Kit di strumenti di linguaggio naturale, più comunemente conosciuto come NLTK, è un insieme di librerie e programmi per il processamento simbolico e statistico del linguaggio naturale (NLP) scritti nel linguaggio di programmazione Python, utilizzati per l'inglese.
Invece di semplicemente dividere il testo in base a "\n\n", possiamo utilizzare NLTK per suddividerlo in base al tokenizzatore NLTK.
- Metodo di divisione del testo: utilizzo del tokenizzatore NLTK.
- Misurazione della dimensione del segmento: misurata dal numero di caratteri.
with open("../../../state_of_the_union.txt") as f:
state_of_the_union = f.read()
from langchain_text_splitters import NLTKTextSplitter
text_splitter = NLTKTextSplitter(chunk_size=1000)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
Tokenizzatore Hugging Face
Hugging Face ha molti tokenizzatori.
Utilizziamo il GPT2TokenizerFast dei tokenizzatori Hugging Face per calcolare il numero di token nel testo.
- Come il testo è segmentato: segmentato in base ai caratteri di input.
- Come è calcolata la dimensione del segmento: misurata dal numero di token calcolati dal tokenizzatore Hugging Face.
from transformers import GPT2TokenizerFast
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
with open("../../../state_of_the_union.txt") as f:
state_of_the_union = f.read()
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
tokenizer, chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])