Tokens en NLP: Tokenización de Texto

Tokens en NLP: Tokenización de Texto

Ahora que están en auge los LLMs, no paramos de escuchar el número de tokens que admite cada modelo, pero ¿qué son los tokens? Son las unidades mínimas de representación de las palabras

Para explicar qué son los tokens, primero veámoslo con un ejemplo práctico, vamos a usar el tokenizador de OpenAI, llamado tiktoken.

Así que, primero instalamos el paquete:

pip install tiktoken

Una vez instalado creamos un tokenizador usando el modelo cl100k_base, que en el notebook de ejemplo How to count tokens with tiktoken explica que es el usado por los modelos gpt-4, gpt-3.5-turbo y text-embedding-ada-002

	
< > Input
Python
import tiktoken
encoder = tiktoken.get_encoding("cl100k_base")
Copied

Ahora creamos una palabra de ejemplo para tokenizarla

	
< > Input
Python
example_word = "breakdown"
Copied

Y la tokenizamos

	
< > Input
Python
tokens = encoder.encode(example_word)
tokens
Copied
>_ Output
			
[9137, 2996]

Se ha dividido la palabra en 2 tokens, el 9137 y el 2996. Vamos a ver a qué palabras corresponden

	
< > Input
Python
word1 = encoder.decode([tokens[0]])
word2 = encoder.decode([tokens[1]])
word1, word2
Copied
>_ Output
			
('break', 'down')

El tokenizador de OpenAI ha dividido la palabra breakdown en las palabras break y down. Es decir, ha dividido la palabra en 2 más sencillas.

Esto es importante, ya que cuando se dice que un LLM admite x tokens no se refiere a que admite x palabras, sino a que admite x unidades mínimas de representación de las palabras.

Si tienes un texto y quieres ver el número de tokens que tiene para el tokenizador de OpenAI, puedes verlo en la página Tokenizer, que muestra cada token en un color diferente

tokenizer

Hemos visto el tokenizador de OpenAI, pero cada LLM podrá usar otro

Como hemos dicho, los tokens son las unidades mínimas de representación de las palabras, así que vamos a ver cuántos tokens distintos tiene tiktoken

	
< > Input
Python
n_vocab = encoder.n_vocab
print(f"Vocab size: {n_vocab}")
Copied
>_ Output
			
Vocab size: 100277

Vamos a ver cómo tokeniza otro tipo de palabras

	
< > Input
Python
def encode_decode(word):
tokens = encoder.encode(word)
decode_tokens = []
for token in tokens:
decode_tokens.append(encoder.decode([token]))
return tokens, decode_tokens
Copied
	
< > Input
Python
word = "dog"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "tomorrow..."
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "artificial intelligence"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "Python"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "12/25/2023"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "😊"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
Copied
>_ Output
			
Word: dog ==&gt; tokens: [18964], decode_tokens: ['dog']
Word: tomorrow... ==&gt; tokens: [38501, 7924, 1131], decode_tokens: ['tom', 'orrow', '...']
Word: artificial intelligence ==&gt; tokens: [472, 16895, 11478], decode_tokens: ['art', 'ificial', ' intelligence']
Word: Python ==&gt; tokens: [31380], decode_tokens: ['Python']
Word: 12/25/2023 ==&gt; tokens: [717, 14, 914, 14, 2366, 18], decode_tokens: ['12', '/', '25', '/', '202', '3']
Word: 😊 ==&gt; tokens: [76460, 232], decode_tokens: ['�', '�']

Por último vamos a verlo con palabras en otro idioma

	
< > Input
Python
word = "perro"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "perra"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "mañana..."
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "inteligencia artificial"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "Python"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "12/25/2023"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
word = "😊"
tokens, decode_tokens = encode_decode(word)
print(f"Word: {word} ==&gt; tokens: {tokens}, decode_tokens: {decode_tokens}")
Copied
>_ Output
			
Word: perro ==&gt; tokens: [716, 299], decode_tokens: ['per', 'ro']
Word: perra ==&gt; tokens: [79, 14210], decode_tokens: ['p', 'erra']
Word: mañana... ==&gt; tokens: [1764, 88184, 1131], decode_tokens: ['ma', 'ñana', '...']
Word: inteligencia artificial ==&gt; tokens: [396, 39567, 8968, 21075], decode_tokens: ['int', 'elig', 'encia', ' artificial']
Word: Python ==&gt; tokens: [31380], decode_tokens: ['Python']
Word: 12/25/2023 ==&gt; tokens: [717, 14, 914, 14, 2366, 18], decode_tokens: ['12', '/', '25', '/', '202', '3']
Word: 😊 ==&gt; tokens: [76460, 232], decode_tokens: ['�', '�']

Podemos ver para palabras similares, en español se generan más tokens que en inglés, por lo que para un mismo texto, con un número similar de palabras, el número de tokens será mayor en español que en inglés

Preguntas frecuentes

¿Por qué al decodificar el token de un emoji con tiktoken aparece el carácter ? en vez del emoji?

Porque tiktoken (con la codificación cl100k_base) trabaja a nivel de bytes, y un emoji como 😊 ocupa varios bytes en UTF-8 que se reparten entre dos tokens ([76460, 232] en el ejemplo del post). Al decodificar cada token por separado con encoder.decode([token]), cada uno representa solo una parte de la secuencia de bytes del emoji, que no forma un carácter UTF-8 válido por sí sola, así que Python la muestra como el carácter de sustitución ?. Solo al decodificar los dos tokens juntos se reconstruye el emoji original.

¿Por qué un mismo texto necesita más tokens en español que en inglés con el tokenizador de OpenAI?

Porque el vocabulario de tiktoken (100.277 tokens en cl100k_base, según encoder.n_vocab) está construido mayoritariamente a partir de texto en inglés, así que palabras inglesas comunes suelen caer en un único token mientras que sus equivalentes en español se fragmentan en más piezas. En el post se ve con "dog" → 1 token (['dog']) frente a "perro" → 2 tokens (['per', 'ro']), o "artificial intelligence" (3 tokens) frente a "inteligencia artificial" (4 tokens). El resultado es que, para un número similar de palabras, un texto en español consume más tokens que su equivalente en inglés.

Seguir leyendo

Últimos posts -->

¿Has visto estos proyectos?

Gymnasia

Gymnasia Gymnasia
Expo
React Native
TypeScript
OpenAI
Anthropic

App de fitness con dos agentes que se ejecutan íntegramente en el dispositivo, sin backend, de forma que los datos del usuario nunca salen del móvil. Un coach conversacional BYOK con adaptadores para OpenAI, Anthropic y Google, 12 tools locales y system prompt remoto con fallback offline, y un subagente de visión que estima macronutrientes a partir de fotos de comida, con lectura de códigos de barras contra OpenFoodFacts.

LangGraph Deep Researcher

LangGraph Deep Researcher LangGraph Deep Researcher
Python
LangGraph
FastAPI
React
TypeScript
Docker

Sistema multiagente de investigación construido con LangGraph. Un supervisor descompone tu pregunta en temas y lanza subagentes de búsqueda en paralelo; cada uno comprime sus hallazgos antes de pasarlos a un agente redactor que escribe el informe final en markdown con sus fuentes. Streaming en vivo por WebSockets, modelo configurable por rol y claves de API propias que nunca se guardan en el servidor.

Tau

Tau Tau
Python
LangChain

Sistema multiagente de tutoría para estudiantes de secundaria, con un agente por asignatura y material de curso elaborado y validado por un equipo de profesores. Llegó a usarse con alumnos reales en un colegio privado en España y en un instituto en Colombia.

Ver todos los proyectos -->
>_ Disponible para proyectos

¿Tienes un proyecto con IA?

Hablemos.

maximofn@gmail.com

Especialista en Machine Learning e Inteligencia Artificial. Desarrollo soluciones con IA generativa, agentes inteligentes y modelos personalizados.

¿Quieres ver alguna charla?

Últimas charlas -->

¿Quieres mejorar con estos tips?

Últimos tips -->

Usa esto en local

Los espacios de Hugging Face nos permite ejecutar modelos con demos muy sencillas, pero ¿qué pasa si la demo se rompe? O si el usuario la elimina? Por ello he creado contenedores docker con algunos espacios interesantes, para poder usarlos de manera local, pase lo que pase. De hecho, es posible que si pinchas en alún botón de ver proyecto te lleve a un espacio que no funciona.

Flow edit

Flow edit Flow edit

Edita imágenes con este modelo de Flow. Basándose en SD3 o FLUX puedes editar cualquier imagen y generar nuevas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos los contenedores -->
>_ Disponible para proyectos

¿Tienes un proyecto con IA?

Hablemos.

maximofn@gmail.com

Especialista en Machine Learning e Inteligencia Artificial. Desarrollo soluciones con IA generativa, agentes inteligentes y modelos personalizados.

¿Quieres entrenar tu modelo con estos datasets?

short-jokes-dataset

HuggingFace

Dataset de chistes en inglés

Uso: Fine-tuning de modelos de generación de texto humorístico

231K filas 2 columnas 45 MB
Ver en HuggingFace →

opus100

HuggingFace

Dataset con traducciones de inglés a español

Uso: Entrenamiento de modelos de traducción inglés-español

1M filas 2 columnas 210 MB
Ver en HuggingFace →

netflix_titles

HuggingFace

Dataset con películas y series de Netflix

Uso: Análisis de catálogo de Netflix y sistemas de recomendación

8.8K filas 12 columnas 3.5 MB
Ver en HuggingFace →
Ver más datasets -->