tutoriales.com

Extracción de Entidades Nombradas (NER) con spaCy: Un Enfoque Práctico

Este tutorial te guiará a través del proceso de Extracción de Entidades Nombradas (NER) utilizando la potente librería spaCy en Python. Cubriremos desde los fundamentos teóricos hasta la implementación práctica, incluyendo la evaluación y mejora de modelos para identificar y clasificar entidades en texto.

Intermedio12 min de lectura20 views12 de marzo de 2026Reportar error

La Extracción de Entidades Nombradas (NER por sus siglas en inglés, Named Entity Recognition) es una técnica fundamental en el Procesamiento de Lenguaje Natural (PLN) que se enfoca en identificar y clasificar entidades atómicas en texto en categorías predefinidas como nombres de personas, organizaciones, ubicaciones, expresiones de tiempo, cantidades, valores monetarios, porcentajes, etc. Imagina leer un artículo de noticias y que un sistema pueda automáticamente resaltar a las personas mencionadas, las empresas involucradas o las fechas de los eventos. ¡Eso es NER en acción! 🚀

Este tutorial te proporcionará una comprensión profunda de cómo implementar y utilizar NER de manera efectiva con spaCy, una de las librerías más populares y eficientes para PLN en Python.

📖 ¿Qué es la Extracción de Entidades Nombradas (NER)?

NER es una subtarea de la extracción de información que busca localizar y clasificar elementos de texto que pueden ser clasificados en un conjunto de categorías predefinidas. Por ejemplo, en la frase "Steve Jobs fundó Apple en 1976 en California", un sistema NER debería identificar:

  • Steve Jobs: PERSONA
  • Apple: ORGANIZACIÓN
  • 1976: FECHA
  • California: UBICACIÓN (GPE - Geo-Political Entity)
📌 Nota: Las categorías pueden variar según el modelo y la aplicación. spaCy ofrece un conjunto robusto de tipos de entidades por defecto.

¿Por qué es importante NER? 🤔

NER tiene una amplia gama de aplicaciones prácticas:

  • Sistemas de Preguntas y Respuestas: Ayuda a identificar las respuestas clave en grandes volúmenes de texto.
  • Análisis de Sentimientos: Permite atribuir sentimientos a entidades específicas.
  • Motores de Búsqueda: Mejora la relevancia de los resultados al comprender mejor las consultas.
  • Clasificación de Documentos: Facilita la categorización de documentos basados en las entidades mencionadas.
  • Redacción de Resúmenes Automáticos: Identifica los puntos clave para generar resúmenes concisos.

🛠️ Comenzando con spaCy: Instalación y Primeros Pasos

spaCy es una librería de código abierto para PLN avanzada, diseñada para ser rápida y eficiente. Para empezar, necesitamos instalarla y descargar un modelo de lenguaje.

Instalación de spaCy

Primero, asegúrate de tener Python instalado (versión 3.6+).

pip install spacy

Descarga de un Modelo de Lenguaje

spaCy utiliza modelos estadísticos para realizar tareas como NER. Descargaremos un modelo grande en español (es_core_news_lg), que incluye capacidades NER pre-entrenadas.

python -m spacy download es_core_news_lg
💡 Consejo: Si tienes problemas de espacio o necesitas un modelo más ligero, puedes probar `es_core_news_sm` o `es_core_news_md`.

Carga del Modelo y Procesamiento Básico

Una vez instalado y descargado el modelo, podemos empezar a procesar texto.

import spacy

# Cargar el modelo en español
nlp = spacy.load("es_core_news_lg")

# Texto de ejemplo
text = "El presidente de Argentina, Javier Milei, visitó Madrid el 18 de mayo de 2024 para una conferencia. Se reunió con importantes figuras." 

# Procesar el texto
doc = nlp(text)

# Imprimir las entidades nombradas encontradas
print("Entidades Nombradas:")
for ent in doc.ents:
    print(f"- {ent.text} ({ent.label_})")

Salida esperada:

Entidades Nombradas:
- Argentina (LOC)
- Javier Milei (PER)
- Madrid (LOC)
- 18 de mayo de 2024 (DATE)

¡Felicidades! 🎉 Acabas de realizar tu primera extracción de entidades nombradas con spaCy. Como puedes ver, spaCy ha identificado correctamente el país, la persona, la ciudad y la fecha.


📊 Entendiendo los Tipos de Entidades de spaCy

spaCy viene con un conjunto predefinido de etiquetas de entidades que son bastante comunes y útiles en diversos dominios. Aquí una tabla con algunas de las más frecuentes:

EtiquetaDescripciónEjemplo
PERSONNombres de personas, incluyendo apodos.Barack Obama, Dr. Smith
NORPNacionalidades, grupos religiosos o políticos.Judío, Europeo, Demócrata
FACEdificios, aeropuertos, puentes, etc.Torre Eiffel, Aeropuerto JFK
ORGCompañías, agencias, instituciones.Google, ONU, Universidad de Harvard
GPEPaíses, ciudades, estados.Francia, Nueva York, Texas
LOCLugares geográficos, no GPE.Río Nilo, Monte Everest
PRODUCTObjetos, vehículos, alimentos (no servicios).iPhone, Toyota Corolla
EVENTNombres de eventos.Juegos Olímpicos, Segunda Guerra Mundial
WORK_OF_ARTTítulos de libros, canciones, películas.La Mona Lisa, Cien años de soledad
LAWNombres de documentos legales.La Constitución, Ley de Protección de Datos
DATEFechas absolutas o relativas.2023, ayer, el próximo lunes
TIMEHoras y períodos.tres horas, 10:30 a.m.
MONEYValores monetarios.100 euros, un millón de dólares
QUANTITYMedidas (peso, distancia, etc.).10 kilogramos, 5 millas
ORDINALNúmeros ordinales.primero, segundo, III
CARDINALNúmeros cardinales.uno, dos, 100
🔥 Importante: La precisión de la clasificación NER depende en gran medida del modelo utilizado y de la calidad y el dominio del texto de entrenamiento.

📈 Visualización de Entidades con displaCy

spaCy incluye una herramienta de visualización fantástica llamada displaCy que nos permite ver las entidades directamente en el navegador, lo cual es muy útil para depurar y presentar resultados.

from spacy import displacy

text = "Apple fue fundada por Steve Jobs y Steve Wozniak en 1976 en Cupertino, California."
doc = nlp(text)

displacy.render(doc, style="ent", jupyter=True) # jupyter=True si estás en un notebook
# Para usarlo en un script normal y abrir en navegador:
# displacy.serve(doc, style="ent") 

El resultado se vería algo así (representación en texto):

Apple (ORG) fue fundada por Steve Jobs (PERSON) y Steve Wozniak (PERSON) en 1976 (DATE) en Cupertino (GPE), California (GPE). ORG PERSON PERSON DATE GPE GPE

⚙️ Personalizando NER: Añadiendo Entidades y Reglas

Los modelos pre-entrenados de spaCy son potentes, pero a menudo necesitamos identificar entidades específicas de nuestro dominio que no están cubiertas por las categorías estándar. spaCy nos permite extender su funcionalidad de varias maneras.

Añadiendo un Patrón Basado en Reglas (Matcher)

Podemos usar el Matcher de spaCy para identificar entidades basadas en patrones léxicos o sintácticos. Esto es útil para entidades que tienen una estructura predecible pero no están en el modelo.

Supongamos que queremos identificar la entidad "Número de Producto XYZ" donde "XYZ" es un código alfanumérico.

from spacy.matcher import Matcher

text = "El pedido incluye el Número de Producto ABC123 y el Número de Producto DEF456." 
doc = nlp(text)

# Inicializar el Matcher con el vocabulario del modelo NLP
matcher = Matcher(nlp.vocab)

# Definir el patrón para "Número de Producto" seguido de un código alfanumérico
# [{'LOWER': 'número'}, {'LOWER': 'de'}, {'LOWER': 'producto'}, {'TEXT': {'REGEX': '[A-Z]{3}\d{3}'}}]
# O más simple para este ejemplo:
pattern = [{"LOWER": "número"}, {"LOWER": "de"}, {"LOWER": "producto"}, {"IS_ALPHA": True, "LENGTH": 3}, {"IS_DIGIT": True, "LENGTH": 3}]
matcher.add("PRODUCT_ID", [pattern])

matches = matcher(doc)

print("Entidades personalizadas encontradas:")
for match_id, start, end in matches:
    span = doc[start:end] # El segmento coincidente
    print(f"- {span.text} (PRODUCT_ID)")

# Opcional: Para agregar estas entidades al doc.ents:
from spacy.tokens import Span

# Crear una lista de Spans a agregar
entities = list(doc.ents) # Copiar las entidades existentes

for match_id, start, end in matches:
    new_entity = Span(doc, start, end, label="PRODUCT_ID")
    entities.append(new_entity)

doc.ents = tuple(entities) # Asignar la nueva tupla de entidades

print("\nTodas las entidades (incluyendo personalizadas):")
for ent in doc.ents:
    print(f"- {ent.text} ({ent.label_})")

Salida esperada (simplificada):

Entidades personalizadas encontradas:
- Número de Producto ABC123 (PRODUCT_ID)
- Número de Producto DEF456 (PRODUCT_ID)

Todas las entidades (incluyendo personalizadas):
- Número de Producto ABC123 (PRODUCT_ID)
- Número de Producto DEF456 (PRODUCT_ID)

Entrenando un Nuevo Modelo NER (o Actualizando uno Existente) Avanzado

Para casos más complejos donde las reglas no son suficientes, o para categorías muy específicas de tu dominio, necesitarás entrenar un nuevo componente NER o actualizar uno existente. Esto implica:

  1. Preparar datos de entrenamiento: Textos anotados manualmente con tus nuevas entidades. Por ejemplo: ("Apple es una empresa tecnológica", {"entities": [(0, 5, "ORGANIZATION")]}).
  2. Configurar el entrenamiento: Definir los hiperparámetros y el pipeline.
  3. Entrenar el modelo: Usar spacy train o el API de Python para entrenar el modelo con tus datos.
  4. Evaluar y mejorar: Medir el rendimiento y ajustar si es necesario.

Este proceso es más complejo y requiere un conjunto de datos anotado. spaCy ofrece herramientas excelentes para ello, pero va más allá del alcance de este tutorial introductorio.


🚀 Casos de Uso Avanzados y Consideraciones

NER en Contextos Multilingües

spaCy soporta múltiples idiomas. Simplemente descarga el modelo correspondiente (en_core_news_lg para inglés, de_core_news_lg para alemán, etc.) y cárgalo de la misma manera.

💡 Consejo: La calidad de los modelos varía entre idiomas. Los modelos para idiomas con más recursos suelen ser más robustos.

Extracción de Relaciones (Relation Extraction)

Una vez que las entidades han sido identificadas, el siguiente paso lógico es determinar las relaciones entre ellas. Por ejemplo, en "Elon Musk fundó SpaceX", NER identifica "Elon Musk" (PERSONA) y "SpaceX" (ORGANIZACIÓN). La Extracción de Relaciones podría identificar que "Elon Musk fundó SpaceX". spaCy no tiene un componente de extracción de relaciones preconstruido como NER, pero sus pipelines permiten construir uno.

Ejemplo de un pipeline para Extracción de Relaciones (Concepto)
Paso 1: NER Identificar "Elon Musk" (PERSON) y "SpaceX" (ORG).
Paso 2: Análisis de Dependencias Analizar la estructura sintáctica de la oración.
Paso 3: Identificación de Predicados Buscar verbos o frases que conecten las entidades.
Paso 4: Clasificación de Relaciones Usar un clasificador (por ejemplo, con embeddings) para determinar el tipo de relación (e.g., "fundó").
Dominio de NER

Rendimiento y Optimización

Para aplicaciones en producción, la velocidad y la precisión son cruciales. Aquí algunas consideraciones:

  • Modelos más pequeños: Usa sm (small) o md (medium) si la precisión del lg (large) no es estrictamente necesaria y necesitas más velocidad o menos memoria.
  • Desactivar componentes no utilizados: Si solo necesitas NER, puedes desactivar otros componentes del pipeline de spaCy para acelerar el procesamiento.
# Cargar solo el componente NER
nlp_ner_only = spacy.load("es_core_news_lg", disable=["tagger", "parser", "attribute_ruler", "lemmatizer"])
text = "Texto a procesar rápidamente con solo NER."
doc_ner_only = nlp_ner_only(text)
print(f"Entidades (solo NER): {[ent.text for ent in doc_ner_only.ents]}")

✅ Conclusión

La Extracción de Entidades Nombradas es una herramienta invaluable en el arsenal de cualquier profesional del PLN. Con spaCy, tienes una librería robusta, eficiente y fácil de usar que te permite no solo identificar entidades predefinidas, sino también personalizar y extender su funcionalidad para satisfacer tus necesidades específicas.

Esperamos que este tutorial te haya proporcionado una base sólida para comenzar tu viaje con NER y spaCy. ¡Ahora es tu turno de experimentar y construir aplicaciones increíbles! ✨

Fácil para empezar, Intermedio para personalizar, Avanzado para entrenar modelos desde cero.


Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!