Cargar el corpus CSV
Abre, analiza y verifica la estructura de slm-corpus.csv con el módulo csv de Python.
- Abrir y analizar un archivo CSV con csv.reader y csv.DictReader
- Inspeccionar nombres de columnas, cantidad de filas y tipos de datos en un dataset CSV
- Extraer el texto crudo de las filas del corpus en una sola cadena
- Manejar errores comunes de CSV: codificación, caracteres de nueva línea, valores faltantes
¿Por qué empezar con los datos?
Todo proyecto de aprendizaje de máquina comienza con datos. Para un modelo de lenguaje basado en texto, esos datos son un corpus, una colección de texto de la que el modelo aprenderá patrones. Nuestro corpus vive en slm-corpus.csv, un pequeño archivo CSV que viene con el curso en static/datasets/.
Antes de poder tokenizar, contar o generar nada, necesitas cargar este archivo en Python. Esta lección cubre dos enfoques: csv.reader para el acceso crudo y csv.DictReader para el acceso consciente del encabezado.
Conceptos clave
Abrir un archivo CSV
El módulo csv de Python maneja las partes complejas del análisis CSV (campos entre comillas, comas incrustadas, caracteres escapados). Abre siempre los archivos CSV en modo texto y deja que el módulo haga el trabajo:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.reader(f)
header = next(reader) # first row = column names
print(header) # e.g. ['id', 'text']El argumento newline="" es requerido por la documentación del módulo csv, sin él, puedes obtener filas en blanco en Windows o una salida con doble espaciado.
Leer con DictReader
csv.DictReader asigna cada fila a un diccionario usando la fila de encabezado como claves. Esto hace que tu código se autodocumente:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["text"]) # access by column name, not indexLa primera llamada a next(reader) es automática, DictReader consume la fila de encabezado por sí mismo.
Extraer el texto completo
Para construir un modelo de lenguaje, necesitas todo el texto concatenado en una sola cadena larga. Así lo recoges:
import csv
texts = []
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
texts.append(row["text"])
full_text = " ".join(texts)
print(f"Loaded {len(texts)} rows, {len(full_text)} characters")El método join() concatena todos los textos de las filas con un separador de espacio, produciendo un bloque continuo de texto.
Verificar la carga
Comprueba siempre tus datos después de cargarlos. Cuenta las filas, echa un vistazo a algunas muestras y busca problemas evidentes:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
rows = list(reader)
print(f"Total rows: {len(rows)}")
print(f"Columns: {rows[0].keys()}")
print(f"First row: {rows[0]}")
print(f"Last row: {rows[-1]}")Si el archivo es grande, evita list(reader), carga todo en memoria. En su lugar, itera y procesa fila por fila.
Inténtalo
Carga slm-corpus.csv e imprime:
- El número de filas del archivo
- Los nombres de las columnas
- El texto de la primera fila
Usa este esqueleto:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
rows = list(reader)
print(f"Rows: {len(rows)}")
print(f"Columns: {list(rows[0].keys())}")
print(f"Sample: {rows[0]['text'][:200]}")Conclusiones clave
- Abre siempre los archivos CSV con
newline=""al usar el módulocsv csv.DictReaderte da acceso por claves del encabezado;csv.readerte da acceso por índices- Verifica tu carga: comprueba el número de filas, los nombres de las columnas y observa datos de muestra
- Para archivos grandes, itera fila por fila en lugar de convertir a una lista
Reto de práctica
Escribe una función load_corpus(path) que tome la ruta de un archivo CSV y devuelva una lista de cadenas, una por la columna text de cada fila. Maneja el caso de que el archivo no exista imprimiendo un mensaje de error y devolviendo una lista vacía.
def load_corpus(path):
import csv
try:
with open(path, newline="") as f:
reader = csv.DictReader(f)
return [row["text"] for row in reader]
except FileNotFoundError:
print(f"File not found: {path}")
return []1. ¿Por qué deberías pasar newline al abrir un archivo CSV para el módulo csv?
2. ¿Qué usa csv.DictReader como claves de diccionario para cada fila?
3. Dado reader = csv.DictReader(f), ¿qué devuelve next(reader)?