Aprendendo a identificar skills usando Inteligência Artificial

minutos de leitura

20 de dezembro de 2022

Escrito por
Daniele Polotow

Quais são as habilidades mais pedidas para uma pessoa engenheira de software no Brasil? Quais vagas pedem uma determinada certificação ou curso superior? Ou ainda, quais são as habilidades mais relevantes atualmente e quais já caíram em desuso? Essas são perguntas importantes numa economia global que está passando por grandes mudanças, onde a qualificação e a requalificação assumem um senso de urgência para líderes e pessoas candidatas. O time de Inteligência Artificial da Gupy está trabalhando para entender esta dinâmica de distribuição de habilidades nas vagas publicadas na nossa plataforma. Aqui apresento uma introdução técnica de parte do projeto chamado de Taxonomia de Skills (ou Taxonomia de Habilidades, em Português) que está em desenvolvimento hoje na Gupy. 

Para começar podemos fazer duas perguntas importantes: 

  • O que é uma taxonomia de skills? A taxonomia de skills é uma organização hierárquica de habilidades, que podem ser tanto técnicas (as chamadas hard skills) como comportamentais (conhecidas como soft skills).
  • Qual é a função de uma taxonomia de skills? No contexto da Gupy, a sua função principal é oferecer uma forma de organizar, gerenciar e identificar as habilidades necessárias para uma vaga e também tem o potencial de conectar candidatos e vagas de forma mais eficiente e justa. 

Neste projeto, usamos técnicas de Inteligência Artificial (IA) do ramo do processamento de linguagem natural (NLP na sigla em Inglês) focando no uso de reconhecimento de entidade nomeada (NER na sigla em Inglês), em mais de 400 mil vagas já publicadas na Gupy. Nas seguintes seções, explicamos em detalhe o uso dessas ferramentas, descrevemos como é o nosso passo a passo (pipeline em Inglês) de treinamento da IA e discutimos os principais pontos de atenção e soluções encontradas.

NLP e NER: conceitos básicos 

Antes de descrever a técnica que usamos, é importante entender alguns conceitos básicos por trás das siglas que usamos acima. Vamos começar com o NLP ou o processamento de linguagem natural. O NLP se refere a um ramo da inteligência artificial que tem como objetivo dar aos computadores a capacidade de entender, analisar e interpretar a linguagem natural. Uma linguagem natural é o que nós, seres humanos, usamos para nos comunicar. 

Esse entendimento da linguagem natural não é o mesmo que o entendimento que os computadores têm das linguagens de programação. É interessante fazer este contraste porque uma linguagem de programação foi criada especialmente para se comunicar com computadores. Essas linguagens de programação são muito mais restritas e não têm a complexidade de uma linguagem usada por seres humanos.

Para entender a linguagem natural, o NLP combina linguística computacional – modelagem baseada em regras da linguagem humana – com modelos estatísticos, de aprendizado de máquina e aprendizado profundo. Juntas, essas tecnologias permitem que os computadores processem a linguagem humana e 'compreendam' seu significado completo, levando em conta a intenção e o sentimento da pessoa que criou o texto.

Atualmente, o NLP tem uma caixinha de ferramentas bem diversificada, que podem ser usadas para diversos tipos de tarefas. O texto pode ser segmentado (em palavras e pontuações) e as palavras classificadas (como verbo ou sujeito, por exemplo). Podemos comparar palavras, extensões de texto e documentos e para ter uma noção de semelhança entre eles. Ou ainda podemos rotular objetos do “mundo real”, como pessoas, empresas ou locais. Esta última ferramenta de rótulo é chamada de NER e é o que usamos neste projeto. 

O NER tem a tarefa de identificar e categorizar entidades (que são as informações-chave) em dados não estruturados. Os dados não estruturados são, geralmente, informações textuais que não estão organizadas no que chamamos informalmente de tabelas. Por isso, o NER às vezes é também conhecido como fragmentação, extração ou identificação de entidades, já que o objetivo é fragmentar o texto em pedaços menores e categorizar os pedaços que têm o mesmo sentido. As entidades representam as informações que a pessoa cientista de dados deseja extrair do texto. Uma entidade é um intervalo de texto que pode consistir em uma ou mais palavras. Este intervalo de texto deve ter um significado bem definido e deve se referir consistentemente à mesma informação. Por exemplo, o NER pode detectar a palavra “Gupy” em um texto e classificá-lo como uma “Empresa”, assim como também pode detectar “Google”, “Facebook” e “Ambev” como empresas. Outras categorias de entidades mais comuns são pessoas, localidade, eventos, produtos e vários tipos de valores numéricos (porcentagens, valores monetários, tempo, data, etc).

A ferramenta utilizada para essa visualização é o Prodigy, que tem uma interface de anotação web que usa cores para ressaltar as entidades e facilitar a tarefa de anotação. Aqui temos exemplos de entidades anotadas como empresas, localidade e ano.

As principais aplicações do NER são classificação de textos, criação de algoritmos de buscas eficientes e recomendação de conteúdo. O NER é adequado para qualquer situação em que uma visão geral de uma grande quantidade de texto seja útil. Com o NER, você pode entender o assunto ou tema de um corpo de texto ou agrupar textos rapidamente com base em sua relevância ou semelhança.

Na Gupy, usamos o NER na extração das informações dos currículos que são enviados para a plataforma e na detecção de dados relevantes nas vagas, como as habilidades para o projeto de Taxonomia de Skills. As duas aplicações funcionam de forma semelhante e atualmente usam as mesmas tecnologias e ferramentas para extração de dados textuais. Na seção seguinte, exploro com mais detalhes a nossa metodologia para o levantamento de dados para o projeto de Taxonomia de Skills.

Pipeline para treinamento de um modelo NER


A figura 1 mostra uma visão geral do pipeline que estamos construindo na Gupy para a identificação e extração de skills das vagas publicadas. Atualmente, contamos com um modelo em produção para consultas internas, mas todo o pipeline está em constante evolução. O código foi escrito em linguagem Python, as principais ferramentas utilizadas foram spaCy, Prodigy, FastAPI, e os modelos Tok2Vec e Hugging Face transformers; além das dezenas de bibliotecas clássicas do Python para NLP. Abaixo, descrevo com mais detalhes os pontos mais importantes do passo a passo de todo o processo.

Definição das entidades e anotação manual

O primeiro passo é a preparação do conjunto de dados, considerando os algoritmos e as configurações que serão usadas. Existem várias bibliotecas de código aberto excelentes para identificação de entidades, incluindo NLTK, spaCy e Stanford NER. Essas bibliotecas são pré-treinadas e podem identificar uma variedade de entidades nomeadas e entidades numéricas, incluindo empresas, locais, organizações e produtos. Caso a sua intenção seja encontrar entidades diferentes daquelas pré-treinadas por estes modelos, o seu trabalho começa a ficar mais complexo. Antes de começar a usar uma dessas bibliotecas para construir um modelo, você precisará produzir um conjunto de dados anotados que seja relevante para o seu problema. 

Este foi o nosso caso. Infelizmente, não há modelos pré-treinados para reconhecer entidades que são importantes na taxonomia de skills. Isso significa que precisamos construir uma base de dados anotada manualmente do zero, em uma quantidade suficiente para que o modelo aprenda a reconhecê-las. A “quantidade suficiente” é algo bastante variável e difícil de prever, mas geralmente depende das métricas de treinamento do seu modelo. No nosso caso, anotamos 3200 vagas para o treinamento e validação do modelo e 640 vagas para o teste. O Prodigy recebe os dados brutos e metadados em formato JSONL (entre outros). Uma amostra de uma vaga pode ser vista na próxima figura.

Um exemplo de um texto bruto de uma vaga em formato JSONL, com o formato e os metadados necessários para o Prodigy.

A anotação é uma tarefa manual longa (e bastante chata), que lida com homônimos/heterônimos de texto, erros de digitação, ambiguidades, descrições incompletas, etc. Para ajudar nessa tarefa de anotação manual, usamos a ferramenta Prodigy, que é rápida e permite que os próprios cientistas de dados construam suas bases para testar hipóteses. Para ficar um pouco mais claro como foi o processo, vamos usar um exemplo: um texto com uma vaga de emprego fictícia com algumas anotações indicando hard skills, soft skills, experiência e idiomas. Estas anotações são exemplos das entidades que desejamos extrair do texto. A extração final é literalmente uma lista com estas palavras ou grupo de palavras que estão indicadas na figura abaixo

Aqui usamos novamente o Prodigy, agora com quatro entidades e os mesmos dados brutos que mostramos na figura anterior. Aqui temos algumas entidades que podemos considerar como hard skills (“Python” por exemplo) e soft skills (“trabalho em equipe”), além da experiência e idiomas.

A anotação manual é um passo que consome muito tempo, mas é essencial para o sucesso de um projeto com entidades personalizadas. Aqui criamos a “ground truth” (ou o “padrão ouro” em Português) que o algoritmo usará para aprender o que é e quando reconhecer uma entidade. No final do processo, temos um conjunto de dados de treinamento de alta qualidade que você pode usar para personalizar seu modelo NER. Já falamos um pouco sobre anotação manual em um artigo anterior do blog. 

Treinamento do modelo

Finalmente, chegamos no passo mais esperado: o treinamento do modelo. Se você seguiu todas as orientações anteriores e tem uma base de dados anotada relevante e com muitos exemplos, esse passo geralmente é o mais simples. As recomendações aqui são as mesmas de qualquer modelo de aprendizado de máquina: ajuste os parâmetros com uma validação cruzada (ou seja, divida os dados de uma forma que reduza as chances de super-ajustar o modelo) e use métricas que se adaptem bem ao seu problema de classificação. Para treinar nossos modelos, usamos o spaCy, que tem um sistema de reconhecimento de entidade estatística extremamente rápido, que atribui rótulos a extensões contíguas de tokens.

A melhor métrica para o seu modelo NER vai depender do seu objetivo e você deve consultar a documentação para a sua decisão. Nós usamos o F-score (média harmônica da precisão e do recall) na validação do modelo. Um bom F-score pode variar dependendo do seu objetivo. Para nós, buscamos F-score acima de 0.85 e usamos algumas iterações de anotações e treinos para chegar neste resultado. 

O spaCy recomenda treinar o seu modelo usando o comando spacy train na linha de comando. O treinamento só precisa de um único arquivo de configuração, o config.cfg, que inclui todas as configurações e hiperparâmetros. Esse arquivo pode ser criado no próprio site do spaCy como quickstart. Mais detalhes de como treinar os modelos podem ser encontrados no GitHub da Explosion, empresa que desenvolve o Prodigy e o spaCy, entre outras ferramentas.

Nós testamos tanto o Tok2Vec quanto o Hugging Face transformers nos nossos pipelines e o resultado foi semelhante. Mais importante do que o modelo utilizado, percebemos que a quantidade de dados anotados é que faz a diferença nas métricas que monitoramos. Por isso, voltamos ao passo de anotação algumas vezes, retreinando o modelo em cada rodada, até atingir uma métrica satisfatória para colocar o modelo em produção.

Próximos Passos 

Seguindo esta metodologia, conseguimos extrair informações úteis sobre a composição de skills e experiências de cerca de 400 mil vagas que estão na base de dados da Gupy. Agora temos um modelo que é capaz de listar as skills mais importantes para uma determinada vaga. O resultado foi demonstrado em um aplicativo no evento HR4results de 2022, onde o usuário pode consultar uma vaga e ter acesso a uma taxonomia de skills daquela posição. Essas informações agregadas têm um alto potencial de inteligência de mercado e são únicas, já que só podem ser fornecidas pela Gupy.

Este é um arquivo GIF com uma demonstração de uso do aplicativo que foi levado ao evento HR4results de 2022; o usuário pode consultar uma vaga e ter acesso a uma taxonomia de skills daquela posição.

Informações como essa fornecem um elo para empregadores e candidatos em potencial: identificar as habilidades associadas às vagas que são mais pedidas agora e que provavelmente serão relevantes no futuro. Este resultado também é importante para que candidatos possam aprender novas habilidades à medida que crescem nas suas carreiras ao longo do tempo. Estamos ansiosos para usar a metodologia de taxonomia de skills para mais pesquisas e outras aplicações no futuro.

Quer fazer parte do nosso time de engenharia também? Encontre a vaga perfeita para você na nossa página de carreiras!