Qué se necesita para entrenar un modelo NER

| Última modificación: 16 de mayo de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo veremos algunas de las cosas que necesitaremos para entrenar un modelo NER. Cabe resaltar que estas pueden variar dependiendo del tipo de modelo que tengamos o de nuestras necesidades específicas.

¿Qué emplearemos para entrenar el modelo NER?

Dataset

El dataset que usaremos será el CoNLL 2002, con PoS Tags.

La CoNLL (Conference on Computational Natural Language Learning) es una conferencia anual organizada por la SIGNLL (ACL’s Special Interest Group of Natural Language Processing). Usaremos un corpus con frases en castellano con información tanto de los PoS Tags como de entidades etiquetadas. Este dataset ya está etiquetado (con PoS Tagging).

Librería

Asimismo, emplearemos la librería sklearn crfsuite. Es decir, de scikit learn usaremos el algoritmo implementado de CRF. Esto significa que no tendremos que empezar de cero, ya que el algoritmo viene implementado dentro del paquete de sklearn.

La instalación de la librería se hace del siguiente modo:

#Modelo NER
pip install sklearn-crfsuite

Importaciones y otros aspectos

Tendremos que instalar la librería de sklearn crfsuite:

#Modelo NER
!pip install sklearn_crfsuite 'scikit - learn < 0.24'

Es completamente normal que nos aparezca el siguiente error a la hora de ejecutar y no interfiere en el proceso:

modelo NER

Esto lo que nos indica es que pip dice que puede haber, a lo mejor, un conflicto entre las librerías que estamos intentando instalar y que puede surgir algún problema a la hora de ejecutarse, pero esta no es una alerta a la que debamos prestar mucha atención.

Ahora lo que haremos serán los imports:

#Modelo NER
import os
import io

import pandas as pd

import sklearn_crfsuite
from sklearn_crfsuite import scorers
#Para poder evaluar el modelo:
from sklearn_crfsuite import metrics

Funciones útiles

Esta es una forma de cargar los datos del dataset, para no estar en la tediosa labor de hacer la implementación de toda la carga del dataset, de la extensión de las frases, etiquetas que vienen… Al fin y al cabo, el dataset no está bien curado, tiene cosillas que están en bruto y hay que procesarlas un poco. Aquí nos encargaremos de esa labor, se hace todo con pandas, groupby y demás:

#Modelo NER
def load_data (filepath):
       with io.open (filepath, encoding = 'latin - 1') as f:
              idsent = 0
              sentences = [  ]
              for l in f:
                     if not len (l.strip ()):
                            sentence = [  ]
                            idsent += 1
                     else:
                            word, pos, ner = l.strip ().split ('  ')
                            sentences.append (['sentence#' + str (idsent), word, pos, ner])

              df = pd.DataFrame (sentences)
              df.columns = ['Sentence#' , 'word' , 'pos' , 'ner']

              return df
#Modelo NER
def data_summary (data):
       print ("Number of sentences: ", len (data.groupby (['Sentence#'])))

       words = list (set (data ["word"].values))
       n_words = len (words)
       print ("Number of words in the dataset: ", n_words)

       tags = list (set (data ["ner"].values))
       print ("NER Tags: ", tags)
       n_tags = len (tags)
       print ("Number of Labels: ", n_tags)

       print ("What the dataset looks like: ")
       display (data.head (10))
       return
#Modelo NER
def get_sentences (data):
       sentgroups = data.groupby ('Sentence#')

       sentences = [  ]
       for name, g in sentgroups:
              s = [  ]
              for row in g.itertuples ():
                     s.append ((row.word, row.pos, row.ner))
              sentences.append (s)

       return sentences
#Modelo NER
def get_labels (data):
       tags = list (set (data ["ner"].values))
       return tags

Carga de datos

Lo que haremos será cargar los datos y descomprimirlos:

#Modelo NER
! wget https://transfer.sh/KWNxRn/datasets.zip
! unzip datasets.zip
#Modelo NER
datasets_path = './datasets/CoNLL2002_NER'
corpus_train_file = 'esp.train'
corpus_test_file = 'esp.testa'
corpus_val_file = 'esp.testtb'

Crearemos tres dataframes diferentes: uno que usaremos para entrenamiento, otro para la parte de test y otro para emplear en la validación.

Estos dataframes están procesados, pero todavía están demasiado en bruto:

#Modelo NER
df_train = load_data (os.path.join (datasets_path, corpus_train_file))
df_test = load_data (os.path.join (datasets_path, corpus_test_file))
df_val = load_data (os.path.join (datasets_path, corpus_val_file))

Lo que haremos, por tanto, es obtener simplemente las frases para hacer el train, test y validation:

#Modelo NER
sentences_train = get_sentences (df_train)
sentences_test = get_sentences (df_test)
sentences_val = get_sentences (df_val)
#Modelo NER
data_summary (df_train)

Number of sentences: 8323

Numbers of words in the dataset: 26099

NER Tags: [ ‘I – PER’, ‘B – PER’, ‘0’, ‘I – ORG’, ‘B – ORG’, ‘B – MISC’, ‘I – MISC’, ‘B – LOC’, ‘I – LOC’]

Number of Labels: 9

What the dataset looks like:

Ahora que hemos visto qué se necesita para implementar un modelo NER, es el momento de seguir aprendiendo. Para acceder a las opciones laborales del Big Data, que es una de las áreas en el ámbito tech mejor pagadas y con mayor demanda, no puedes perderte el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación intensiva e íntegra de alta calidad adquirirás, en poco tiempo, todos los conocimientos a nivel teórico y práctico necesarios para conseguir tu trabajo ideal. ¡No sigas esperando para impulsar tu futuro laboral y solicita ahora 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