Tu primer análisis lingüístico con spaCy
Lemas, categorías gramaticales, dependencias y entidades de un texto en español con diez líneas de Python, y cómo leer críticamente lo que devuelve: con salidas reales y sus errores.
En esta pieza
El objetivo de este tutorial no es aprender a programar, sino ver con tus propios ojos qué decisiones lingüísticas toma una herramienta real y dónde se equivoca. Todas las salidas que aparecen aquí son reales: las devolvió spaCy 3.8 con su modelo pequeño de español.
Si quieres probarlo directamente: abre el cuaderno en Google Colab · descarga el cuaderno completo · aprende a usar Colab. El tutorial conserva debajo la instalación y el código paso a paso.
Si no tienes Python instalado, puedes leer la pieza entera: las demostraciones muestran lo que verías.
1. Qué es spaCy
spaCy es una librería de Python que hace en un solo paso el análisis que harías en clase de lengua: separa las palabras, da el lema y la categoría de cada una, dibuja las relaciones sintácticas y reconoce nombres propios. Lo hace con un modelo estadístico entrenado con textos anotados a mano, no con reglas escritas por alguien. Por eso acierta mucho con textos parecidos a los de su entrenamiento y falla con los que se alejan.
2. Instalar spaCy y el modelo de español
Con el entorno activado:
pip install spacy
python -m spacy download es_core_news_sm
La primera línea instala la librería. La segunda descarga el modelo de español: es es la lengua, news indica que se entrenó sobre todo con prensa y sm (small) que es la versión pequeña. Existen versiones md y lg, algo más precisas y más pesadas.
3. Analizar una oración
Crea un archivo analizar.py con este contenido. Los comentarios (detrás de #) explican cada línea:
import spacy # carga la librería
nlp = spacy.load("es_core_news_sm") # carga el modelo de español
doc = nlp("Los alumnos de la Complutense presentaron ayer en Madrid "
"un corpus de cartas del siglo XVIII.") # analiza la frase
for token in doc: # para cada palabra del análisis…
print(token.text, token.lemma_, token.pos_, token.dep_, token.head.text, sep="\t")
for ent in doc.ents: # para cada entidad reconocida…
print(ent.text, ent.label_)
Ejecútalo desde la terminal con python analizar.py. Esto es lo que devuelve:
Salida real
Lo que devuelve spaCy, columna a columna
«Los alumnos de la Complutense presentaron ayer en Madrid un corpus de cartas del siglo XVIII.»
| Forma | Lema | Categoría | Función | Depende de |
|---|---|---|---|---|
| Los | el | DET | det | alumnos |
| alumnos | alumno | NOUN | nsubj | presentaron |
| de | de | ADP | case | Complutense |
| la | el | DET | det | Complutense |
| Complutense | Complutense | PROPN | nmod | alumnos |
| presentaron | presentar | VERB | ROOT | presentaron |
| ayer | ayer | ADV | advmod | presentaron |
| en | en | ADP | case | Madrid |
| Madrid | Madrid | PROPN | obl | presentaron |
| un | uno | DET | det | corpus |
| corpus | corpus | NOUN | obj | presentaron |
| de | de | ADP | case | cartas |
| cartas | carta | NOUN | nmod | corpus |
| del | del | ADP | case | siglo |
| siglo | siglo | NOUN | nmod | cartas |
| XVIII | xviii | NOUN | compound | siglo |
Entidades: «la Complutense» (LOC) y «Madrid» (LOC).
La idea: Léelo como un ejercicio de análisis sintáctico: cada fila es una palabra, y la última columna dice de qué palabra depende.
Cada fila tiene cinco columnas:
| Columna | Qué es | Ejemplo |
|---|---|---|
| Forma | La palabra tal como aparece | presentaron |
| Lema | La forma de diccionario | presentar |
| Categoría | Categoría gramatical, con las etiquetas de Universal Dependencies | VERB, NOUN, ADP (preposición), DET |
| Función | Relación sintáctica con su núcleo | nsubj (sujeto), obj (objeto directo), obl (complemento circunstancial), nmod (modificador de un nombre) |
| Depende de | La palabra de la que depende | alumnos depende de presentaron |
La palabra marcada como ROOT es la raíz de la oración: el verbo principal, del que cuelga todo lo demás.
4. Ver el árbol
Las columnas de la tabla describen un árbol de dependencias. spaCy incluye displaCy, una herramienta que lo dibuja. Añade estas líneas al final de analizar.py:
from spacy import displacy # el dibujante de spaCy
svg = displacy.render(doc, style="dep") # dibuja el árbol de dependencias
with open("arbol.svg", "w", encoding="utf-8") as f:
f.write(svg) # lo guarda en un archivo
Al ejecutar de nuevo el programa aparece un archivo arbol.svg que puedes abrir con el navegador. Si es la primera vez que ves un árbol de este tipo, así se lee:
El árbol sintáctico de spaCy
Cada arco une una palabra con su núcleo; la etiqueta indica la función. Sigue los arcos hasta presentaron, la raíz.
alumnos → sujeto (nsubj) · corpus → objeto (obj) · cartas → modificador de corpus (nmod)
5. Leer el resultado con ojo de lingüista
Revisa el análisis como harías con el ejercicio de un alumno:
- Sujeto y objeto. alumnos es nsubj de presentaron y corpus es obj. Correcto.
- El lema de presentaron es presentar. Correcto.
- «del siglo XVIII». El modelo lo hace depender de cartas (cartas del siglo XVIII). Era la lectura más natural, pero la frase es ambigua: también podría ser un corpus del siglo XVIII. El modelo elige una opción sin avisar.
- «del» aparece como una sola palabra con lema del: el modelo no separa la contracción en de + el.
- Las entidades. Hay una que merece atención:
6. Donde se equivoca de verdad
El modelo se entrenó sobre todo con prensa peninsular. Mira qué ocurre con una frase corriente del español de México:
Interactivo
Encuentra los errores de spaCy
Lo que devolvió spaCy para esta frase
Ahorita → PROPN, sujeto, entidad PER · le → objeto directo · licenciada → objeto directo · Pérez → entidad LOCPulsa los fragmentos que te parezcan mal. Hay 4.
Estos errores no indican que spaCy sea una mala herramienta. Muestran algo más útil: que un modelo es tan bueno como la distancia entre tu texto y su entrenamiento. Si tu corpus es de cartas del siglo XVIII, de tuits o de español de América, tendrás que medir esa distancia antes de fiarte.
7. Convertirlo en un pequeño proyecto
Prueba frases difíciles y anota qué falla en una tabla con cuatro columnas: frase, qué esperabas, qué devolvió el modelo y tipo de error. Algunas ideas:
- Un sujeto omitido: «Llegaron tarde».
- Ironía: «Genial, otra vez sin tren». spaCy etiqueta Genial como nombre propio y entidad.
- Un nombre propio poco frecuente.
- Una frase con una errata.
- Una variedad no peninsular: «Ahorita le hablo».
Cuando tengas veinte o treinta frases, agrupa los errores por tipo. Eso es un análisis de errores, exactamente el trabajo que describe la competencia de evaluación de modelos. Súbelo a GitHub con un README que explique qué probaste y qué encontraste, y tendrás tu primera pieza de portfolio.
Para seguir
- Curso oficial de spaCy, gratuito y en español.
- NLTK, spaCy y Hugging Face: cuándo conviene cada librería.
- Tareas de PLN, para entender qué hay detrás de cada etiqueta que acabas de ver.
- Evaluar un clasificador: cómo pasar de «acierta bastante» a cifras que se pueden comparar.
- Fundamentos lingüísticos: los niveles de análisis que spaCy automatiza.