Welche Algorithmen sollte ich verwenden, um eine Jobklassifizierung basierend auf Lebenslaufdaten durchzuführen?

28

Beachten Sie, dass ich alles in R mache.

Das Problem lautet wie folgt:

Grundsätzlich habe ich eine Liste von Lebensläufen. Einige Kandidaten haben bereits Berufserfahrung und andere nicht. Das Ziel dabei ist: Ich möchte sie auf der Grundlage des Texts in ihren Lebensläufen in verschiedene Berufsbereiche einteilen. Ich bin besonders in jenen Fällen, in denen die Kandidaten keine Erfahrung haben / Student sind, und ich möchte eine Vorhersage machen, um zu klassifizieren, welchen Berufsbereichen dieser Kandidat nach dem Abschluss am wahrscheinlichsten angehört.

Frage 1: Ich kenne Algorithmen für maschinelles Lernen. Allerdings habe ich noch nie NLP gemacht. Ich bin auf Latent Dirichlet Allocation im Internet gestoßen. Ich bin mir jedoch nicht sicher, ob dies der beste Ansatz ist, um mein Problem anzugehen.

Meine ursprüngliche Idee: Machen Sie dies zu einem überwachten Lernproblem . Angenommen, wir haben bereits eine große Menge gekennzeichneter Daten, was bedeutet, dass wir die Jobsektoren für eine Kandidatenliste korrekt gekennzeichnet haben. Wir trainieren das Modell mit ML-Algorithmen (dh dem nächsten Nachbarn ...) und geben diese nicht etikettierten Daten ein , die Kandidaten sind, die keine Berufserfahrung haben / Studenten sind, und versuchen vorherzusagen, zu welchem ​​Berufsbereich sie gehören werden.

Update Frage 2: Wäre es eine gute Idee, eine Textdatei zu erstellen, indem Sie alles in einem Lebenslauf extrahieren und diese Daten in der Textdatei ausdrucken, sodass jeder Lebenslauf mit einer Textdatei verknüpft ist, die unstrukturierte Zeichenfolgen enthält, und dann wir angewandte Text-Mining-Techniken auf die Textdateien anwenden und die Daten strukturieren oder sogar eine Häufigkeitsmatrix von Begriffen aus den Textdateien erstellen? Die Textdatei könnte beispielsweise so aussehen:

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

Dies ist, was ich mit "unstrukturiert" meinte, dh alles in einer einzigen Zeile zusammenfassen.

Ist dieser Ansatz falsch? Bitte korrigieren Sie mich, wenn Sie meinen, mein Ansatz sei falsch.

Frage 3: Der schwierige Teil ist: Wie identifiziere und extrahiere ich die Schlüsselwörter ? Verwenden Sie das tmPaket in R? Welcher Algorithmus ist dertm Paket? Soll ich NLP-Algorithmen verwenden? Wenn ja, auf welche Algorithmen sollte ich achten? Bitte weisen Sie mich auf einige gute Ressourcen hin, die Sie ebenfalls ansehen können.

Irgendwelche Ideen wären toll.

user1769197
quelle

Antworten:

14

Schauen Sie sich diesen Link an.

Hier werden Sie durch das Laden von unstrukturiertem Text zum Erstellen einer Wortwolke geführt. Sie können diese Strategie anpassen und anstatt eine Wortwolke zu erstellen, können Sie eine Häufigkeitsmatrix der verwendeten Begriffe erstellen. Die Idee ist, den unstrukturierten Text zu nehmen und ihn irgendwie zu strukturieren. Sie ändern alles in Kleinbuchstaben (oder in Großbuchstaben), entfernen Stoppwörter und suchen über Dokumentterm-Matrizen nach häufigen Begriffen für jede Jobfunktion. Sie haben auch die Möglichkeit, die Wörter zu sperren. Wenn Sie Wörter abstammen, können Sie verschiedene Formen von Wörtern als dasselbe Wort erkennen. Beispielsweise könnten "programmiert" und "Programmieren" auf "Programmieren" beschränkt werden. Möglicherweise können Sie das Auftreten dieser häufigen Begriffe als gewichtetes Merkmal in Ihr ML-Modelltraining aufnehmen.

Sie können dies auch an häufige Phrasen anpassen, indem Sie für jede Jobfunktion gemeinsame Gruppen von 2-3 Wörtern finden.

Beispiel:

1) Laden Sie Bibliotheken und erstellen Sie die Beispieldaten

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) Nun machen wir eine Textstrukturierung. Ich bin mir sicher, dass es schnellere / kürzere Möglichkeiten gibt, Folgendes zu tun.

# 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) Erstellen Sie eine Korpusquellen- und Dokumentterm-Matrix.

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

Jetzt haben wir die Frequenzmatrix jobFreq, das heißt eine (3 mal x) Matrix, 3 Einträge und X Anzahl Wörter.

Wohin Sie von hier aus gehen, liegt ganz bei Ihnen. Sie können nur bestimmte (gebräuchlichere) Wörter beibehalten und diese als Funktionen in Ihrem Modell verwenden. Eine andere Möglichkeit besteht darin, es einfach zu halten und einen bestimmten Prozentsatz an Wörtern in jeder Stellenbeschreibung zu verwenden, z. B. "Java" würde zu 80% im Bereich "Software Engineer" und nur zu 50% im Bereich "Qualitätssicherung" vorkommen.

Jetzt ist es Zeit nachzuschlagen, warum "Assurance" 1 "R" und "Incident" 2 "R" hat.

nfmcclure
quelle
Ich würde gerne Ihr Beispiel sehen.
user1769197
Aktualisiert mit schnellem Beispiel.
Nfmcclure
11

Extrahieren Sie einfach Schlüsselwörter und trainieren Sie einen Klassifikator . Das ist wirklich alles.

Der Großteil des Textes in Lebensläufen bezieht sich nicht auf Fähigkeiten. Denken Sie beispielsweise an den Satz "Ich bin erfahren und sehr effizient in Java". Hier ist nur 1 von 7 Wörtern ein Name für eine Fähigkeit, der Rest ist nur ein Geräusch, das Ihre Klassifizierungsgenauigkeit herabsetzt.

Die meisten Lebensläufe sind nicht wirklich strukturiert. Oder zu frei strukturiert. Oder verwenden Sie ungewöhnliche Namen für Abschnitte. Oder Dateiformate, bei denen die Struktur bei der Übersetzung in Text nicht erhalten bleibt. Ich habe Erfahrung darin, Daten, Zeiten, Namen, Adressen und sogar Absichten von Personen aus unstrukturiertem Text zu extrahieren, aber keine Liste von Fähigkeiten (oder Universitäten oder irgendetwas anderem), nicht einmal in der Nähe.

Also nur tokenize (und möglicherweise stammen ) Ihre Lebensläufe, wählen Sie nur Wörter aus vordefinierten Liste (Sie verwenden können , LinkedIn oder etwas ähnliches , diese Liste greifen), erstellen Sie einen Merkmalsvektor und versuchen , ein paar Klassifizierer (sagen wir, SVM und Naive Bayes) .

(Hinweis: Ich habe einen ähnlichen Ansatz verwendet, um LinkedIn-Profile mit einer Genauigkeit von> 90% in mehr als 50 Klassen zu klassifizieren. Daher bin ich mir ziemlich sicher, dass auch eine naive Implementierung gut funktioniert.)

freund
quelle
Angenommen, ich analysiere LinkedIn-Daten. Halten Sie es für eine gute Idee, die bisherigen Arbeitserfahrungen, Bildungsempfehlungen und Fähigkeiten eines Profils in einer Textdatei zusammenzuführen und Stichwörter daraus zu extrahieren?
user1769197
LinkedIn verfügt nun über Skill-Tags, die von Nutzern selbst vergeben werden und denen andere Nutzer zustimmen können. Daher ist es im Grunde nicht erforderlich, Keywords manuell zu extrahieren. Bei weniger strukturierten Daten kann es hilfreich sein, alle Daten zusammenzuführen und anschließend Schlüsselwörter abzurufen. Beachten Sie jedoch die Hauptregel: Probieren Sie es aus . Die Theorie ist gut, aber nur praktische Experimente mit unterschiedlichen Ansätzen werden die beste ergeben.
Freund
@ffriend, Wie erhalten wir diese Keyword-Liste?
NG_21
1
@ffriend Was ist der beste Weg, um "Erfahrung" = "5 Jahre", "Sprache" = "C" aus dem folgenden Satz zu extrahieren. "Ich habe 5 Jahre damit verbracht, Bug-Tracking-Systeme zu entwickeln und Datenverwaltungssystemanwendungen in C zu erstellen." Ich habe Rake mit NLTK verwendet und es hat nur das Stoppwort + Satzzeichen entfernt, aber aus dem obigen Satz brauche ich keine Wörter wie Entwickeln, Bug-Tracking, Systeme, Erstellen, Daten usw. Danke
Khalid Usman
3
@KhalidUsman: Da Sie bereits mit NLTL arbeiten, werfen Sie einen Blick auf die Tools zur Erkennung benannter Entitäten , insbesondere auf den Abschnitt "Chunking with Regular Expressions". Im Allgemeinen sollten Sie ein Wörterbuch mit Stichwörtern (z. B. "Jahre", "C" usw.) und einfachen Regeln (z. B. "Enthält" C "oder" <Anzahl> Jahre ") verwenden, um benannte Entitäten zu extrahieren aus einem Freiformtext.
Freund
7

Das ist ein kniffliges Problem. Es gibt viele Möglichkeiten, damit umzugehen. Ich denke, Lebensläufe können als semi-strukturierte Dokumente behandelt werden. Manchmal ist es vorteilhaft, wenn die Dokumente eine minimale Struktur aufweisen. Ich glaube, in Lebensläufen würden Sie einige tabellarische Daten sehen. Sie können diese als Attributwertpaare behandeln. Beispielsweise würden Sie eine Liste von Begriffen für das Attribut "Fähigkeitssatz" erhalten.

Die Schlüsselidee besteht darin, manuell eine Liste von Schlüsselsätzen wie "Fähigkeit", "Bildung", "Veröffentlichung" usw. zu konfigurieren. Der nächste Schritt besteht darin, Begriffe zu extrahieren, die sich auf diese Schlüsselsätze beziehen, indem entweder die Struktur auf irgendeine Weise ausgenutzt wird (z. B. B. Tabellen) oder durch Verwenden der Nähe von Begriffen um diese Schlüsselphrasen, z. B. die Tatsache, dass sich das Wort "Java" in unmittelbarer Nähe des Begriffs "Geschicklichkeit" befindet, könnte darauf hinweisen, dass die Person mit Java vertraut ist.

Nachdem Sie diese Informationen extrahiert haben, besteht der nächste Schritt möglicherweise darin, für jeden dieser Schlüsselbegriffe einen Merkmalsvektor zu erstellen. Sie können dann ein Dokument als Vektor mit verschiedenen Feldern darstellen (jeweils eines für eine Schlüsselphrase). Betrachten Sie beispielsweise die folgenden zwei Lebensläufe, die mit zwei Bereichen dargestellt werden, nämlich Projekt und Bildung .

Doc1: {project: (java, 3) (c, 4)}, {education: (computer, 2), (physics, 1)}

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

Im obigen Beispiel zeige ich einen Term mit der Häufigkeit. Natürlich müssen Sie beim Extrahieren der Begriffe Stoppwörter entfernen. Aus den Beispielen geht hervor, dass die Person, deren Lebenslauf Doc1 ist, C besser beherrscht als D2. In Bezug auf die Implementierung ist es in Lucene sehr einfach, Dokumente als Feldvektoren darzustellen.

Der nächste Schritt besteht nun darin, eine Rangliste der Lebensläufe abzurufen, wenn eine Auftragsspezifikation vorliegt. Tatsächlich ist dies ziemlich einfach, wenn Sie Abfragen (Jobspezifikationen) auch als Feldvektoren darstellen. Sie müssen lediglich eine Rangliste der Kandidaten (Lebensläufe) mithilfe von Lucene aus einer Sammlung indizierter Lebensläufe abrufen.

Debasis
quelle
Algorithmisch gesehen: Was würden Sie empfehlen?
user1769197
Sie meinen Algorithmus zur Berechnung der ähnlichsten Resume-Vektoren bei gegebenem Query-Job-Vektor? Sie können jeden Standardalgorithmus wie BM25 oder Language Model ...
Debasis
Ich habe noch nie von diesen Algorithmen gehört. Sind das NLP-Algorithmen oder ML-Algo?
user1769197
Dies sind Standard-Abrufmodelle. Ein Abrufmodell definiert, wie die Ähnlichkeit zwischen einem Dokument (Lebenslauf in Ihrem Fall) und einer Abfrage (Job in Ihrem Fall) berechnet wird.
Debasis
Ich habe keine Kenntnisse über das Abrufen von Informationen. Glauben Sie, dass Algorithmen für maschinelles Lernen wie Clustering / nächster Nachbar auch in meinem Fall funktionieren werden?
user1769197
7

Ich arbeite für eine Online-Jobsite und wir entwickeln Lösungen, um Jobs basierend auf Lebensläufen zu empfehlen. Unser Ansatz besteht darin, die Berufsbezeichnung einer Person (oder die gewünschte Berufsbezeichnung eines Studenten oder Bekannten) zusammen mit den Fähigkeiten, die wir aus ihrem Lebenslauf extrahieren, und ihrem Standort (der für die meisten Menschen sehr wichtig ist) anzugeben und Übereinstimmungen mit den darauf basierenden Berufen zu finden.

In Bezug auf die Klassifizierung von Dokumenten würde ich einen ähnlichen Ansatz verfolgen. Ich würde empfehlen, eine tf idf-Matrix für jeden Lebenslauf als Standardmodell für Wörter zu berechnen, wobei nur die Berufsbezeichnung und die Fähigkeiten der Person (für die Sie eine Liste der zu suchenden Fähigkeiten definieren müssen) extrahiert und in eine ML eingespeist werden Algorithmus. Ich würde empfehlen, es mit knn und einer SVM zu versuchen. Letztere funktioniert sehr gut mit hochdimensionalen Textdaten. Lineare SVMs schneiden in der Regel besser ab als nichtlineare (z. B. mit RBF-Kerneln). Wenn Sie vernünftige Ergebnisse erzielen, spiele ich mit dem Extrahieren von Features mit einem Parser \ Chunker in natürlicher Sprache und einigen benutzerdefinierten Ausdrücken, die mit regulären Ausdrücken abgeglichen werden.

Simon
quelle
Verwenden Sie SVM immer noch, wenn Sie 3 oder mehr Klassen haben? Und welche Funktionen möchten Sie mit einem Parser für natürliche Sprachen extrahieren? Für welchen Zweck ?
user1769197
Sie können n SVMs für n Klassen trainieren, indem Sie eine Eins gegen die Rest-Strategie verwenden. SciKitLearn verfügt über Code, der dies automatisch erledigt. Technisch gesehen benötigen Sie n-1-Klassifikatoren, aber ich habe festgestellt, dass n besser funktioniert.
Simon
@Simon Können Sie die vollständigen Schritte für dieses Empfehlungssystem schreiben? Ich habe wenig Erfahrung (MS-Arbeit umsetzen) in ML, aber völlig neu im IR-Bereich. Jetzt arbeite ich an diesem System und habe die folgenden Schritte geschrieben. 1. Verwenden Sie NLTK, um Schlüsselwörter zu extrahieren, 2. Berechnen Sie die Punktzahl für Schlüsselwörter und Phrasen, 3. Stemmer, 4. Kategorisierung (die schwierigste Aufgabe) und 5. Frequenzmatrix, tf-idf oder BM25 algo. Bin ich auf dem richtigen Weg der Umsetzung? Danke
Khalid Usman
@KhalidUsman Ich kann dir nicht genau sagen, wie es funktioniert, das kann mich in Schwierigkeiten bringen. Die einfachste Lösung wäre, die Daten in Solr oder Elastic Search zu platzieren und deren MLT-Empfehlungsimplementierungen zu verwenden. Ein differenzierterer Ansatz besteht darin, Schlüsselwörter und -phrasen zu extrahieren, die Dokumente durch LSA zu verschieben und die resultierenden Vektoren mit k-nn zu bearbeiten. Dann möchten Sie möglicherweise andere Signale wie Kollaboratives Filtern und allgemeine Beliebtheit verwenden.
Simon
@ Simon, danke für deine Anleitung. Ich wende den 2. Weg an, ich habe Schlüsselwörter mit RAKE + NLTK extrahiert und danach geplant, tf-idf oder BM25 anzuwenden. Habe ich recht? Können Sie bitte die KNN-Methode etwas näher erläutern, ich meine, wie man KNN auf Keywords anwendet, sollte ich Keywords als Features erstellen? Danke
Khalid Usman