Entrenamiento de un modelo NER

| Última modificación: 10 de julio de 2024 | Tiempo de Lectura: 3 minutos
Premios Blog KeepCoding 2025

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

En este artículo veremos cómo hacer el entrenamiento de un modelo NER. Una vez hemos cargado los datos y hemos definido algunas funciones a modo general, podemos dar paso al entrenamiento de un modelo NER o named entity recognition.

Entrenamiento de un modelo NER

Lo primero que haremos antes de entrenar el modelo es extraer las características o features.

Extracción de features

Aquí es donde haremos la extracción de determinadas features, por ejemplo si es un título o un dígito, entre otras.

El método que implementaremos recibe como entrada la frase que queramos analizar. Entonces, por un lado, vamos a separar la palabra y el tag que tiene.

Las features que vamos a extraer son:

  • word.lower: esta feature hace referencia a la palabra en minúscula. Vamos a preservar la palabra como venga y luego vamos a guardar la palabra procesada en minúsculas.
  • word [-3:]: esta feature nos coge los tres últimos caracteres de la palabra. En caso de que esté conjugada, esto nos puede aportar valor.
  • word.isupper (): esta nos permite guardar un booleano para saber si está en mayúsculas.
  • word.istitle (): nos dice si es un título, es decir, si la primera letra de la palabra está en mayúscula.
  • word.isdigit (): nos dice si la palabra es un dígito.
  • Guardar el postag. Posteriormente, guardaremos los dos primeros caracteres del postag.

A continuación, definiremos un índice en el que recuperaremos la palabra anterior y la palabra siguiente. Esto se hace para recoger información del contexto sobre la entidad que vamos a intentar predecir.

Definimos las features que queremos usar:

#Entrenamiento de un modelo NER
def word2features (sent, i):
       word = sent [i] [0]
       postag = sent [i] [0]

       features = {
              'word.lower ()' : word.lower (),
              'word [-3:]' : word [-3:],
              'word [-2:]' : word [-2:],
              'word.isupper ()' : word.isupper (),
              'word.istitle ()' : word.istitle (),
              'word.isdigit ()' : word.isdigit (),
              'postag' : postag,
              'postag [:2]' : postag [:2]
       }

if i > 0:
       word_1 = sent [i - 1] [0]
       postag_1 = sent [i - 1] [1]

       features.update ({
              '-1 : word.lower ()' : word_1.lower (),
              '-1 : word.istitle ()' : word_1.istitle (),
              '-1 : word.isupper ()' : word.isupper (),
              '-1 : postag' : postag_1,
              '-1 : postag [:2]' : postag_1 [:2]
})
else:
       features ['BOS'] =True #Beginning of sentence

if i < len (sent) -1:
       word_1 = sent [i + 1] [0]
       postag_1 = sent [i + 1] [1]

       features.update ({
              '+1 : word.lower ()' : word_1.lower (),
              '+1 : word.istitle ()' : word_1.istitle (),
              '+1 : word.isupper ()' : word.isupper (),
              '+1 : postag' : postag_1,
              '+1 : postag [:2]' : postag_1 [:2]
})
else:
       features ['EOS'] = True #End of sentence

return features

Ahora generaremos la sentencia para la frase. Vamos a generar una lista que contendrá lo siguiente: para cada palabra de la frase, vamos a convertir esa palabra a features y le vamos a pasar la frase y el índice donde está a la lista.

#Entrenamiento de un modelo NER
def sent2features (sent):
       return [word2features (sent, i) for i in range (len (sent))]
#Entrenamiento de un modelo NER
def sent2labelss (sent):
       return [word [2] for word in sent]

Datos para entrenamiento, validación y testeo

#Entrenamiento de un modelo NER
X_train = [sent2features (s) for s in sentences_train]
y_train = [sent2labels (s) for s in sentences_train]

X_test = [sent2features (s) for s in sentences_test]
y_test = [sent2labels (s) for s in sentences_test]

X_val = [sent2features (s) for s in sentences_val]
y_val = [sent2labels (s) for s in sentences_val]
#Entrenamiento de un modelo NER
X_train [0]
Entrenamiento de un modelo NER

Entrenamiento de un modelo NER

Lo haremos por medio del sklearn crfsuite:

#Entrenamiento de un modelo NER
crf_ = sklearn_crfsuite.CRF (
       algorithm = 'lbfgs',
       c1 = 0.1,
       c2 = 0.1,
       keep_tempfiles = None,
       max_iterations = 100,
       all_possible_transitions = True

crf_.fit (X_train, y_train))
Entrenamiento de un modelo NER
#Entrenamiento de un modelo NER
X_train [1]

[{‘BOS’ : True,

‘EOS’ : True,

‘postag’ : ‘Fg’,

‘postag [:2]’ : ‘Fg’,

‘word.isdigit ()’ : False,

‘word.istitle ()’ : False,

‘word.isupper ()’ : False,

‘word.lower ()’ : ‘ – ‘ ‘,

‘word [-2:]’ : ‘ – ‘,

‘word [-3:]’ : ‘ – ‘ }]

y_train [1]

[‘0’]

Evaluación

Emplear los datos de validación:

#Entrenamiento de un modelo NER
def eval (X, y, remove0 = True):
       y_pred = crf_.predict (X)
       labels = list (crf_.classes_)

       if remove0:
              labels.remove ('0')

       f1_score_ = metrics.flat_f1_score (y, y_pred, average = 'weighted', labels = labels)
       print ('F1 score: {0 : .3f}'.format (f1_score_))

       #Group B and I results
       sorted_labels = sorted (
              labels,
              key = lambda name: (name [1:], name [0])
)

classification_report_ = metrics.flat_classification_report (y, y_pred, labels = sorted_labels, digits = 3)
print (classification_report_)
#Entrenamiento de un modelo NER
eval (X_val, y_val)
Entrenamiento de un modelo NER

Ahora que hemos visto las fases de entrenamiento de un modelo NER, es el momento de seguir aprendiendo. Para acceder a las opciones laborales del Big Data, una de las áreas en el mundo techie mejor pagadas y con mayor demanda, solo necesitas apuntarte al Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación intensiva e íntegra adquirirás todos los conocimientos a nivel tanto teórico como práctico que necesitas para conseguir el trabajo de tus sueños en menos de un año. ¡No sigas esperando para impulsar tu carrera y pide ya mismo más información!

Noticias recientes del mundo tech

¡CONVOCATORIA ABIERTA!

Big Data & Data Science

Full Stack Bootcamp

Clases en Directo | Acceso a +600 empresas | 98% de empleabilidad

Descárgate también el informe de tendencias en el mercado laboral 2026.

Fórmate con planes adaptados a tus objetivos y logra resultados en tiempo récord.
KeepCoding Bootcamps
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.