Mergulho Profundo no Algoritmo do Analisador
Para os curiosos técnicos, esta seção mergulha no algoritmo do analisador CVAts e percorre os 4 passos de como ele funciona. (Note que o algoritmo foi projetado para analisar currículos de coluna única em português e inglês)
Passo 1. Ler os itens de texto de um arquivo PDF
Um arquivo PDF é um formato de arquivo padronizado definido pela especificação ISO 32000. Quando você abre um arquivo PDF usando um editor de texto, notará que o conteúdo bruto parece codificado e é difícil de ler. Para exibi-lo em um formato legível, você precisaria de um leitor de PDF para decodificar e visualizar o arquivo. Da mesma forma, o analisador de currículos primeiro precisa decodificar o arquivo PDF para extrair seu conteúdo de texto.
Embora seja possível escrever uma função personalizada de leitura de PDF seguindo a especificação ISO 32000, é muito mais simples aproveitar uma biblioteca existente. Neste caso, o analisador de currículos usa a biblioteca de código aberto pdf.js da Mozilla para primeiro extrair todos os itens de texto no arquivo.
A tabela abaixo lista 0 itens de texto que são extraídos do PDF do currículo adicionado. Um item de texto contém o conteúdo de texto e também alguns metadados sobre o conteúdo, por exemplo, suas posições x, y no documento, se a fonte está em negrito ou se inicia uma nova linha. (Note que a posição x,y é relativa ao canto inferior esquerdo da página, que é a origem 0,0)
Passo 2. Agrupar itens de texto em linhas
Os itens de texto extraídos ainda não estão prontos para usar e têm 2 problemas principais:
Problema 1: Eles têm alguns ruídos indesejados.Alguns itens de texto únicos podem ser quebrados em múltiplos, como você pode observar na tabela acima, por exemplo, um número de telefone "(11) 98765-4321" pode ser quebrado em 3 itens de texto "(11) 98765", "-" e "4321".
Solução: Para resolver este problema, o analisador de currículos conecta itens de texto adjacentes em um único item de texto se a distância entre eles for menor que a largura média típica de caractere, ondeA largura média típica de caractere é calculada dividindo a soma das larguras de todos os itens de texto pelo número total de caracteres dos itens de texto (Textos em negrito e elementos de nova linha são excluídos para não distorcer os resultados).
Problema 2: Eles carecem de contextos e associações.Quando lemos um currículo, escaneamos linha por linha. Nossos cérebros podem processar cada seção por meio de pistas visuais como negrito e proximidade dos textos, onde podemos rapidamente associar textos mais próximos como um grupo relacionado. No entanto, os itens de texto extraídos atualmente não têm esses contextos/associações e são apenas elementos desconexos.
Solução: Para resolver este problema, o analisador de currículos reconstrói esses contextos e associações de forma similar a como nosso cérebro leria e processaria o currículo. Primeiro agrupa os itens de texto em linhas, já que lemos texto linha por linha. Em seguida, agrupa linhas em seções, o que será discutido no próximo passo.
No final do passo 2, o analisador de currículos extrai 0 linhas do PDF do currículo adicionado, conforme mostrado na tabela abaixo. O resultado é muito mais legível quando exibido em linhas. (Algumas linhas podem ter múltiplos itens de texto, que são separados por um divisor vertical azul | )
Passo 3. Agrupar linhas em seções
No passo 2, o analisador de currículos começa a construir contextos e associações aos itens de texto agrupando-os primeiro em linhas. O Passo 3 continua o processo para construir associações adicionais agrupando linhas em seções.
Note que cada seção (exceto a seção de perfil) começa com um título de seção que ocupa toda a linha. Este é um padrão comum não apenas em currículos, mas também em livros e blogs. O analisador de currículos usa este padrão para agrupar linhas no título de seção mais próximo acima dessas linhas.
O analisador de currículos aplica algumas heurísticas para detectar um título de seção. A principal heurística para determinar um título de seção é verificar se ele preenche todas as 3 seguintes condições:
1. É o único item de texto na linha
2. Está em negrito
3. Suas letras estão todas em MAIÚSCULAS
Em palavras simples, se um item de texto é duplamente enfatizado para estar em negrito e maiúsculas, é muito provável que seja um título de seção em um currículo. Isso geralmente é verdade para um currículo bem formatado. Pode haver exceções, mas provavelmente não é um bom uso de negrito e maiúsculas nesses casos.
O analisador de currículos também tem uma heurística de fallback se a heurística principal não se aplicar. A heurística de fallback principalmente realiza uma correspondência de palavras-chave contra uma lista de palavras-chave comuns de títulos de seção de currículo.
No final do passo 3, o analisador de currículos identifica as seções do currículo e agrupa essas linhas com o título de seção associado, conforme mostrado na tabela abaixo. Note que os títulos de seção estão em negrito e as linhas associadas à seção são destacadas com as mesmas cores.
Passo 4. Extrair currículo das seções
O Passo 4 é o último passo do processo de análise de currículo e também é o núcleo do analisador de currículos, onde ele extrai informações do currículo das seções.
Sistema de Pontuação de Recursos
A essência do motor de extração é um sistema de pontuação de recursos. Cada atributo de currículo a ser extraído tem um conjunto de recursos personalizados, onde cada conjunto de recursos consiste em uma função de correspondência de recursos e uma pontuação de correspondência de recursos se corresponder (a pontuação de correspondência de recursos pode ser um número positivo ou negativo). Para calcular a pontuação final de recursos de um item de texto para um atributo de currículo específico, ele executaria o item de texto através de todos os seus conjuntos de recursos e somaria as pontuações de recursos correspondentes. Este processo é realizado para todos os itens de texto dentro da seção, e o item de texto com a maior pontuação de recursos calculada é identificado como o atributo de currículo extraído.
Como demonstração, a tabela abaixo mostra 3 atributos de currículo na seção de perfil do PDF do currículo adicionado.
Atributo de Currículo | Texto (Maior Pontuação de Recurso) | Pontuações de Recursos de Outros Textos |
---|---|---|
Nome | ||
Telefone |
Conjuntos de Recursos
Tendo explicado o sistema de pontuação de recursos, podemos mergulhar mais em como os conjuntos de recursos são construídos para um atributo de currículo. Ele segue 2 princípios:
1. Os conjuntos de recursos de um atributo de currículo são projetados em relação a todos os outros atributos de currículo dentro da mesma seção.
2. Os conjuntos de recursos de um atributo de currículo são criados manualmente com base em suas características e probabilidade de cada característica.
A tabela abaixo lista alguns dos conjuntos de recursos para o atributo de currículo nome. Ela contém função de recurso que corresponde ao atributo nome com pontuação de recurso positiva e também função de recurso que corresponde apenas a outros atributos de currículo na seção com pontuação de recurso negativa.
Conjuntos de Recursos de Nome | |
---|---|
Função de Recurso | Pontuação de Correspondência |
Contém apenas letras, espaços ou pontos | +3 |
Está em negrito | +2 |
Contém todas as letras maiúsculas | +2 |
Contém @ | -4 (corresponde email) |
Contém número | -4 (corresponde telefone) |
Contém , | -4 (corresponde endereço) |
Contém / | -4 (corresponde url) |
Função de Recurso Principal
Cada atributo de currículo tem múltiplos conjuntos de recursos. Eles podem ser encontrados no código-fonte na pasta extract-resume-from-sections e não vamos listá-los todos aqui. Cada atributo de currículo geralmente tem uma função de recurso principal que os identifica amplamente, então vamos listar a função de recurso principal abaixo.
Atributo de Currículo | Função de Recurso Principal | Regex |
---|---|---|
Nome | Contém apenas letras, espaços ou pontos | /^[a-zA-Z\s\.]+$/ |
Corresponde formato de email xxx@xxx.xxx xxx pode ser qualquer coisa que não seja espaço | /\S+@\S+\.\S+/ | |
Telefone | Corresponde formato de telefone (xxx)-xxx-xxxx () e - são opcionais | /\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/ |
Localização | Corresponde formato cidade e estado Cidade, UF | /[A-Z][a-zA-Z\s]+, [A-Z]{2}/ |
Url | Corresponde formato de url xxx.xxx/xxx | /\S+\.[a-z]+\/\S+/ |
Instituição | Contém palavra-chave de escola, ex: Faculdade, Universidade, Escola | |
Grau | Contém palavra-chave de grau, ex: Técnico, Graduação, Mestrado | |
Média | Corresponde formato de média x.xx | /[0-4]\.\d{1,2}/ |
Data | Contém palavra-chave de data relacionada a ano, mês, estações ou a palavra Presente | Ano: /(?:19|20)\d{2}/ |
Cargo | Contém palavra-chave de cargo, ex: Analista, Engenheiro, Estagiário | |
Empresa | Está em negrito ou não corresponde cargo e data | |
Projeto | Está em negrito ou não corresponde data |
Caso Especial: Subseções
A última coisa que vale a pena mencionar são as subseções. Para a seção de perfil, podemos passar diretamente todos os itens de texto para os sistemas de pontuação de recursos. Mas para outras seções, como educação e experiência profissional, temos que primeiro dividir a seção em subseções, já que pode haver múltiplas escolas ou experiências de trabalho na seção. O sistema de pontuação de recursos então processa cada subseção para recuperar os atributos de currículo de cada uma e anexar os resultados.
O analisador de currículos aplica algumas heurísticas para detectar uma subseção. A principal heurística para determinar uma subseção é verificar se o espaço vertical entre 2 linhas é maior que o espaço de linha típico * 1.4, já que um currículo bem formatado geralmente cria uma nova quebra de linha vazia antes de adicionar a próxima subseção. Também há uma heurística de fallback se a heurística principal não se aplicar para verificar se o item de texto está em negrito.
E isso é tudo sobre o algoritmo do analisador CVAts :)