Algoritma apa yang harus saya gunakan untuk melakukan klasifikasi pekerjaan berdasarkan data resume?

28

Perhatikan bahwa saya melakukan semuanya dalam R.

Masalahnya sebagai berikut:

Pada dasarnya, saya memiliki daftar riwayat hidup (CV). Beberapa kandidat akan memiliki pengalaman kerja sebelumnya dan beberapa tidak. Tujuannya di sini adalah untuk: berdasarkan teks pada CV mereka, saya ingin mengklasifikasikan mereka ke dalam sektor pekerjaan yang berbeda. Saya khususnya dalam kasus-kasus itu, di mana para kandidat tidak memiliki pengalaman / adalah seorang mahasiswa, dan saya ingin membuat prediksi untuk mengklasifikasikan sektor pekerjaan mana yang kemungkinan besar dimiliki oleh kandidat ini setelah lulus.

Pertanyaan 1: Saya tahu algoritma pembelajaran mesin. Namun, saya belum pernah melakukan NLP sebelumnya. Saya menemukan alokasi Latent Dirichlet di internet. Namun, saya tidak yakin apakah ini adalah pendekatan terbaik untuk mengatasi masalah saya.

Gagasan asli saya: jadikan ini masalah belajar yang diawasi . Misalkan kita sudah memiliki sejumlah besar data berlabel, artinya kita telah dengan benar memberi label pada sektor pekerjaan untuk daftar kandidat. Kami melatih model menggunakan algoritme ML (yaitu tetangga terdekat ...) dan memasukkan data tidak berlabel tersebut , yang merupakan kandidat yang tidak memiliki pengalaman kerja / siswa, dan mencoba memprediksi sektor pekerjaan mana yang akan menjadi bagian mereka.

Perbarui Pertanyaan 2: Apakah ide yang baik untuk membuat file teks dengan mengekstraksi semuanya dalam resume dan mencetak data ini dalam file teks, sehingga setiap resume dikaitkan dengan file teks, yang berisi string tidak terstruktur, dan kemudian kami teknik penambangan teks yang diterapkan ke file teks dan membuat data menjadi terstruktur atau bahkan untuk membuat matriks frekuensi istilah yang digunakan dari file teks? Misalnya, file teks mungkin terlihat seperti ini:

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

Inilah yang saya maksud dengan 'tidak terstruktur', yaitu menciutkan semuanya menjadi satu baris string.

Apakah pendekatan ini salah? Harap perbaiki saya jika Anda menganggap pendekatan saya salah.

Pertanyaan 3: Bagian yang sulit adalah: bagaimana cara mengidentifikasi dan mengekstrak kata kunci ? Menggunakan tmpaket dalam R? berdasarkan algoritma apa tm paket itu? Haruskah saya menggunakan algoritma NLP? Jika ya, algoritma apa yang harus saya perhatikan? Tolong tunjukkan saya ke beberapa sumber daya yang baik untuk melihat juga.

Ide apa pun akan bagus.

pengguna1769197
sumber

Jawaban:

14

Lihat tautan ini .

Di sini, mereka akan membawa Anda melalui pemuatan teks yang tidak terstruktur untuk membuat wordcloud. Anda dapat mengadaptasi strategi ini dan alih-alih membuat wordcloud, Anda dapat membuat matriks frekuensi istilah yang digunakan. Idenya adalah untuk mengambil teks yang tidak terstruktur dan struktur entah bagaimana. Anda mengubah semuanya menjadi huruf kecil (atau huruf besar), menghapus kata-kata berhenti, dan menemukan istilah yang sering untuk setiap fungsi pekerjaan, melalui Dokumen Istilah Matriks. Anda juga memiliki opsi untuk membendung kata-kata. Jika Anda membendung kata-kata, Anda akan dapat mendeteksi berbagai bentuk kata sebagai kata yang sama. Misalnya, 'diprogram' dan 'pemrograman' dapat dibendung ke 'program'. Anda mungkin dapat menambahkan kemunculan istilah yang sering ini sebagai fitur berbobot dalam pelatihan model ML Anda.

Anda juga dapat mengadaptasi ini ke frasa yang sering, menemukan grup umum 2-3 kata untuk setiap fungsi pekerjaan.

Contoh:

1) Muat perpustakaan dan buat contoh data

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) Sekarang kita melakukan penataan teks. Saya yakin ada cara yang lebih cepat / pendek untuk melakukan hal berikut.

# 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) Buat sumber korpus dan matriks istilah dokumen.

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

Sekarang kita memiliki matriks frekuensi, jobFreq, yaitu matriks (3 x), 3 entri dan jumlah kata X.

Kemana Anda pergi dari sini terserah Anda. Anda hanya dapat menyimpan kata-kata spesifik (lebih umum) dan menggunakannya sebagai fitur dalam model Anda. Cara lain adalah dengan membuatnya tetap sederhana dan memiliki persentase kata yang digunakan dalam setiap deskripsi pekerjaan, katakanlah "java" akan memiliki 80% kejadian di 'insinyur perangkat lunak' dan hanya 50% terjadi di 'jaminan kualitas'.

Sekarang saatnya untuk mencari mengapa 'jaminan' memiliki 1 'r' dan 'kemunculan' memiliki 2 'r's.

nfmcclure
sumber
Saya ingin melihat contoh Anda.
user1769197
Diperbarui dengan contoh cepat.
nfmcclure
11

Cukup ekstrak kata kunci dan latih pengelompokan kata kunci pada mereka. Itu saja, sungguh.

Sebagian besar teks dalam CV sebenarnya tidak terkait dengan keterampilan. Misalnya, pertimbangkan kalimat "Saya berpengalaman dan sangat efisien di Jawa". Di sini hanya 1 dari 7 kata yang merupakan nama skill, sisanya hanya suara yang akan menurunkan akurasi klasifikasi Anda.

Sebagian besar CV tidak benar-benar terstruktur. Atau terstruktur terlalu bebas. Atau gunakan nama yang tidak biasa untuk bagian. Atau format file yang tidak mempertahankan struktur saat diterjemahkan ke teks. Saya memiliki pengalaman mengekstraksi tanggal, waktu, nama, alamat dan bahkan orang yang bermaksud dari teks yang tidak terstruktur, tetapi bukan daftar keterampilan (atau universitas atau apa pun), bahkan tidak dari dekat.

Jadi cukup tokenize (dan mungkin batang ) CV Anda, pilih hanya kata-kata dari daftar yang telah ditentukan (Anda dapat menggunakan LinkedIn atau sesuatu yang serupa untuk ambil daftar ini), buat vektor fitur dan coba beberapa pengklasifikasi (katakanlah, SVM dan Naif Bayes) .

(Catatan: Saya menggunakan pendekatan serupa untuk mengklasifikasikan profil LinkedIn menjadi lebih dari 50 kelas dengan akurasi> 90%, jadi saya cukup yakin bahkan implementasi naif akan bekerja dengan baik.)

teman
sumber
Katakanlah saya sedang menganalisis data yang ditautkan, menurut Anda apakah ide yang baik bagi saya untuk menggabungkan pengalaman kerja sebelumnya, rekomendasi pendidikan, dan keterampilan satu profil menjadi satu file teks dan mengekstrak kata kunci dari data itu?
user1769197
LinkedIn sekarang memiliki tag keterampilan yang ditetapkan sendiri oleh orang dan pengguna lain dapat mendukung, jadi pada dasarnya tidak perlu mengekstrak kata kunci secara manual. Tetapi dalam hal data yang kurang terstruktur - ya, mungkin akan membantu untuk menggabungkan semuanya dan kemudian mengambil kata kunci. Namun, ingat aturan utama: coba saja . Teori itu bagus, tetapi hanya eksperimen praktis dengan pendekatan berbeda yang akan mengungkapkan yang terbaik.
Berteman
@ teman, Bagaimana kita mendapatkan daftar kata kunci itu?
NG_21
1
@ teman Apa cara terbaik untuk mengekstrak "pengalaman" = '5 tahun', "Bahasa" = 'C' dari kalimat berikut. "Saya telah menghabiskan 5 tahun mengembangkan sistem pelacakan bug dan membuat aplikasi sistem pengelolaan data di C". Saya menggunakan Rake dengan NLTK dan hanya menghapus tanda baca + stopword, tetapi dari kalimat di atas saya tidak memerlukan kata-kata seperti pengembangan, pelacakan bug, sistem, pembuatan, data dll. Terima kasih
Khalid Usman
3
@KhalidUsman: karena Anda sudah bekerja dengan NLTL, lihat alat pengenal entitas bernama , terutama bagian "Berpotong dengan Ekspresi Reguler" Secara umum, Anda ingin menggunakan kamus kata kunci (mis. "Tahun", "C", dll.) Dan sekumpulan aturan sederhana (seperti "berisi 'C'" atau "<number> tahun") untuk mengekstraksi entitas yang bernama dari teks bentuk bebas.
Berteman
7

Ini masalah yang sulit. Ada banyak cara untuk menanganinya. Saya kira, resume dapat diperlakukan sebagai dokumen semi-terstruktur. Terkadang, menguntungkan memiliki beberapa struktur minimal dalam dokumen. Saya percaya, dalam resume Anda akan melihat beberapa data tabular. Anda mungkin ingin memperlakukan ini sebagai pasangan nilai atribut. Misalnya, Anda akan mendapatkan daftar istilah untuk atribut "Skill set".

Gagasan utamanya adalah mengonfigurasi daftar frasa kunci secara manual seperti "skill", "pendidikan", "publikasi" dll. Langkah selanjutnya adalah mengekstraksi istilah yang berkaitan dengan frasa kunci ini baik dengan mengeksploitasi struktur dengan cara tertentu (seperti sebagai tabel) atau dengan memanfaatkan kedekatan istilah di sekitar frasa kunci ini, mis. fakta bahwa kata "Jawa" sangat dekat dengan istilah "keterampilan" mungkin menunjukkan bahwa orang tersebut terampil di Jawa.

Setelah Anda mengekstrak informasi ini, langkah selanjutnya adalah membangun vektor fitur untuk masing-masing frase kunci ini. Anda kemudian dapat mewakili dokumen sebagai vektor dengan bidang yang berbeda (masing-masing untuk frasa kunci). Sebagai contoh, perhatikan dua resume berikut diwakili dengan dua bidang, yaitu proyek dan pendidikan .

Doc1: {project: (java, 3) (c, 4)}, {pendidikan: (komputer, 2), (fisika, 1)}

Doc2: {project: (java, 3) (python, 2)}, {pendidikan: (matematika, 3), (komputer, 2)}

Dalam contoh di atas, saya menunjukkan istilah dengan frekuensi. Tentu saja, saat mengekstraksi istilah yang Anda butuhkan untuk membendung dan menghapus kata-kata henti. Jelas dari contoh-contoh bahwa orang yang resumenya adalah Doc1 lebih terampil dalam C daripada D2. Dari segi implementasi, sangat mudah untuk merepresentasikan dokumen sebagai vektor lapangan di Lucene.

Sekarang, langkah selanjutnya adalah mengambil daftar peringkat resume yang diberikan spesifikasi pekerjaan. Bahkan, itu cukup mudah jika Anda mewakili kueri (spesifikasi pekerjaan) sebagai vektor bidang juga. Anda hanya perlu mengambil daftar peringkat kandidat (resume) menggunakan Lucene dari koleksi resume yang diindeks.

Debat
sumber
Algoritma: apa yang akan Anda rekomendasikan?
user1769197
maksudmu algoritma untuk menghitung vektor resume paling mirip diberikan vektor pekerjaan kueri? Anda dapat menggunakan algoritme standar apa pun seperti BM25 atau Model Bahasa ...
Debasis
Saya belum pernah mendengar tentang algoritma ini sama sekali. Apakah ini algoritma NLP atau ML algo?
user1769197
ini adalah model pengambilan standar ... model pengambilan mendefinisikan cara menghitung kesamaan antara dokumen (melanjutkan dalam kasus Anda) dan permintaan (pekerjaan dalam kasus Anda).
Debat
Saya tidak memiliki pengetahuan tentang pencarian informasi, apakah menurut Anda algoritma pembelajaran mesin seperti pengelompokan / tetangga terdekat juga akan berfungsi dalam kasus saya?
user1769197
7

Saya bekerja untuk situs pekerjaan online dan kami membangun solusi untuk merekomendasikan pekerjaan berdasarkan resume. Pendekatan kami adalah judul pekerjaan seseorang (atau jabatan yang diinginkan jika seorang siswa dan dikenal), bersama dengan keterampilan yang kami ekstrak dari resume mereka, dan lokasi mereka (yang sangat penting bagi kebanyakan orang) dan menemukan kecocokan dengan pekerjaan berdasarkan itu.

dalam hal klasifikasi dokumen, saya akan mengambil pendekatan serupa. Saya akan merekomendasikan menghitung matriks idf untuk setiap resume sebagai model tas standar kata-kata, mengekstraksi hanya judul pekerjaan dan keterampilan seseorang (yang Anda perlu menentukan daftar keterampilan yang harus dicari), dan memasukkannya ke dalam ML algoritma Saya akan merekomendasikan mencoba knn, dan SVM, yang terakhir bekerja sangat baik dengan data teks dimensi tinggi. SVM linear cenderung lebih baik daripada non-linear (mis. Menggunakan kernel RBf). Jika Anda memiliki hasil keluaran yang masuk akal, saya kemudian akan bermain dengan mengekstraksi fitur menggunakan parser bahasa alami \ chunker, dan juga beberapa frasa yang dibuat khusus yang cocok dengan regex's.

Simon
sumber
Apakah Anda masih menggunakan SVM ketika Anda memiliki 3 kelas atau lebih? Dan fitur apa yang ingin Anda ekstrak menggunakan parser bahasa alami? Untuk tujuan apa ?
user1769197
Anda dapat melatih n svm's untuk n class menggunakan strategi one vs the rest. SciKitLearn memiliki kode untuk melakukannya secara otomatis. Secara teknis Anda memerlukan n-1 classifier, tetapi saya merasa memiliki n berfungsi lebih baik.
Simon
@Simon Bisakah Anda menulis langkah-langkah lengkap untuk sistem rekomendasi ini? Saya memiliki sedikit pengalaman (mengimplementasikan tesis MS) di ML, tetapi benar-benar baru di bidang IR. Sekarang saya sedang mengerjakan sistem ini dan saya menulis langkah-langkah berikut. 1. Gunakan NLTK untuk mengekstrak kata kunci, 2. Hitung skor untuk kata kunci dan frasa, 3. Stemmer, 4. Kategorisasi (tugas yang paling menantang) dan 5. Matriks frekuensi, tf-idf atau algo BM25. Apakah saya berada di jalan implementasi yang benar? Terima kasih
Khalid Usman
@KhalidUsman Saya tidak bisa memberi tahu dengan tepat cara kerjanya, yang mungkin membuat saya dalam kesulitan. Solusi termudah adalah dengan memasukkan data ke dalam Solr atau Pencarian Elastis dan menggunakan implementasi rekomendasi MLT mereka. Pendekatan yang lebih canggih adalah mengekstraksi kata dan frasa kunci, mendorong dokumen melalui LSA, dan melakukan k-nn pada vektor yang dihasilkan. Maka Anda mungkin ingin menggunakan sinyal lain seperti Penyaringan Kolaboratif, dan popularitas secara keseluruhan.
Simon
@Simon, terima kasih atas bimbingan Anda. Saya menerapkan cara ke-2, saya telah mengekstraksi kata kunci / frasa menggunakan RAKE + NLTK dan setelah itu saya berencana untuk menerapkan tf-idf atau BM25. Apakah saya benar? Bisakah Anda menjelaskan sedikit cara KNN, maksud saya cara menerapkan knn pada kata kunci, haruskah saya menjadikan kata kunci sebagai fitur? Terima kasih
Khalid Usman