Escribo este artículo a raíz de la charla «Deep Learning Solution to improve match-making» que dio Didac Fortuny el 15 de febrero en la sesión de Saturdays.AI en Barcelona. Didac explicó un proyecto muy interesante, cubriendo en su presentación temas técnicos en profundidad. Didac trabaja como Data Scientist en Adevinta, la mayor empresa de anuncios clasificados en España y propietaria de Infojobs, la web para la que hizo este proyecto. Además también participa en DataForGoodBCN, una organización sin ánimo de lucro que busca conectar data scientists con ONGs que los necesiten.
Descripción del problema
En las webs de anuncios clasificados para buscar trabajos hay un problema al escribir los títulos de los puestos de trabajo, tanto para las empresas que publican ofertas como para quienes buscan trabajo y publican su curriculum. Al escribir descripciones de los puestos de trabajo cada persona las escribe de una forma distinta, hay errores ortográficos, en un lenguaje como el español (idioma principal de Infojobs), un mismo puesto de trabajo puede tener dos palabras, una en masculino y otra en femenino.
Todo esto hace que por no buscar exactamente las mismas palabras, no se encuentren quien busca trabajo y la empresa que ofrece trabajo.
El objetivo de este proyecto es categorizar los nombres de puestos de trabajo para que se encuentren las ofertas con los candidatos. Queremos que dada una descripción de trabajo nueva, poderla clasificar dentro de una de las categorías existentes.
Resolución del problema
Se parte de una taxonomía (una lista de categorías posibles) creada por la unión europea que contiene unas 3000 categorías de puestos de trabajo. La taxonomia se llama ESCO y puede ser encontrada en https://ec.europa.eu/esco/portal/occupation
Para cada categoría tenemos varias entradas con posibles nombres del puesto de trabajo. Con esto generamos nuestro training set. Miramos todas las ofertas de trabajo y currículums disponibles y siempre que nos aparezca uno de esos nombres, sabremos a qué categoría pertenece con certeza.
Con estos datos de entrenamiento se genera un modelo preliminar y con él se generan predicciones para las ofertas que no hayamos encontrado una coincidencia exacta. Hizo falta una persona que revisase todas estas predicciones para asegurar que el modelo funcionase bien, y con estas predicciones revisadas se amplía el training set y se entrena otro modelo más avanzado.
Modelo de lenguaje
Para este proyecto se ha utilizado un modelo de lenguaje basado en todos los artículos de Wikipedia . Este modelo se ha parametrizado para que funcione con el tipo de lenguaje utilizado en la web de Infojobs mediante técnicas de transfer learning
Se utiliza un modelo basado en LSTM implementado con Pytorch y Fast.ai
Implementación
Se usan microservicios de Kafka. Se reciben nuevas descripciones de puestos de trabajo, se categorizan con el modelo generado anteriormente y se archivan.
Es neceseraio reevaluar periódicamente el funcionamiento del modelo pues pueden aparecer nuevas profesiones o cambiar la forma en que se llama a una profesión concreta.
Resultado final
Dada una oferta de trabajo o currículum, lo clasifica en una categoría de trabajo y nos da una confidence score
Evaluando el modelo con datos que nunca haya visto (test set) podemos ver en qué categorías acierta o falla más. Sabiendo esto nos podemos enfocar a mejorar el modelo en estas categorías, dándole más ejemplos de ellas.
Finalmente se consigue categorizar el 90% de puestos de trabajo correctamente.
Puedes ver la charla completa en youtube (sólo disponible en inglés)