Tecnología

Con la llegada de este nuevo año, queremos estrenar desde Nymiz una nueva serie de artículos y posts que iremos publicando regularmente sobre noticias de actualidad y tecnologías dentro del campo de la I.A (Inteligencia Artificial), y más concretamente en el campo del procesamiento natural del lenguaje o NLP. De este modo, nuestro objetivo es tratar de contribuir en el campo open-source dando a conocer nuevas herramientas e innovaciones mediante casos de uso y ejemplos de desarrollo. 

En este artículo te voy a explicar lo que es Named Entity Recognition comúnmente conocido como NER con Spacy 3.0

¿Qué es NER?

Para empezar vamos a ver brevemente cuál es el significado de Named Entity Recognition, comúnmente conocido como NER. Se trata de una extracción de información dentro del NLP que consiste en localizar y clasificar entidades dentro de un texto. Por ejemplo: cantidades monetarias, nombres de personas, fechas, etc.

¿Qué es SPACY 3.0?

Hoy os traemos la recién estrenada versión 3.0 de la librería de Spacy (1). Como muchos sabréis, Spacy se ha convertido en uno del los principales frameworks de desarrollo en producción de modelos NLP, y esta nueva versión viene a revolucionar los estándares de sus predecesores.

Entre las muchas novedades que incorpora, cabe destacar principalmente la posibilidad de incorporar los famosos modelos Transformers a nuestro pipeline así como un nuevo flujo de trabajo que nos facilitará desarrollar nuestro proyecto NLP desde el prototipado hasta el despliegue en producción.

 

SPACY 3.0

Ejemplo para localizar y clasificar entidades (NER)

A continuación presentaremos un ejemplo de uso sencillo para localizar y clasificar entidades (NER), concretamente nombres de personas en español, haciendo uso del potente modelo BERTO (2) el cuál no es más que un modelo Transformer con la arquitectura BERT entrenado con corpus en Castellano. De este modo, lo aprovecharemos para solo centrarnos en entrenar nuestro propio clasificador.

 

DIAGRAMA DEL PROCESO DE ENTRENAMIENTO DEL MODELO BERT PARA CLASIFICAR ENTIDADES

 

Figura 1. Proceso de creación del modelo BERT y Finetuning para clasificar texto. Imagen del blog http://jalammar.github.io/illustrated-bert/

 

¡Manos a la obra!

1. Cómo configurar Spacy 3.0

Como bien nos recuerdan en la página de Spacy 3.0, esta nueva versión está terminando de ser desarrollada por lo que nos recomiendan tener un entorno propio en Python para usarla y evitar posibles futuros conflictos con otras librerías. En este caso haremos uso de Anaconda(3).

$ conda create –name <nombre_entorno> python=3.6

$ conda activate <nombre_entorno>

 

Te recomendamos crear también crear una carpeta donde almacenar todo. Nosotros crearemos una carpeta principal llamada spacy_folder y dentro de ella dos subcarpetas, datasets y output, dónde guardaremos los datasets de train-test y el modelo que se obtendrá al finalizar el entrenamiento respectivamente.

 

En el caso de que hagamos uso de alguna tarjeta gráfica con CUDA (altamente recomendable) instalaremos también Cupy (4), una librería de Python de código abierto especializada para trabajar con matrices y acelerada con NVIDA CUDA. La instalaremos con nuestra versión de CUDA.

$ nvcc –version

$ pip install cupy-cuda110

 

Finalmente, una vez que tengamos nuestro entorno de conda con las librerías de aceleración de CUDA, instalamos la librería de Spacy 3.0 y los modelos Transformers en castellano.

$ pip install -U pip setuptools wheel 

$ pip install -U spacy-nightly[cuda110,transformers] –pre

$ python -m spacy download es_dep_news_trf

 

Para terminar, comprobamos que la última versión de Spacy se ha instalado correctamente junto con el modelo transformer en castellano.

$ python -m spacy info

$ python -m spacy validate

 

COMANDO PARA COMPROBAR LA ULTIMA VERSION DE SPACY

 

¡Perfecto!

Estamos listos para pasar a entrenar nuestro modelo NER con Spacy 3.0 y los Transformers. No obstante, veamos antes algunas de las características que trae el nuevo flujo de trabajo que comentamos al principio del post y que nos resultarán especialmente útiles a la hora de entrenar nuestro modelo para clasificar entidades.

 

2. Características del flujo de trabajo de Spacy 3.0

Spacy 3.0 presenta un sistema completo y extensible para configurar tus entrenamientos. Usando un solo archivo de configuración podremos describir todos los detalles de la ejecución de la fase de entrenamiento, facilitando la repetición de los experimentos y el seguimiento de los cambios que vayamos haciendo a los hiper-parámetros del modelo.

Para hacérnoslo aún más fácil, los desarrolladores de Spacy nos han proporcionado una interfaz (5) con lo que podemos generar dicho archivo de configuración.

 

Interfaz de Spacy3.0 para crear el archivo base_config.cfg

Figura 2. Interfaz de Spacy3.0 para crear el archivo base_config.cfg

En nuestro caso seleccionaremos como propiedades:

  • Lenguaje: Castellano
  • Componentes: ner
  • Hardware: GPU
  • Optimize for: Accuracy 

 

Una vez seleccionada las propiedades de nuestro modelo a entrenar descargamos nuestro archivo que tendrá como nombre base_config.cfg.

Podéis añadir los componentes que deseis a vuestro pipeline e incluso modificarlo después manualmente. Al seleccionar la opción de Accuracy nuestro archivo se configurará para hacer uso del modelo transformer en vez del modelo de lenguaje estándar en castellano.

Los archivos .cfg deben estar siempre completos sin tener campos vacíos. Para ello usaremos el comando init fill-config ejecutando la siguiente sentencia en la carpeta donde hayamos guardado base_config.cfg:

$ python -m spacy init fill-config base_config.cfg config.cfg 

De este modo tendremos un nuevo archivo llamado config.cfg, ahora sí, listo para entrenar.

 

3. Convirtiendo datos en entrenamiento en Spacy 3.0

Cuando trabajamos con Spacy, a diferencia de otros frameworks, tenemos que convertir previamente nuestros datos de entrenamiento a un formato especial con extensión .spacy .

De nuevo, Spacy pone a nuestra disposición un comando para convertirlo a dicho formato. Deberás de seleccionar el formato que se desea convertir (6). En nuestro caso lo tenemos en formato IOB. 

$ python -m spacy convert -c iob -n 10 train.iob

Hay que tener especial cuidado en tener nuestros datos acordes a los requisitos de Spacy, sino no podremos convertirlo.

Con los datos listos en su formato correcto, ejecutamos el comando train para entrenar nuestro modelo, el cuál estará totalmente descrito en nuestro archivo config.cfg. Si queremos hacer uso de la GPU pasaremos 0 como parámetro a -g. Recuerda tener incluido el path de la localización de tus datasets en el archivo config.cfg, por el contrario podrás pasarlo como parámetro (–paths.train <path_de_train.spacy>). En nuestro caso lo hemos incluido en el archivo config.cfg:

$ python -m spacy train config.cfg –output ./output -g 0

 

COMANDO PARA ENTRENAR EL MODELO EN SPACY

 

Voilá! Tenemos nuestro modelo listo dentro de la carpeta model-best en el path ./output/model-best .

Dentro de model-best tendremos un archivo meta.json que contendrá una descripción de los componentes usados y métricas de rendimiento (precisión, recall y F1 en nuestro caso).

Por último, podemos evaluar el modelo si lo deseamos con el comando evaluate:

$ python -m spacy evaluate <path_modelo_entrenado> <path_dataset> -g 0

 

COMANDO PARA EVALUAR EL MODELO EN SPACY

 

 

4. Conclusiones: ¿Spacy es entonces la herramienta definitiva para NLP?

Como podemos observar, Spacy3.0 viene a traer grandes innovaciones en comparación con las antiguas versiones las cuales nos facilitarán enormemente la carga de trabajo a lo de hora de entrenar nuestros modelos de NLP. En este post hemos presentado por encima algunas de ellas, como el entrenamiento mediante la interfaz de línea de comandos y la configuración de los diferentes archivos, pero hay mucho más.

Si bien es cierto que para no ser una versión final funciona muy bien, puede ser que os encontréis con algún problema al entrenar o testear el modelo, por lo que habrá que estar atentos a posibles cambios que vayan incorporando de cara a la versión final. No obstante, ¡promete ser una gran comodidad para la gran mayoría de los desarrolladores!

En futuros posts continuaremos explorando las distintas funcionalidades y nuevas tecnologías.

 

5. Referencias sobre Spacy 3.0

  1. Spacy 3.0: https://nightly.spacy.io/
  2. BERTO: https://github.com/dccuchile/beto
  3. Instalación de Anaconda: https://docs.anaconda.com/anaconda/install/linux/
  4. Cupy: https://cupy.dev/
  5. Spacy widget for init.config file: https://nightly.spacy.io/usage/training#quickstart
  6. Spacy data format convertion: https://github.com/explosion/spaCy/tree/develop/extra/example_data/ner_example_data

 

¿Tienes más dudas sobre este tema? En Nymiz estaremos encantados de ayudarte.

Contáctanos aquí