Quais algoritmos devo usar para executar a classificação do trabalho com base nos dados do currículo?

28

Note que estou fazendo tudo em R.

O problema é o seguinte:

Basicamente, eu tenho uma lista de currículos (CVs). Alguns candidatos terão experiência profissional antes e outros não. O objetivo aqui é: com base no texto em seus currículos, quero classificá-los em diferentes setores de trabalho. Sou particular naqueles casos em que os candidatos não têm nenhuma experiência / são estudantes e quero fazer uma previsão para classificar em quais setores de trabalho esse candidato provavelmente pertencerá após a graduação.

Pergunta 1: Conheço algoritmos de aprendizado de máquina. No entanto, eu nunca fiz PNL antes. Me deparei com a alocação de Dirichlet latente na internet. No entanto, não tenho certeza se essa é a melhor abordagem para resolver meu problema.

Minha idéia original: fazer disso um problema de aprendizado supervisionado . Suponha que já tenhamos uma grande quantidade de dados rotulados, o que significa que rotulamos corretamente os setores de trabalho para uma lista de candidatos. Nós treinamos o modelo usando algoritmos ML (ou seja, vizinho mais próximo ...) e alimentamos os dados não rotulados , que são candidatos que não têm experiência profissional / são estudantes, e tentamos prever a que setor de trabalho eles pertencerão.

Atualizar pergunta 2: seria uma boa idéia criar um arquivo de texto extraindo tudo em um currículo e imprimi-los no arquivo de texto, para que cada currículo seja associado a um arquivo de texto que contenha cadeias não estruturadas e, em seguida, aplicou técnicas de mineração de texto aos arquivos de texto e transformou os dados em estrutura ou até para criar uma matriz de frequência de termos usados ​​nos arquivos de texto? Por exemplo, o arquivo de texto pode ser algo como isto:

I deployed ML algorithm in this project and... Skills: Java, Python, c++ ...

Isto é o que eu quis dizer com 'não estruturado', ou seja, recolhendo tudo em uma única linha de string.

Esta abordagem está errada? Corrija-me se você acha que minha abordagem está errada.

Pergunta 3: A parte complicada é: como identificar e extrair as palavras-chave ? Usando o tmpacote no R? em que algoritmo o tm pacote se baseia? Devo usar algoritmos de PNL? Se sim, quais algoritmos devo analisar? Por favor, aponte-me para alguns bons recursos para analisar também.

Alguma idéia seria ótima.

user1769197
fonte

Respostas:

14

Confira este link.

Aqui, eles guiarão você através do carregamento de texto não estruturado para criar uma nuvem de palavras. Você pode adaptar essa estratégia e, em vez de criar uma nuvem de palavras, pode criar uma matriz de frequência dos termos usados. A idéia é pegar o texto não estruturado e estruturá-lo de alguma forma. Você altera tudo para minúsculo (ou maiúsculo), remove palavras de parada e encontra termos frequentes para cada função do trabalho, através de Matrizes de termos do documento. Você também tem a opção de conter as palavras. Se você contiver palavras, poderá detectar diferentes formas de palavras como a mesma palavra. Por exemplo, 'programado' e 'programação' podem ser direcionados para 'programa'. Você pode adicionar a ocorrência desses termos frequentes como um recurso ponderado no treinamento do seu modelo de ML.

Você também pode adaptar isso a frases frequentes, encontrando grupos comuns de 2 a 3 palavras para cada função.

Exemplo:

1) Carregue bibliotecas e construa os dados de exemplo

library(tm)
library(SnowballC)

doc1 = "I am highly skilled in Java Programming.  I have spent 5 years developing bug-tracking systems and creating data managing system applications in C."
job1 = "Software Engineer"
doc2 = "Tested new software releases for major program enhancements.  Designed and executed test procedures and worked with relational databases.  I helped organize and lead meetings and work independently and in a group setting."
job2 = "Quality Assurance"
doc3 = "Developed large and complex web applications for client service center. Lead projects for upcoming releases and interact with consumers.  Perform database design and debugging of current releases."
job3 = "Software Engineer"
jobInfo = data.frame("text" = c(doc1,doc2,doc3),
                     "job" = c(job1,job2,job3))

2) Agora fazemos uma estruturação de texto. Estou certo de que existem maneiras mais rápidas / mais curtas de fazer o seguinte.

# Convert to lowercase
jobInfo$text = sapply(jobInfo$text,tolower)

# Remove Punctuation
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[[:punct:]]"," ",x))

# Remove extra white space
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[ ]+"," ",x))

# Remove stop words
jobInfo$text = sapply(jobInfo$text, function(x){
  paste(setdiff(strsplit(x," ")[[1]],stopwords()),collapse=" ")
})

# Stem words (Also try without stemming?)
jobInfo$text = sapply(jobInfo$text, function(x)  {
  paste(setdiff(wordStem(strsplit(x," ")[[1]]),""),collapse=" ")
})

3) Faça uma fonte de corpus e matriz de termos de documento.

# Create Corpus Source
jobCorpus = Corpus(VectorSource(jobInfo$text))

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

# Create Term Frequency Matrix
jobFreq = as.matrix(jobDTM)

Agora temos a matriz de frequência, jobFreq, que é uma matriz (3 por x), 3 entradas e número X de palavras.

Aonde você vai daqui depende de você. Você pode manter apenas palavras específicas (mais comuns) e usá-las como recursos em seu modelo. Outra maneira é mantê-lo simples e ter uma porcentagem de palavras usadas em cada descrição do trabalho, digamos "java" teria 80% de ocorrência em 'engenheiro de software' e apenas 50% de ocorrência em 'garantia de qualidade'.

Agora é hora de procurar por que 'garantia' tem 1 'r' e 'ocorrência' tem 2 'r' s.

nfmcclure
fonte
Eu adoraria ver o seu exemplo.
user1769197
Atualizado com um exemplo rápido.
Nfmcclure
11

Apenas extraia palavras - chave e treine um classificador nelas. Isso é tudo, sério.

A maior parte do texto nos currículos não está realmente relacionada a habilidades. Por exemplo, considere a frase "Sou experiente e altamente eficiente em Java". Aqui, apenas 1 em cada 7 palavras é um nome de habilidade, o restante é apenas um ruído que reduzirá a precisão da classificação.

A maioria dos currículos não é realmente estruturada. Ou estruturado muito livremente. Ou use nomes incomuns para seções. Ou formatos de arquivo que não preservam a estrutura quando traduzidos para o texto. Tenho experiência em extrair datas, horas, nomes, endereços e até pessoas com intenções de texto não estruturado, mas não uma lista de habilidades (ou universidade ou qualquer outra coisa), nem de perto.

Portanto, basta tokenizar (e possivelmente conter ) seus currículos, selecionar apenas palavras da lista predefinida (você pode usar o LinkedIn ou algo semelhante para obter essa lista), criar um vetor de recurso e experimentar alguns classificadores (por exemplo, SVM e Naive Bayes) .

(Observação: usei uma abordagem semelhante para classificar os perfis do LinkedIn em mais de 50 classes com precisão> 90%, por isso tenho certeza que até uma implementação ingênua funcionará bem.)

amiga
fonte
Diga que estou analisando dados do linkedin, você acha que seria uma boa ideia mesclar a experiência de trabalho anterior, as recomendações de educação e as habilidades de um perfil em um arquivo de texto e extrair palavras-chave dele?
user1769197
O LinkedIn agora tem tags de habilidade que as pessoas atribuem a si mesmas e outros usuários podem aprovar, portanto, basicamente, não há necessidade de extrair palavras-chave manualmente. Mas, no caso de dados menos estruturados - sim, pode ser útil mesclar tudo e recuperar palavras-chave. No entanto, lembre-se da regra principal: experimente . A teoria é boa, mas apenas experimentos práticos com diferentes abordagens revelam a melhor.
ffriend
@ffriend, Como podemos obter essa lista de palavras-chave?
NG_21 28/01
11
@ffriend Qual é a melhor maneira de extrair "experience" = '5 anos', "Language" = 'C' da frase a seguir. "Passei 5 anos desenvolvendo sistemas de rastreamento de bugs e criando aplicativos de sistema de gerenciamento de dados em C". Eu costumava Rake com NLTK e ele só removeu as pontuações Stopword +, mas a partir da frase acima eu não preciso de palavras como em desenvolvimento, bug-tracking, sistemas, criando, dados etc. Graças
Khalid Usman
3
@KhalidUsman: como você já trabalha com NLTL, dê uma olhada nas ferramentas de reconhecimento de entidades nomeadas , especialmente na seção "Chunking with Regular Expressions". Em geral, convém usar um dicionário de palavras-chave (por exemplo, "anos", "C" etc.) e um conjunto simples de regras (como "contém 'C'" ou "<número> anos") para extrair entidades nomeadas fora de um texto de formato livre.
F4 #
7

Este é um problema complicado. Existem muitas maneiras de lidar com isso. Eu acho que currículos podem ser tratados como documentos semiestruturados. Às vezes, é benéfico ter alguma estrutura mínima nos documentos. Acredito que, nos currículos, você veria alguns dados tabulares. Você pode tratá-los como pares de valor de atributo. Por exemplo, você obteria uma lista de termos para o atributo "Conjunto de habilidades".

A idéia principal é configurar manualmente uma lista de frases-chave como "habilidade", "educação", "publicação" etc. O próximo passo é extrair termos que pertencem a essas frases-chave, explorando a estrutura de alguma maneira (como como tabelas) ou utilizando a proximidade dos termos em torno dessas frases-chave, por exemplo, o fato de a palavra "Java" estar próxima do termo "habilidade" pode indicar que a pessoa é especialista em Java.

Depois de extrair essas informações, a próxima etapa pode ser criar um vetor de recurso para cada uma dessas frases-chave. Em seguida, você pode representar um documento como um vetor com campos diferentes (cada um para uma frase-chave). Por exemplo, considere os dois resumos a seguir representados com dois campos, a saber, projeto e educação .

Doc1: {projeto: (java, 3) (c, 4)}, {educação: (computador, 2), (física, 1)}

Doc2: {projeto: (java, 3) (python, 2)}, {educação: (matemática, 3), (computador, 2)}

No exemplo acima, mostro um termo com a frequência. Obviamente, ao extrair os termos, você precisa conter e remover palavras de parada. É claro, a partir dos exemplos, que a pessoa cujo currículo é Doc1 é mais habilidosa em C que a de D2. Em termos de implementação, é muito fácil representar documentos como vetores de campo no Lucene.

Agora, o próximo passo é recuperar uma lista classificada de currículos, de acordo com uma especificação do trabalho. De fato, isso é bastante direto se você representar consultas (especificações de trabalho) como vetores de campo. Você só precisa recuperar uma lista classificada de candidatos (currículos) usando o Lucene de uma coleção de currículos indexados.

Debasis
fonte
Em termos de algoritmo: o que você recomendaria?
precisa saber é o seguinte
você quer dizer algoritmo para calcular os vetores de currículo mais semelhantes, considerando um vetor de trabalho de consulta? você pode usar qualquer algoritmo padrão, como BM25 ou Modelo Idioma ...
Debasis
Eu nunca ouvi falar desses algoritmos. Esses algoritmos de PNL ou ML são algo?
user1769197
esses são modelos de recuperação padrão ... um modelo de recuperação define como calcular a semelhança entre um documento (resumo no seu caso) e uma consulta (trabalho no seu caso).
Debasis
Não tenho conhecimento sobre recuperação de informações, você acha que algoritmos de aprendizado de máquina como clustering / vizinho mais próximo também funcionarão no meu caso?
user1769197
7

Trabalho em um site de empregos on-line e criamos soluções para recomendar trabalhos com base em currículos. Nossa abordagem leva o cargo de uma pessoa (ou o cargo desejado, se for aluno e conhecido), juntamente com as habilidades que extraímos de seu currículo e sua localização (que é muito importante para a maioria das pessoas) e encontra correspondências com empregos com base nisso.

em termos de classificação de documentos, eu adotaria uma abordagem semelhante. Eu recomendaria computar uma matriz tf idf para cada currículo como um modelo padrão de pacote de palavras, extraindo apenas o cargo e as habilidades da pessoa (para a qual você precisará definir uma lista de habilidades a serem procuradas) e alimentá-la em um ML algoritmo. Eu recomendaria tentar knn e um SVM, este último funciona muito bem com dados de texto de alta dimensão. SVM lineares tendem a se sair melhor que não lineares (por exemplo, usando kernels RBf). Se você obtiver resultados razoáveis, eu brincaria com a extração de recursos usando um analisador de idioma natural \ chunker, e também algumas frases personalizadas, correspondidas por expressões regulares.

Simon
fonte
Você ainda usa SVM quando tem 3 ou mais aulas? E quais recursos você deseja extrair usando um analisador de idioma natural? Para qual propósito ?
user1769197
Você pode treinar n svm para n classes usando uma estratégia um vs o resto. O SciKitLearn possui código para fazer isso automaticamente. Tecnicamente, você precisa de classificadores n-1, mas eu achei que ter n funciona melhor.
Simon
@ Simon Você pode escrever as etapas completas para este sistema de recomendação? Estou tendo pouca experiência (implementar tese de mestrado) em ML, mas totalmente nova na área de RI. Agora estou trabalhando neste sistema e escrevi as seguintes etapas. 1. Use o NLTK para extrair palavras-chave, 2. Calcule a pontuação das palavras-chave e frases, 3. Stemmer, 4. Categorização (a tarefa mais desafiadora) e 5. Matriz de frequência, tf-idf ou algo BM25. Estou no caminho certo da implementação? Obrigado
Khalid Usman 04/04
@KhalidUsman Não sei dizer exatamente como funciona, isso pode me causar problemas. A solução mais fácil seria colocar os dados no Solr ou no Elastic Search e usar suas implementações de recomendadores de MLT. Uma abordagem mais sofisticada é extrair palavras-chave e frases, enviar os documentos pelo LSA e executar k-nn nos vetores resultantes. Em seguida, convém usar outros sinais, como filtragem colaborativa e popularidade geral.
1616 Simon
@ Simon, obrigado pela sua orientação. Estou aplicando a segunda maneira, extraí palavras-chave / frases-chave usando RAKE + NLTK e depois planejava aplicar tf-idf ou BM25. Estou certo? Você pode elaborar um pouco a maneira KNN, quero dizer, como aplicar knn em palavras-chave, devo criar palavras-chave como um recurso? Obrigado
Khalid Usman