Saltar al contenido
TutorialNivel inicial1-2 horas· Revisado el 15 de octubre, 2026

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.»

FormaLemaCategoríaFunciónDepende de
LoselDETdetalumnos
alumnosalumnoNOUNnsubjpresentaron
dedeADPcaseComplutense
laelDETdetComplutense
ComplutenseComplutensePROPNnmodalumnos
presentaronpresentarVERBROOTpresentaron
ayerayerADVadvmodpresentaron
enenADPcaseMadrid
MadridMadridPROPNoblpresentaron
ununoDETdetcorpus
corpuscorpusNOUNobjpresentaron
dedeADPcasecartas
cartascartaNOUNnmodcorpus
deldelADPcasesiglo
siglosigloNOUNnmodcartas
XVIIIxviiiNOUNcompoundsiglo

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:
¿Lo tienes?

spaCy etiqueta «la Complutense» como LOC (lugar). ¿Qué opinas?

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

Ejemplo construido

Lo que devolvió spaCy para esta frase

Ahorita → PROPN, sujeto, entidad PER · le → objeto directo · licenciada → objeto directo · Pérez → entidad LOC

Pulsa 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

Dónde encaja en el recorrido