Quali algoritmi dovrei usare per eseguire la classificazione dei lavori in base ai dati di ripresa?


28

Nota che sto facendo tutto in R.

Il problema si presenta come segue:

Fondamentalmente, ho un elenco di curriculum (CV). Alcuni candidati avranno prima esperienza lavorativa e altri no. L'obiettivo qui è: sulla base del testo dei loro CV, voglio classificarli in diversi settori lavorativi. Sono particolare in quei casi, in cui i candidati non hanno alcuna esperienza / è uno studente, e voglio fare una previsione per classificare a quali settori professionali questo candidato apparterrà molto probabilmente dopo la laurea.

Domanda 1: Conosco algoritmi di apprendimento automatico. Tuttavia, non ho mai fatto la PNL prima. Mi sono imbattuto nell'allocazione del Dirichlet latente su Internet. Tuttavia, non sono sicuro che questo sia l'approccio migliore per affrontare il mio problema.

La mia idea originale: rendere questo un problema di apprendimento supervisionato . Supponiamo di avere già una grande quantità di dati etichettati, il che significa che abbiamo etichettato correttamente i settori di lavoro per un elenco di candidati. Formiamo il modello utilizzando algoritmi ML (cioè il vicino più vicino ...) e inseriamo quei dati senza etichetta , che sono candidati che non hanno esperienza di lavoro / sono studenti, e proviamo a prevedere a quale settore lavorativo apparterranno.

Domanda di aggiornamento 2: sarebbe una buona idea creare un file di testo estraendo tutto in un curriculum e stampando questi dati nel file di testo, in modo che ogni curriculum sia associato a un file di testo, che contiene stringhe non strutturate, e quindi noi applicare tecniche di estrazione del testo ai file di testo e rendere i dati strutturati o addirittura creare una matrice di frequenza dei termini utilizzati dai file di testo? Ad esempio, il file di testo potrebbe essere simile al seguente:

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

Questo è ciò che intendevo per "non strutturato", ovvero comprimere tutto in una stringa a riga singola.

Questo approccio è sbagliato? Per favore, correggimi se pensi che il mio approccio sia sbagliato.

Domanda 3: La parte difficile è: come identificare ed estrarre le parole chiave ? Usando il tmpacchetto in R? su quale algoritmo si tm basa il pacchetto? Dovrei usare gli algoritmi NLP? Se sì, quali algoritmi dovrei guardare? Per favore, mi indichi anche alcune buone risorse da guardare.

Qualunque idea sarebbe apprezzata.

Risposte:


14

Dai un'occhiata a questo link.

Qui ti guideranno attraverso il caricamento di testo non strutturato per creare un wordcloud. È possibile adattare questa strategia e invece di creare un wordcloud, è possibile creare una matrice di frequenza dei termini utilizzati. L'idea è di prendere il testo non strutturato e strutturarlo in qualche modo. Si cambia tutto in minuscolo (o maiuscolo), si rimuovono le parole di arresto e si trovano termini frequenti per ogni funzione di lavoro, tramite le matrici dei termini del documento. Hai anche la possibilità di derivare le parole. Se metti delle parole sarai in grado di rilevare diverse forme di parole come la stessa parola. Ad esempio, "programmato" e "programmazione" potrebbero essere derivati ​​da "programma". È possibile aggiungere eventualmente il verificarsi di questi termini frequenti come una caratteristica ponderata nel training del modello ML.

Puoi anche adattare questo a frasi frequenti, trovando gruppi comuni di 2-3 parole per ogni funzione lavorativa.

Esempio:

1) Carica le librerie e crea i dati di esempio

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) Ora facciamo un po 'di strutturazione del testo. Sono sicuro che ci sono modi più rapidi / brevi per fare quanto segue.

# 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) Crea una sorgente di corpus e una matrice di termini del documento.

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

Ora abbiamo la matrice di frequenza, jobFreq, ovvero una matrice (3 per x), 3 voci e un numero X di parole.

Dove vai da qui dipende da te. Puoi mantenere solo parole specifiche (più comuni) e usarle come funzionalità nel tuo modello. Un altro modo è quello di mantenerlo semplice e di utilizzare una percentuale di parole nella descrizione di ciascun lavoro, ad esempio "java" avrebbe una percentuale dell'80% in "ingegnere del software" e una percentuale del 50% in "garanzia della qualità".

Ora è il momento di cercare perché "assurance" ha 1 "r" e "ricorrenza" ha 2 "r".


Mi piacerebbe vedere il tuo esempio.
user1769197,

Aggiornato con un rapido esempio.
nfmcclure,

11

Basta estrarre parole chiave e formare un classificatore su di esse. Questo è tutto, davvero.

La maggior parte del testo nei CV non è in realtà correlato alle competenze. Ad esempio, considera la frase "Sono esperto e altamente efficiente in Java". Qui solo 1 parola su 7 è un nome di abilità, il resto è solo un rumore che ridurrà la precisione della tua classificazione.

La maggior parte dei CV non è realmente strutturata. O strutturato troppo liberamente. O usa nomi insoliti per le sezioni. O formati di file che non conservano la struttura quando tradotti in testo. Ho esperienza nell'estrarre date, orari, nomi, indirizzi e persino intenti di persone da un testo non strutturato, ma non un elenco di abilità (o università o altro), nemmeno da vicino.

Quindi tokenizza (e possibilmente attacca ) i tuoi CV, seleziona solo parole dall'elenco predefinito (puoi usare LinkedIn o qualcosa di simile per prendere questo elenco), creare un vettore di funzionalità e provare un paio di classificatori (diciamo, SVM e Naive Bayes) .

(Nota: ho usato un approccio simile per classificare i profili LinkedIn in più di 50 classi con una precisione> 90%, quindi sono abbastanza sicuro che anche l'implementazione ingenua funzionerà bene.)


Supponiamo che io stia analizzando i dati del linkedin, pensi che sarebbe una buona idea per me unire la precedente esperienza di lavoro, i consigli di istruzione e le competenze di un profilo in un file di testo ed estrarre le parole chiave da esso?
user1769197,

LinkedIn ora ha tag di abilità che le persone si assegnano e altri utenti possono approvare, quindi in pratica non è necessario estrarre manualmente le parole chiave. Ma in caso di dati meno strutturati, sì, può essere utile unire tutto e quindi recuperare le parole chiave. Tuttavia, ricorda la regola principale: provalo . La teoria è buona, ma solo gli esperimenti pratici con approcci diversi riveleranno il migliore.
amico

@ffriend, Come possiamo ottenere l'elenco di parole chiave?
NG_21,

1
@ffriend Qual è il modo migliore per estrarre "experience" = '5 anni', "Language" = 'C' dalla frase seguente. "Ho trascorso 5 anni a sviluppare sistemi di tracciamento dei bug e a creare applicazioni per la gestione dei dati in C". Ho usato Rake con NLTK e ho appena rimosso la parola d'ordine + punteggiatura, ma dalla frase sopra non ho bisogno di parole come sviluppo, tracciamento dei bug, sistemi, creazione, dati ecc. Grazie
Khalid Usman

3
@KhalidUsman: poiché lavori già con NLTL, dai un'occhiata agli strumenti di riconoscimento delle entità denominate , in particolare la sezione "Chunking with Regular Expressions". In generale, si desidera utilizzare un dizionario di parole chiave (ad esempio "anni", "C", ecc.) E un semplice insieme di regole (come "contiene 'C'" o "<numero> anni") per estrarre entità denominate da un testo in formato libero.
amico

7

Questo è un problema difficile. Esistono molti modi per gestirlo. Immagino che i curriculum possano essere trattati come documenti semi-strutturati. A volte, è utile avere una struttura minima nei documenti. Credo che nei curriculum vedresti alcuni dati tabulari. Potresti volerli considerare come coppie di valori di attributo. Ad esempio, otterrai un elenco di termini per l'attributo "Set di abilità".

L'idea chiave è quella di configurare manualmente un elenco di frasi chiave come "abilità", "educazione", "pubblicazione" ecc. Il prossimo passo è quello di estrarre termini che si riferiscono a queste frasi chiave sfruttando la struttura in qualche modo (come come tabelle) o utilizzando la vicinanza di termini attorno a queste frasi chiave, ad esempio il fatto che la parola "Java" sia in stretta vicinanza al termine "abilità" potrebbe indicare che la persona è qualificata in Java.

Dopo aver estratto queste informazioni, il passaggio successivo potrebbe essere la creazione di un vettore di caratteristiche per ciascuna di queste frasi chiave. È quindi possibile rappresentare un documento come vettore con campi diversi (uno ciascuno per una frase chiave). Ad esempio, considerare i seguenti due curriculum rappresentati con due campi, vale a dire progetto e formazione .

Doc1: {progetto: (java, 3) (c, 4)}, {education: (computer, 2), (fisica, 1)}

Doc2: {project: (java, 3) (python, 2)}, {education: (maths, 3), (computer, 2)}

Nell'esempio sopra, mostro un termine con la frequenza. Naturalmente, durante l'estrazione dei termini è necessario arginare e rimuovere le parole chiave. Dagli esempi emerge che la persona il cui curriculum è Doc1 è più competente in C di quella di D2. Per quanto riguarda l'implementazione, è molto facile rappresentare i documenti come vettori di campo in Lucene.

Ora, il passo successivo è recuperare un elenco classificato di curriculum dati specificando un lavoro. In effetti, è abbastanza semplice se si rappresentano query (specifiche del lavoro) anche come vettori di campo. Hai solo bisogno di recuperare un elenco classificato di candidati (curriculum) utilizzando Lucene da una raccolta di curriculum indicizzati.


Per quanto riguarda l'algoritmo: cosa consiglieresti?
user1769197,

intendi algoritmo per calcolare i vettori di curriculum più simili dato un vettore di lavoro di query? puoi usare qualsiasi algoritmo standard come BM25 o Language Model ...
Debasis

Non ho mai sentito parlare di questi algoritmi. Sono questi algoritmi NLP o algo ML?
user1769197,

questi sono modelli di recupero standard ... un modello di recupero definisce come calcolare la somiglianza tra un documento (riprendi nel tuo caso) e una query (lavoro nel tuo caso).
Debasis

Non ho conoscenza del recupero delle informazioni, pensi che nel mio caso funzioneranno anche algoritmi di apprendimento automatico come il clustering / il vicino più vicino?
user1769197,

7

Lavoro per un sito di lavori online e creiamo soluzioni per raccomandare lavori basati sui curriculum. Il nostro approccio prende il titolo di lavoro di una persona (o il titolo di lavoro desiderato se uno studente e noto), insieme alle competenze che estraiamo dal loro curriculum e dalla loro posizione (che è molto importante per la maggior parte delle persone) e trovano corrispondenze con lavori basati su quello.

in termini di classificazione dei documenti, prenderei un approccio simile. Consiglierei di calcolare una matrice idf per ogni curriculum come modello standard di bag of words, estraendo solo il titolo professionale e le abilità della persona (per le quali sarà necessario definire un elenco di competenze da cercare), e inserirle in una ML algoritmo. Consiglierei di provare Knn e un SVM, quest'ultimo funziona molto bene con dati di testo ad alta dimensione. Gli SVM lineari tendono a fare meglio dei non lineari (ad es. Usando i kernel RBf). Se si ottengono risultati ragionevoli, giocherei quindi con l'estrazione delle funzionalità utilizzando un parser \ chunker in linguaggio naturale e anche alcune frasi personalizzate abbinate a quelle di regex.


Usi ancora SVM quando hai 3 o più classi? E quali funzionalità vuoi estrarre usando un parser in linguaggio naturale? Per quale scopo ?
user1769197

Puoi addestrare n svm per n classi usando una strategia una contro l'altra. SciKitLearn ha il codice per farlo automaticamente. Tecnicamente hai bisogno di classificatori n-1, ma ho scoperto che n funziona meglio.
Simon,

@Simon Puoi scrivere i passaggi completi per questo sistema di raccomandazioni? Sto avendo poca esperienza (attuare tesi di laurea specialistica) in ML, ma totalmente nuovo nel campo IR. Ora sto lavorando su questo sistema e ho scritto i seguenti passi. 1. Usa NLTK per estrarre parole chiave, 2. Calcola il punteggio per parole chiave e frasi, 3. Stemmer, 4. Classificazione (il compito più impegnativo) e 5. Matrice di frequenza, tf-idf o algo BM25. Sono sulla strada giusta per l'implementazione? Grazie
Khalid Usman,

@KhalidUsman Non posso dirti esattamente come funziona, questo potrebbe mettermi nei guai. La soluzione più semplice sarebbe quella di inserire i dati in Solr o Elastic Search e utilizzare le loro implementazioni di raccomandazione MLT. Un approccio più sofisticato è quello di estrarre parole chiave e frasi, spingere i documenti attraverso LSA e fare k-nn sui vettori risultanti. Quindi potresti voler utilizzare altri segnali come il filtro collaborativo e la popolarità complessiva.
Simone,

@Simon, grazie per la tua guida. Sto applicando il 2o modo, ho estratto parole chiave / frasi chiave usando RAKE + NLTK e dopo stavo pianificando di applicare tf-idf o BM25. Ho ragione? Puoi per favore elaborare un po 'il modo KNN, intendo come applicare knn sulle parole chiave, dovrei creare parole chiave come caratteristiche? Grazie
Khalid Usman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.