Entrenamiento de un modelo NER

| Última modificación: 10 de julio de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

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
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!

Sandra Navarro

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

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado