Quels algorithmes dois-je utiliser pour effectuer la classification des emplois en fonction des données de CV?


28

Notez que je fais tout en R.

Le problème est le suivant:

Fondamentalement, j'ai une liste de CV (CV). Certains candidats auront une expérience de travail avant et d'autres non. Le but ici est de: sur la base du texte de leur CV, je souhaite les classer dans différents secteurs d'emploi. Je suis particulièrement dans les cas où les candidats n'ont aucune expérience / sont étudiants, et je veux faire une prédiction pour classer les secteurs d'emploi auxquels ce candidat appartiendra le plus probablement après l'obtention du diplôme.

Question 1: Je connais les algorithmes d'apprentissage automatique. Cependant, je n'ai jamais fait de PNL auparavant. Je suis tombé sur l'allocation de Dirichlet latente sur Internet. Cependant, je ne sais pas si c'est la meilleure approche pour résoudre mon problème.

Mon idée originale: en faire un problème d'apprentissage supervisé . Supposons que nous ayons déjà une grande quantité de données étiquetées, ce qui signifie que nous avons correctement étiqueté les secteurs d'emploi pour une liste de candidats. Nous formons le modèle à l'aide d'algorithmes ML (c'est-à-dire le plus proche voisin ...) et alimentons ces données non étiquetées , qui sont des candidats qui n'ont aucune expérience de travail / sont des étudiants, et essayons de prédire à quel secteur d'emploi ils appartiendront.

Mettre à jour la question 2: Serait-ce une bonne idée de créer un fichier texte en extrayant tout dans un CV et d'imprimer ces données dans le fichier texte, afin que chaque CV soit associé à un fichier texte, qui contient des chaînes non structurées, puis nous appliqué des techniques d'exploration de texte aux fichiers texte et structuré les données ou même créé une matrice de fréquence des termes utilisés à partir des fichiers texte? Par exemple, le fichier texte peut ressembler à ceci:

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

C'est ce que j'entendais par «non structuré», c'est-à-dire tout réduire en une seule chaîne de ligne.

Cette approche est-elle mauvaise? Veuillez me corriger si vous pensez que mon approche est fausse.

Question 3: La partie délicate est: comment identifier et extraire les mots clés ? Vous utilisez le tmpackage dans R? sur quel algorithme le tm package est-il basé? Dois-je utiliser des algorithmes NLP? Si oui, quels algorithmes dois-je étudier? Veuillez m'indiquer quelques bonnes ressources à consulter également.

Toutes les idées seraient géniales.

Réponses:


14

Consultez ce lien.

Ici, ils vous guideront à travers le chargement de texte non structuré pour créer un nuage de mots. Vous pouvez adapter cette stratégie et au lieu de créer un nuage de mots, vous pouvez créer une matrice de fréquence des termes utilisés. L'idée est de prendre le texte non structuré et de le structurer en quelque sorte. Vous changez tout en minuscules (ou en majuscules), supprimez les mots vides et trouvez des termes fréquents pour chaque fonction de travail, via les matrices des termes du document. Vous avez également la possibilité d'endiguer les mots. Si vous limitez des mots, vous pourrez détecter différentes formes de mots comme le même mot. Par exemple, «programmé» et «programmation» pourraient être liés à «programme». Vous pouvez éventuellement ajouter l'occurrence de ces termes fréquents en tant que fonction pondérée dans votre formation sur le modèle ML.

Vous pouvez également l'adapter aux phrases fréquentes, en trouvant des groupes communs de 2-3 mots pour chaque fonction.

Exemple:

1) Charger des bibliothèques et construire les exemples de données

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) Maintenant, nous procédons à une structuration du texte. Je suis convaincu qu'il existe des moyens plus rapides / plus courts de procéder comme suit.

# 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) Faire une source de corpus et documenter une matrice de termes.

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

Nous avons maintenant la matrice de fréquence, jobFreq, c'est-à-dire une matrice (3 par x), 3 entrées et un nombre X de mots.

Où vous allez à partir de vous. Vous ne pouvez conserver que des mots spécifiques (plus courants) et les utiliser comme fonctionnalités dans votre modèle. Une autre façon est de garder les choses simples et d'avoir un pourcentage de mots utilisés dans chaque description de travail, disons que "java" aurait 80% d'occurrence en "ingénieur logiciel" et seulement 50% d'occurrence en "assurance qualité".

Il est maintenant temps de chercher pourquoi «assurance» a 1 «r» et «occurrence» a 2 «r».


J'aimerais voir votre exemple.
user1769197

Mis à jour avec un exemple rapide.
nfmcclure

11

Il suffit d'extraire des mots clés et de former un classificateur sur eux. C'est tout, vraiment.

La plupart du texte des CV n'est pas réellement lié aux compétences. Par exemple, considérez la phrase "Je suis expérimenté et très efficace en Java". Ici, seulement 1 mot sur 7 est un nom de compétence, le reste n'est qu'un bruit qui va réduire votre précision de classification.

La plupart des CV ne sont pas vraiment structurés. Ou structuré trop librement. Ou utilisez des noms inhabituels pour les sections. Ou des formats de fichier qui ne conservent pas la structure lorsqu'ils sont traduits en texte. J'ai de l'expérience dans l'extraction de dates, d'heures, de noms, d'adresses et même d'intentions de personnes à partir d'un texte non structuré, mais pas d'une liste de compétences (ou d'université ou autre), pas même de près.

Il suffit donc de tokeniser (et éventuellement de limiter ) vos CV, de sélectionner uniquement les mots de la liste prédéfinie (vous pouvez utiliser LinkedIn ou quelque chose de similaire pour récupérer cette liste), de créer un vecteur de fonctionnalités et d'essayer quelques classificateurs (par exemple, SVM et Naive Bayes) .

(Remarque: j'ai utilisé une approche similaire pour classer les profils LinkedIn dans plus de 50 classes avec une précision> 90%, donc je suis sûr que même une implémentation naïve fonctionnera bien.)


Supposons que j'analyse les données de linkedin, pensez-vous que ce serait une bonne idée pour moi de fusionner l'expérience de travail précédente, les recommandations de formation et les compétences d'un profil dans un fichier texte et d'en extraire des mots clés?
user1769197

LinkedIn dispose désormais de balises de compétence que les utilisateurs peuvent attribuer et que les autres utilisateurs peuvent approuver, il n'est donc pas nécessaire d'extraire les mots clés manuellement. Mais en cas de données moins structurées - oui, il peut être utile de tout fusionner, puis de récupérer des mots clés. Cependant, rappelez-vous la règle principale: essayez-la . La théorie est bonne, mais seules des expériences pratiques avec différentes approches en révéleront une meilleure.
ffriend

@ffriend, comment obtenir cette liste de mots clés?
NG_21

1
@ffriend Quelle est la meilleure façon d'extraire "experience" = '5 years', "Language" = 'C' de la phrase suivante. "J'ai passé 5 ans à développer des systèmes de suivi des bogues et à créer des applications de système de gestion de données en C". J'ai utilisé Rake avec NLTK et il vient de supprimer le mot-clé + les signes de ponctuation, mais de la phrase ci-dessus, je n'ai pas besoin de mots comme développement, suivi des bogues, systèmes, création, données, etc. Merci
Khalid Usman

3
@KhalidUsman: puisque vous travaillez déjà avec NLTL, jetez un œil aux outils de reconnaissance d'entités nommées , en particulier la section "Chunking with Regular Expressions". En général, vous souhaiterez utiliser un dictionnaire de mots clés (par exemple "années", "C", etc.) et un ensemble simple de règles (comme "contient 'C'" ou "<nombre> années") pour extraire les entités nommées à partir d'un texte de forme libre.
ffriend

7

C'est un problème délicat. Il existe de nombreuses façons de le gérer. Je suppose que les CV peuvent être traités comme des documents semi-structurés. Parfois, il est avantageux d'avoir une structure minimale dans les documents. Je crois que dans les CV, vous verrez des données tabulaires. Vous souhaiterez peut-être les traiter comme des paires de valeurs d'attribut. Par exemple, vous obtiendrez une liste de termes pour l'attribut "Ensemble de compétences".

L'idée clé est de configurer manuellement une liste de phrases clés telles que "compétence", "éducation", "publication", etc. L'étape suivante consiste à extraire les termes qui se rapportent à ces phrases clés, soit en exploitant la structure d'une manière sous forme de tableaux) ou en utilisant la proximité des termes autour de ces phrases clés, par exemple le fait que le mot "Java" soit à proximité du terme "compétence" pourrait indiquer que la personne est compétente en Java.

Une fois ces informations extraites, l'étape suivante peut consister à créer un vecteur d'entités pour chacune de ces phrases clés. Vous pouvez ensuite représenter un document comme un vecteur avec différents champs (un chacun pour une phrase clé). Par exemple, considérons les deux CV suivants représentés avec deux domaines, à savoir le projet et l' éducation .

Doc1: {projet: (java, 3) (c, 4)}, {éducation: (ordinateur, 2), (physique, 1)}

Doc2: {projet: (java, 3) (python, 2)}, {éducation: (mathématiques, 3), (ordinateur, 2)}

Dans l'exemple ci-dessus, je montre un terme avec la fréquence. Bien sûr, tout en extrayant les termes dont vous avez besoin pour endiguer et supprimer les mots vides. Il ressort clairement des exemples que la personne dont le curriculum vitae est Doc1 est plus compétente en C que celle de D2. En termes d'implémentation, il est très facile de représenter des documents comme vecteurs de champ dans Lucene.

Maintenant, l'étape suivante consiste à récupérer une liste classée de CV en fonction d'une spécification de travail. En fait, c'est assez simple si vous représentez également les requêtes (spécifications de travail) comme vecteurs de champ. Il vous suffit de récupérer une liste classée de candidats (CV) à l'aide de Lucene à partir d'une collection de CV indexés.


Algorithmique: que recommanderiez-vous?
user1769197

vous voulez dire un algorithme pour calculer les vecteurs de CV les plus similaires étant donné un vecteur de travail de requête? vous pouvez utiliser n'importe quel algorithme standard tel que BM25 ou Language Model ...
Debasis

Je n'ai jamais entendu parler de ces algorithmes. S'agit-il d'algorithmes NLP ou ML algo?
user1769197

ce sont des modèles de récupération standard ... un modèle de récupération définit comment calculer la similitude entre un document (reprendre dans votre cas) et une requête (travail dans votre cas).
Debasis

Je n'ai aucune connaissance sur la récupération d'informations, pensez-vous que les algorithmes d'apprentissage automatique comme le clustering / le plus proche voisin fonctionneront également dans mon cas?
user1769197

7

Je travaille pour un site d'emplois en ligne et nous créons des solutions pour recommander des emplois en fonction des CV. Notre approche prend le titre d'emploi d'une personne (ou le titre d'emploi souhaité si un étudiant et connu), ainsi que les compétences que nous extrayons de leur curriculum vitae, et leur emplacement (ce qui est très important pour la plupart des gens) et trouver des correspondances avec des emplois basés sur cela.

en termes de classification des documents, j'adopterais une approche similaire. Je recommanderais de calculer une matrice tf idf pour chaque curriculum vitae en tant que modèle de sac de mots standard, en extrayant uniquement le titre du poste et les compétences de la personne (pour lesquelles vous devrez définir une liste de compétences à rechercher), et de l'intégrer dans un ML algorithme. Je recommanderais d'essayer knn et un SVM, ce dernier fonctionne très bien avec des données texte de haute dimension. Les SVM linéaires ont tendance à faire mieux que les non-linéaires (par exemple en utilisant des noyaux RBf). Si vous obtenez des résultats raisonnables, je jouerais alors avec l'extraction de fonctionnalités en utilisant un analyseur \ chunker en langage naturel, ainsi que des phrases construites sur mesure correspondant aux expressions rationnelles.


Utilisez-vous toujours SVM lorsque vous avez 3 classes ou plus? Et quelles fonctionnalités souhaitez-vous extraire à l'aide d'un analyseur en langage naturel? Dans quel but ?
user1769197

Vous pouvez entraîner n svm pour n classes en utilisant une stratégie un contre le reste. SciKitLearn a du code pour le faire automatiquement. Techniquement, vous avez besoin de n-1 classificateurs, mais j'ai trouvé que n fonctionne mieux.
Simon

@Simon Pouvez-vous écrire les étapes complètes de ce système de recommandation? J'ai peu d'expérience (implémenter une thèse MS) en ML, mais totalement nouveau dans le domaine IR. Maintenant, je travaille sur ce système et j'ai écrit les étapes suivantes. 1. Utilisez NLTK pour extraire les mots clés, 2. Calculez le score des mots clés et des phrases, 3. Stemmer, 4. Catégorisation (la tâche la plus difficile) et 5. Matrice de fréquence, tf-idf ou algo BM25. Suis-je sur la bonne voie de mise en œuvre? Merci
Khalid Usman

@KhalidUsman Je ne peux pas vous dire exactement comment cela fonctionne, cela pourrait me causer des ennuis. La solution la plus simple serait de mettre les données dans Solr ou Elastic Search et d'utiliser leurs implémentations recommandées MLT. Une approche plus sophistiquée consiste à extraire des mots et des phrases clés, à pousser les documents via LSA et à faire k-nn sur les vecteurs résultants. Ensuite, vous souhaiterez peut-être utiliser d'autres signaux tels que le filtrage collaboratif et la popularité globale.
Simon

@Simon, merci pour vos conseils. J'applique la 2ème manière, j'ai extrait des mots-clés / phrases clés en utilisant RAKE + NLTK et après cela, je prévoyais d'appliquer tf-idf ou BM25. Ai-je raison? Pouvez-vous s'il vous plaît élaborer un peu la manière KNN, je veux dire comment appliquer knn sur des mots clés, dois-je créer des mots clés en tant que fonctionnalités? Merci
Khalid Usman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.