Skip to content

Commit

Permalink
Translate Chapter 3 to Spanish (#510)
Browse files Browse the repository at this point in the history
* translate Chapter 3 to Spanish

* translate code comments to Spanish and fix typos
  • Loading branch information
mariagrandury authored Oct 23, 2023
1 parent 3423281 commit 5828ea1
Show file tree
Hide file tree
Showing 14 changed files with 843 additions and 78 deletions.
12 changes: 11 additions & 1 deletion chapters/es/_toctree.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,25 @@
title: ¡Haz completado el uso básico!
- local: chapter2/8
title: Quiz de final de capítulo
quiz: 2

- title: 3. Ajuste (fine-tuning) de un modelo preentrenado
sections:
- local: chapter3/1
title: Introducción
- local: chapter3/2
title: Procesamiento de los datos
- local: chapter3/3
title: Ajuste de un modelo con la API Trainer
- local: chapter3/3_tf
title: Ajuste de un modelo con Keras
- local: chapter3/4
title: Entrenamiento completo
- local: chapter3/5
title: Ajuste de modelos, ¡hecho!
- local: chapter3/6
title: Quiz de final de capítulo
quiz: 3

- title: 5. La librería 🤗 Datasets
sections:
Expand All @@ -66,7 +76,7 @@
- local: chapter5/7
title: 🤗 Datasets, ¡listo!
- local: chapter5/8
title: Quiz
title: Quiz de final de capítulo
quiz: 5

- title: 8. ¿Cómo solicitar ayuda?
Expand Down
4 changes: 2 additions & 2 deletions chapters/es/chapter0/1.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ ls -a
Puedes entrar y salir de tu entorno virtual con los scripts `activate` y `deactivate`:

```
# Activate the virtual environment
# Activa el entorno virtual
source .env/bin/activate
# Deactivate the virtual environment
# Desactiva el entorno virtual
source .env/bin/deactivate
```

Expand Down
8 changes: 2 additions & 6 deletions chapters/es/chapter1/10.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ result = filler("...")
},
{
text: "This man has been waiting for you.",
explain: "Incorrecto. Esrte pipeline llena palabras ocultas, por lo que necesita un mask token en algún lugar."
explain: "Incorrecto. Este pipeline llena palabras ocultas, por lo que necesita un mask token en algún lugar."
}
]}
/>
Expand Down Expand Up @@ -154,8 +154,6 @@ result = classifier("This is a course about the Transformers library")

### 7. Selecciona la oración que describe mejor los términos "modelo", "arquitectura" y "pesos".

Select the sentence that best describes the terms "model," "architecture," and "weights."

<Question
choices={[
{
Expand Down Expand Up @@ -231,15 +229,13 @@ Select the sentence that best describes the terms "model," "architecture," and "
},
{
text: "Un modelo secuencia a secuencia",
explain: "Los modelos secuencia a secuencia son más adecuados para tareas en las que quieres generar texro con base en una oración de entrada, no una etiqueta."
explain: "Los modelos secuencia a secuencia son más adecuados para tareas en las que quieres generar texto con base en una oración de entrada, no una etiqueta."
}
]}
/>

### 11. ¿Cuál puede ser una posible fuente del sesgo observado en un modelo?

What possible source can the bias observed in a model have?

<Question
choices={[
{
Expand Down
17 changes: 11 additions & 6 deletions chapters/es/chapter2/4.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
Los tokenizadores son uno de los componentes fundamentales del pipeline en NLP. Sirven para traducir texto en datos que los modelos puedan procesar; es decir, de texto a valores numéricos. En esta sección veremos en qué se fundamenta todo el proceso de tokenizado.

En las tareas de NLP, los datos generalmente ingresan como texto crudo. Por ejemplo:

```
Jim Henson era un titiritero
```
Expand All @@ -40,6 +41,7 @@ Veamos algunos algoritmos de tokenización, e intentemos atacar algunas pregunta
<Youtube id="nhJxYji1aho"/>

El primer tokenizador que nos ocurre es el _word-based_ (_basado-en-palabras_). Es generalmente sencillo, con pocas normas, y generalmente da buenos resultados. Por ejemplo, en la imagen a continuación separamos el texto en palabras y buscamos una representación numérica.

<div class="flex justify-center">
<img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/word_based_tokenization.svg" alt="Un ejemplo de tokenizador _word-based_."/>
<img class="hidden dark:block" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/word_based_tokenization-dark.svg" alt="Un ejemplo de tokenizador _word-based_."/>
Expand All @@ -55,6 +57,7 @@ print(tokenized_text)
```python out
['Jim', 'Henson', 'era', 'un', 'titiritero']
```

También hay variaciones de tokenizadores de palabras que tienen reglas adicionales para la puntuación. Con este tipo de tokenizador, podemos acabar con unos "vocabularios" bastante grandes, donde un vocabulario se define por el número total de tokens independientes que tenemos en nuestro corpus.

A cada palabra se le asigna un ID, empezando por 0 y subiendo hasta el tamaño del vocabulario. El modelo utiliza estos ID para identificar cada palabra.
Expand All @@ -69,13 +72,12 @@ Una forma de reducir la cantidad de tokens desconocidos es ir un poco más allá

<Youtube id="ssLq_EK2jLE"/>

Character-based tokenizers split the text into characters, rather than words. This has two primary benefits:
Un tokenizador _character-based_ separa el texto en caracteres, y no en palabras. Conllevando dos beneficios principales:
Un tokenizador _character-based_ separa el texto en caracteres, y no en palabras. Esto conlleva dos beneficios principales:

- Obtenemos un vocabulario mucho más corto.
- Habrá muchos menos tokens por fuera del vocabulatio conocido.
- Habrá muchos menos tokens por fuera del vocabulario conocido.

No obstante, pueden surgir incovenientes por los espacios en blanco y signos de puntuación.
No obstante, pueden surgir inconvenientes por los espacios en blanco y signos de puntuación.

<div class="flex justify-center">
<img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter2/character_based_tokenization.svg" alt="Ejemplo de tokenizador basado en palabras."/>
Expand Down Expand Up @@ -105,7 +107,7 @@ Este es un ejemplo que muestra cómo un algoritmo de tokenización de subpalabra

Estas subpalabras terminan aportando mucho significado semántico: por ejemplo, en el ejemplo anterior, "tokenización" se dividió en "token" y "ización", dos tokens que tienen un significado semántico y a la vez son eficientes en cuanto al espacio (sólo se necesitan dos tokens para representar una palabra larga). Esto nos permite tener una cobertura relativamente buena con vocabularios pequeños y casi sin tokens desconocidos.

Este enfoque es especialmente útil en algunos idimas como el turco, donde se pueden formar palabras complejas (casi) arbitrariamente largas encadenando subpalabras.
Este enfoque es especialmente útil en algunos idiomas como el turco, donde se pueden formar palabras complejas (casi) arbitrariamente largas encadenando subpalabras.

### Y más!

Expand Down Expand Up @@ -154,6 +156,7 @@ tokenizer("Using a Transformer network is simple")
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}
```

Guardar un tokenizador es idéntico a guardar un modelo:

```py
Expand Down Expand Up @@ -200,6 +203,7 @@ Este tokenizador es un tokenizador de subpalabras: divide las palabras hasta obt
### De tokens a IDs de entrada

La conversión a IDs de entrada se hace con el método del tokenizador `convert_tokens_to_ids()`:

```py
ids = tokenizer.convert_tokens_to_ids(tokens)

Expand Down Expand Up @@ -230,6 +234,7 @@ print(decoded_string)
```python out
'Using a Transformer network is simple'
```

Notemos que el método `decode` no sólo convierte los índices de nuevo en tokens, sino que también agrupa los tokens que formaban parte de las mismas palabras para producir una frase legible. Este comportamiento será extremadamente útil cuando utilicemos modelos que predigan texto nuevo (ya sea texto generado a partir de una indicación, o para problemas de secuencia a secuencia como la traducción o el resumen).

A estas alturas deberías entender las operaciones atómicas que un tokenizador puede manejar: tokenización, conversión a IDs, y conversión de IDs de vuelta a una cadena. Sin embargo, sólo hemos rozado la punta del iceberg. En la siguiente sección, llevaremos nuestro enfoque a sus límites y echaremos un vistazo a cómo superarlos.
A estas alturas deberías entender las operaciones atómicas que un tokenizador puede manejar: tokenización, conversión a IDs, y conversión de IDs de vuelta a una cadena. Sin embargo, sólo hemos rozado la punta del iceberg. En la siguiente sección, llevaremos nuestro enfoque a sus límites y echaremos un vistazo a cómo superarlos.
26 changes: 15 additions & 11 deletions chapters/es/chapter2/6.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,14 @@ model_inputs = tokenizer(sequences)
Puede rellenar de acuerdo a varios objetivos:

```py
# Will pad the sequences up to the maximum sequence length
# Rellenar las secuencias hasta la mayor longitud de secuencia
model_inputs = tokenizer(sequences, padding="longest")

# Will pad the sequences up to the model max length
# (512 for BERT or DistilBERT)
# Rellenar las secuencias hasta la máxima longitud del modelo
# (512 para BERT o DistilBERT)
model_inputs = tokenizer(sequences, padding="max_length")

# Will pad the sequences up to the specified max length
# Rellenar las secuencias hasta la máxima longitud especificada
model_inputs = tokenizer(sequences, padding="max_length", max_length=8)
```

Expand All @@ -74,11 +74,11 @@ También puede truncar secuencias:
```py
sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]

# Will truncate the sequences that are longer than the model max length
# (512 for BERT or DistilBERT)
# Truncar las secuencias más largas que la máxima longitud del modelo
# (512 para BERT o DistilBERT)
model_inputs = tokenizer(sequences, truncation=True)

# Will truncate the sequences that are longer than the specified max length
# Truncar las secuencias más largas que la longitud especificada
model_inputs = tokenizer(sequences, max_length=8, truncation=True)
```

Expand All @@ -87,13 +87,13 @@ El objeto `tokenizer` puede manejar la conversión a tensores de frameworks espe
```py
sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"]

# Returns PyTorch tensors
# Devuelve tensores PyTorch
model_inputs = tokenizer(sequences, padding=True, return_tensors="pt")

# Returns TensorFlow tensors
# Devuelve tensores TensorFlow
model_inputs = tokenizer(sequences, padding=True, return_tensors="tf")

# Returns NumPy arrays
# Devuelve arrays Numpy
model_inputs = tokenizer(sequences, padding=True, return_tensors="np")
```

Expand Down Expand Up @@ -129,13 +129,14 @@ print(tokenizer.decode(ids))
"i've been waiting for a huggingface course my whole life."
```

El tokenizador agregó la palabra especial `[CLS]` al principio y la palabra especial `[SEP]` al final. Esto se debe a que el modelo fue preentrenado con esos, así para obtener los mismos resultados por inferencia necesitamos agregarlos también. Nota que algunos modelos no agregan palabras especiales, o agregan unas distintas; los modelos también pueden agregar estas palabras especiales sólo al principio, o sólo al final. En cualquier caso, el tokenizador sabe cuáles son las esperadas y se encargará de ello por tí.
El tokenizador agregó la palabra especial `[CLS]` al principio y la palabra especial `[SEP]` al final. Esto se debe a que el modelo fue preentrenado con esos, así para obtener los mismos resultados por inferencia necesitamos agregarlos también. Nota que algunos modelos no agregan palabras especiales, o agregan unas distintas; los modelos también pueden agregar estas palabras especiales sólo al principio, o sólo al final. En cualquier caso, el tokenizador sabe cuáles son las esperadas y se encargará de ello por tí.

## Conclusión: Del tokenizador al moelo

Ahora que hemos visto todos los pasos individuales que el objeto `tokenizer` usa cuando se aplica a textos, veamos una última vez cómo maneja varias secuencias (¡relleno!), secuencias muy largas (¡truncado!), y múltiples tipos de tensores con su API principal:

{#if fw === 'pt'}

```py
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
Expand All @@ -148,7 +149,9 @@ sequences = ["I've been waiting for a HuggingFace course my whole life.", "So ha
tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt")
output = model(**tokens)
```

{:else}

```py
import tensorflow as tf
from transformers import AutoTokenizer, TFAutoModelForSequenceClassification
Expand All @@ -161,4 +164,5 @@ sequences = ["I've been waiting for a HuggingFace course my whole life.", "So ha
tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="tf")
output = model(**tokens)
```

{/if}
20 changes: 11 additions & 9 deletions chapters/es/chapter3/1.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,21 @@
classNames="absolute z-10 right-0 top-0"
/>

En el [Capítulo 2](/course/chapter2) exploramos como usar los tokenizadores y modelos preentrenados para realizar predicciones. Pero qué tal si deseas ajustar un modelo preentrenado con tu propio conjunto de datos ?
En el [Capítulo 2](/course/chapter2) exploramos cómo usar los tokenizadores y modelos preentrenados para realizar predicciones. Pero, ¿qué pasa si deseas ajustar un modelo preentrenado con tu propio conjunto de datos?

{#if fw === 'pt'}
* Como preparar un conjunto de datos grande desde el Hub.
* Como usar la API de alto nivel del entrenador para ajustar un modelo.
* Como usar un bucle personalizado de entrenamiento.
* Como aprovechar la Accelerate library 🤗 para fácilmente ejecutar el bucle personalizado de entrenamiento en cualquier configuración distribuida.

* Cómo preparar un conjunto de datos grande desde el Hub.
* Cómo usar la API de alto nivel del entrenador para ajustar un modelo.
* Cómo usar un bucle personalizado de entrenamiento.
* Cómo aprovechar la librería 🤗 Accelerate para fácilmente ejecutar el bucle personalizado de entrenamiento en cualquier configuración distribuida.

{:else}
* Como preparar un conjunto de datos grande desde el Hub.
* Como usar Keras para ajustar un modelo.
* Como usar Keras para obtener predicciones.
* Como usar una métrica personalizada.

* Cómo preparar un conjunto de datos grande desde el Hub.
* Cómo usar Keras para ajustar un modelo.
* Cómo usar Keras para obtener predicciones.
* Cómo usar una métrica personalizada.

{/if}

Expand Down
Loading

0 comments on commit 5828ea1

Please sign in to comment.