Cómo entrenar tu propio tokenizador BPE para español

Cómo entrenar tu propio tokenizador BPE para español

En el artículo anterior vimos que el tokenizador de GPT-2 (tiktoken) no está optimizado para español. «Aprendizaje automático» ocupaba 9 tokens y «procesamiento del lenguaje natural» 11. La solución no es aplicar reglas lingüísticas — BPE no entiende de diptongos — sino entrenar nuestro propio tokenizador con datos en español.

Y funciona. Hemos entrenado un BPE con los 18 GB completos de la Wikipedia en español y el resultado es una reducción del 59% en el número de tokens respecto al tokenizador de GPT-2.

Por qué entrenar tu propio tokenizador

Separador decorativo: línea quebrada con nodos en cian

Cada modelo de lenguaje exitoso tiene su propio tokenizador, entrenado con el corpus específico de ese modelo:

El proceso paso a paso

1. Obtener el corpus

Descargamos el dump completo de Wikipedia en español desde Wikimedia (~4.8 GB comprimido):

curl -L -o eswiki-latest-pages-articles.xml.bz2 \
  "https://dumps.wikimedia.org/eswiki/latest/eswiki-latest-pages-articles.xml.bz2"

Luego extraemos el texto de las páginas con un script Python que lee el XML comprimido directamente, procesando en fragmentos de 8 MB para no saturar la RAM.

Resultado: ~18 GB de texto, ~270 millones de líneas, ~4.8 millones de páginas.

2. Entrenar el BPE

Con el corpus listo, entrenar el tokenizador es sorprendentemente simple gracias a la librería tokenizers de Hugging Face:

from tokenizers import Tokenizer, models, trainers, pre_tokenizers

tokenizer = Tokenizer(models.BPE(unk_token=""))
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=True)

trainer = trainers.BpeTrainer(
    vocab_size=128000,
    special_tokens=["", "", "", "", ""],
    min_frequency=2,
)

# Alimentar línea por línea (18 GB, streaming)
for line in open("wikipedia-es.txt", encoding="utf-8"):
    tokenizer.train_from_iterator([line.strip()], trainer)

tokenizer.save("bpe-espanol-128k.json")

El proceso tarda unos 21 minutos en CPU y consume ~3 GB de RAM. No necesita GPU.

3. Los resultados

Modelo Tokenizador Vocabulario Entrenado con
GPT-2 BPE (tiktoken) 50.257 Texto inglés
GPT-4 BPE (tiktoken) ~100.000 Multilingüe
LLaMA 3 BPE (SentencePiece) 128.000 Multilingüe
**Nuestro BPE Español** **BPE (HF tokenizers)** **128.000** **Wikipedia española (18 GB)**

El tokenizador aprende «aprendizaje» como un solo token, «procesamiento» como uno solo, «desafortunadamente» como dos. Frases que antes necesitaban 11 tokens ahora caben en 4.

El contraejemplo: «fine tuning» (inglés) necesita 3 tokens con nuestro BPE español frente a 2 con tiktoken. Esto confirma que el tokenizador aprende del idioma del corpus — no es mejor ni peor, es específico del idioma.

El tokenizador está disponible

Puedes descargarlo y usarlo desde nuestro repositorio en GitHub:

https://github.com/Carlos-droid/bpe-espanol

from tokenizers import Tokenizer

tokenizer = Tokenizer.from_file("bpe-espanol-128k.json")

texto = "Hola, ¿cómo estás? Bienvenido al mundo de los LLMs."
encoded = tokenizer.encode(texto)
print(f"Tokens: {encoded.tokens}")    # Solo 6 tokens
print(f"IDs:    {encoded.ids}")

Qué hemos aprendido

1. BPE aprende del corpus, no de reglas. No necesita saber qué es un diptongo.

2. La escala importa. Con 6.5 MB los resultados fueron mediocres; con 18 GB son excelentes.

3. Cada idioma necesita su tokenizador. Usar el de GPT-2 para español duplica los tokens.

4. Entrenar un tokenizador es barato. 21 minutos en cualquier CPU, sin GPU.

Este tokenizador es el primer paso para construir nuestro propio modelo de lenguaje en español. En los próximos artículos lo usaremos para alimentar un transformer que entrenaremos desde cero en nuestra GTX 1070.

📚 Fuentes y recursos

– Repositorio del proyecto: https://github.com/Carlos-droid/bpe-espanol

– Artículo principal de la serie: Tokenización y Embeddings

– Hugging Face Tokenizers: https://github.com/huggingface/tokenizers

– Wikipedia dump: https://dumps.wikimedia.org/eswiki/

– Serie original de Giles Thomas (CC BY 4.0): https://www.gilesthomas.com/2024/12/llm-from-scratch-1

Comentarios

Una respuesta a «Cómo entrenar tu propio tokenizador BPE para español»

  1. […] lección: si quisieras construir un LLM para español, entrenarías tu propio tokenizador BPE con cientos de GB de texto en español. El algoritmo descubre por sí solo que sufijos como […]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Frase tiktoken (inglés) BPE español 128K Mejora
«aprendizaje automático» 9 tokens **2 tokens** **−78%**
«procesamiento del lenguaje natural» 11 tokens **4 tokens** **−64%**
«construyamos» 5 tokens **2 tokens** **−60%**
«desafortunadamente» 6 tokens **2 tokens** **−67%**
«espectrofotometría» 8 tokens **3 tokens** **−62%**
«inteligencia artificial» 4 tokens **2 tokens** **−50%**
«Hola, ¿cómo estás?» 11 tokens **6 tokens** **−45%**
«tokenización» 4 tokens **3 tokens** **−25%**
**Promedio** **7.3 tokens** **3.0 tokens** **−59%**