# Crear un conjunto de datos de documentos

Esta guía le mostrará cómo crear un conjunto de datos de documentos con `PdfFolder` y algunos metadatos. Esta es una solución sin código para crear rápidamente un conjunto de datos de documentos con varios miles de PDF.

> [!TIP]
> Puedes controlar el acceso a tu conjunto de datos requiriendo que los usuarios compartan primero su información de contacto. Consulta la guía de [Conjuntos de datos con acceso restringido](https://huggingface.co/docs/hub/datasets-gated) para obtener más información sobre cómo habilitar esta función en el Hub.

## PdfFolder

El `PdfFolder` es un constructor de conjuntos de datos diseñado para cargar rápidamente un conjunto de documentos con varios miles de PDF sin necesidad de escribir código.

> [!TIP]
> 💡 Echa un vistazo a la [Jerarquía del patrón Split](repository_structure#split-pattern-hierarchy) para aprender más sobre cómo `PdfFolder` crea divisiones de datos basadas en la estructura de tu repositorio de datos.

`PdfFolder` infiere automáticamente las etiquetas de clase de tu conjunto de datos en función del nombre del directorio. Guarda tu conjunto de datos en una estructura de directorios como la siguiente:

```
folder/train/resume/0001.pdf
folder/train/resume/0002.pdf
folder/train/resume/0003.pdf

folder/train/invoice/0001.pdf
folder/train/invoice/0002.pdf
folder/train/invoice/0003.pdf
```

Si el conjunto de datos sigue la estructura `PdfFolder`, puede cargarlo directamente con [load_dataset()](/docs/datasets/v5.2.0/es/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("path/to/folder")
```

Esto es equivalente a pasar `pdffolder` manualmente en [load_dataset()](/docs/datasets/v5.2.0/es/package_reference/loading_methods#datasets.load_dataset) y el directorio en `data_dir`:

```py
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")
```

También puede usar `pdffolder` para cargar conjuntos de datos que implican múltiples divisiones. Para ello, el directorio de su conjunto de datos debe tener la siguiente estructura:

```
folder/train/resume/0001.pdf
folder/train/resume/0002.pdf
folder/test/invoice/0001.pdf
folder/test/invoice/0002.pdf
```

> [!WARNING]
> Si todos los archivos PDF están contenidos en un solo directorio o si no están en el mismo nivel de la estructura de directorios, la columna `label` no se añadirá automáticamente. Si la necesitas, establece `drop_labels=False` explícitamente.

Si hay información adicional que desees incluir sobre tu conjunto de datos, como descripciones de texto o cajas delimitadoras, añádela como un archivo `metadata.csv` en tu carpeta. Esto te permite crear rápidamente conjuntos de datos para diferentes tareas de visión por computadora, como la descripción de texto o la detección de objetos. También puedes usar un archivo JSONL `metadata.jsonl` o un archivo Parquet `metadata.parquet`.

```
folder/train/metadata.csv
folder/train/0001.pdf
folder/train/0002.pdf
folder/train/0003.pdf
```

Su archivo `metadata.csv` debe tener un campo `file_name` o `*_file_name` que vincule los archivos PDF con sus metadatos:

```csv
file_name,additional_feature
0001.pdf,This is a first value of a text feature you added to your pdfs
0002.pdf,This is a second value of a text feature you added to your pdfs
0003.pdf,This is a third value of a text feature you added to your pdfs
```

o usando `metadata.jsonl`:

```jsonl
{"file_name": "0001.pdf", "additional_feature": "This is a first value of a text feature you added to your PDFs"}
{"file_name": "0002.pdf", "additional_feature": "This is a second value of a text feature you added to your PDFs"}
{"file_name": "0003.pdf", "additional_feature": "This is a third value of a text feature you added to your PDFs"}
```

Aquí, `file_name` debe ser el nombre del archivo PDF situado junto al archivo de metadatos. De forma más general, debe ser la ruta relativa desde el directorio que contiene los metadatos hasta el archivo PDF.

Es posible apuntar a más de un PDF en cada fila de su conjunto de datos, por ejemplo, si tanto la entrada como la salida son PDF:

```jsonl
{"input_file_name": "0001.pdf", "output_file_name": "0001_output.pdf"}
{"input_file_name": "0002.pdf", "output_file_name": "0002_output.pdf"}
{"input_file_name": "0003.pdf", "output_file_name": "0003_output.pdf"}
```

También puede definir listas de PDFs. En ese caso, debe nombrar el campo `file_names` o `*_file_names`. Aquí hay un ejemplo:

```jsonl
{"pdfs_file_names": ["0001_part1.pdf", "0001_part2.pdf"], "label": "urgent"}
{"pdfs_file_names": ["0002_part1.pdf", "0002_part2.pdf"], "label": "urgent"}
{"pdfs_file_names": ["0003_part1.pdf", "0002_part2.pdf"], "label": "normal"}
```

### OCR (Reconocimiento Óptico de Caracteres)

Los conjuntos de datos de OCR tienen el texto contenido en un PDF. Un ejemplo de `metadata.csv` puede verse así:

```csv
file_name,text
0001.pdf,Invoice 1234 from 01/01/1970...
0002.pdf,Software Engineer Resume. Education: ...
0003.pdf,Attention is all you need. Abstract. The ...
```

Cargue el conjunto de datos con `PdfFolder` y creará una columna `text` para las descripciones de los PDF:

```py
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"Invoice 1234 from 01/01/1970..."
```

### Subir el conjunto de datos al Hub

Una vez que hayas creado un conjunto de datos, puedes compartirlo en la plataforma, por ejemplo, usando `huggingface_hub`. Asegúrate de tener instalada la biblioteca [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) y de haber iniciado sesión en tu cuenta de Hugging Face (consulta el [tutorial de carga con Python](upload_dataset#upload-with-python) para más detalles).

Sube tu conjunto de datos con `huggingface_hub.HfApi.upload_folder`:

```py
from huggingface_hub import HfApi
api = HfApi()

api.upload_folder(
    folder_path="/path/to/local/dataset",
    repo_id="username/my-cool-dataset",
    repo_type="dataset",
)
```

