Özgeçmiş verilerine dayanarak iş sınıflandırmasını yapmak için hangi algoritmaları kullanmalıyım?


28

Not: R'de her şeyi yapıyorum.

Sorun şöyle devam ediyor:

Temel olarak, özgeçmişlerin bir listesi (CV) var. Bazı adaylar daha önce iş tecrübesine sahip olacak, bazıları ise işe yaramayacak. Buradaki amaç: Özgeçmişlerindeki metinlere dayanarak, onları farklı iş sektörlerine göre sınıflandırmak istiyorum. Özellikle adayların herhangi bir deneyime sahip olmadığı / öğrenci olmadığı durumlarda özellikle, ve bu adayın büyük olasılıkla mezun olduktan sonra hangi meslek sektörlerine ait olacağını sınıflandırmak için bir tahmin yapmak istiyorum.

Soru 1: Makine öğrenmesi algoritmalarını biliyorum. Ancak, daha önce hiç NLP yapmamıştım. İnternette Latent Dirichlet tahsisine rastladım. Bununla birlikte, sorunumla başa çıkmanın en iyi yaklaşım olup olmadığından emin değilim.

Asıl fikrim: bunu denetimli bir öğrenme sorunu haline getirin . Zaten çok sayıda etiketlenmiş veriye sahip olduğumuzu varsayalım; bu da, adayların listesi için iş sektörlerini doğru şekilde etiketlediğimiz anlamına gelir. Modeli ML algoritmaları kullanarak (yani en yakın komşu ...) kullanarak eğitiriz ve çalışma deneyimi olmayan / öğrenci olan etiketli olmayan verileri besler ve hangi iş sektörüne ait olacağını tahmin etmeye çalışırız.

Soruyu Güncelle 2: Özgeçmişteki her şeyi ayıklayarak bir metin dosyası oluşturmak ve bu verileri metin dosyasında yazdırmak iyi bir fikir olabilir mi, böylece her özgeçmiş yapılandırılmamış dizeleri içeren bir metin dosyasıyla ilişkilendirilir ve sonra metin dosyalarına uygulanan metin madenciliği teknikleri ve verilerin yapılandırılmasını ve hatta metin dosyalarında kullanılan terimlerin sıklık matrisini oluşturmasını sağlar? Örneğin, metin dosyası şuna benzeyebilir:

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

“Yapılandırılmamış” derken kastediyorum, yani her şeyi tek bir satır dizisine çökertmek.

Bu yaklaşım yanlış mı? Yaklaşımımın yanlış olduğunu düşünüyorsanız lütfen beni düzeltin.

Soru 3: İşin zor yanı ise: Anahtar kelimeleri nasıl belirleyip çıkarabilirsiniz ? Kullanılması tmR paketi? tm paket hangi algoritmaya dayanıyor? NLP algoritmaları kullanmalı mıyım? Evet ise, hangi algoritmalara bakmalıyım? Lütfen bana bakmak için iyi kaynaklara yönlendir.

Herhangi bir fikir harika olurdu.

Yanıtlar:


14

Bu bağlantıya göz atın .

Burada, sizi bir wordcloud oluşturmak için yapılandırılmamış metin yükleyerek geçirecekler. Bu stratejiyi uyarlayabilir ve bir wordcloud oluşturmak yerine, kullanılan terimlerin sıklık matrisini oluşturabilirsiniz. Fikir yapılandırılmamış metni almak ve bir şekilde yapılandırmaktır. Her şeyi küçük harfe (veya büyük harfe) değiştirir, durma sözcükleri kaldırır ve her iş işlevi için sık kullanılan terimleri Belge Terimi Matrisleri aracılığıyla bulabilirsiniz. Ayrıca kelimeleri kökten çıkarma seçeneğiniz de vardır. Kelimelerin köklerini kırarsanız, kelimelerin farklı biçimlerini aynı kelimeyle tespit edebilirsiniz. Örneğin, “programlanmış” ve “programlama”, “program” a kaynaklanabilir. Bu sık terimlerin oluşumunu ML model eğitiminizde ağırlıklı bir özellik olarak ekleyebilirsiniz.

Bunu, her iş fonksiyonu için ortak 2-3 kelimelik ortak gruplar bularak, sık kullanılan cümlelere uyarlayabilirsiniz.

Örnek:

1) Kütüphaneleri yükleyin ve örnek verileri oluşturun

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) Şimdi bazı metin yapılandırmaları yapıyoruz. Aşağıdakileri yapmanın daha hızlı / daha kısa yolları olduğuna inanıyorum.

# 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) Bir korpus kaynağı ve belge terim matrisi oluşturun.

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

Şimdi frekans matrisi, jobFreq, yani bir (3 x x) matris, 3 giriş ve X kelime sayısı var.

Buradan nereye gideceksin sana kalmış. Yalnızca belirli (daha yaygın) kelimeleri tutabilir ve bunları modelinizde özellikler olarak kullanabilirsiniz. Başka bir yol basit tutmak ve her iş tanımında kullanılan kelimelerin bir yüzdesine sahip olmak, "java" nın "yazılım mühendisliği" nde% 80, "kalite güvencesi" nde sadece% 50 oluşumu olacağını söylüyorlar.

Şimdi “güvence” nin 1 “r” ve “oluş” un neden 2 ”si olduğuna bakma zamanı.


Örneğinizi görmek isterim.
user1769197,

Hızlı bir örnekle güncellendi.
nfmcclure

11

Sadece anahtar kelimeleri çıkartın ve üzerine bir sınıflandırıcı hazırlayın. Hepsi bu, gerçekten.

Özgeçmişlerdeki metnin çoğu aslında becerilerle ilgili değildir. Örneğin, "Java konusunda deneyimli ve çok etkinim" cümlesini düşünün. Burada 7 kelimeden sadece 1'i bir yetenek adıdır, gerisi sadece sınıflandırma doğruluğunuzu düşürecek bir gürültüdür.

Özgeçmişlerin çoğu gerçekten yapılandırılmamıştır. Veya çok serbestçe yapılandırılmış. Veya bölümler için olağandışı isimler kullanın. Veya metne çevrildiğinde yapıyı korumayan dosya biçimleri. Tarihler, saatler, isimler, adresler ve hatta yapılandırılmamış metinden niyetli insanlar çıkarma deneyimim var, ancak bir beceri (veya üniversite veya herhangi bir şey) listesini bile değil

Böylece CV'lerinizi belirtin (ve muhtemelen kökleyin ), yalnızca önceden tanımlanmış listeden kelimeler seçin (LinkedIn veya bu listeyi kapmak için benzer bir şey kullanabilirsiniz), bir özellik vektörü oluşturun ve birkaç sınıflandırıcı deneyin (SVM ve Naive Bayes) .

(Not: LinkedIn profillerini>% 90 doğrulukla 50'den fazla sınıfa sınıflandırmak için benzer bir yaklaşım kullandım, bu yüzden saf uygulamanın iyi çalışacağından eminim.)


Linkedin verilerini analiz ediyorum, önceki iş deneyimini, eğitim önerilerini ve bir profilin becerilerini bir metin dosyasına birleştirip anahtar kelimeler almanın benim için iyi bir fikir olduğunu düşünüyor musunuz?
user1769197, 14

LinkedIn artık insanların kendilerine atadıkları ve diğer kullanıcıların onaylayabilecekleri beceri etiketlerine sahipler, bu nedenle temelde anahtar kelimeleri manuel olarak çıkarmanıza gerek yok. Ancak daha az yapılandırılmış veri olması durumunda - evet, her şeyi birleştirmek ve ardından anahtar kelimeleri almak faydalı olabilir. Ancak, ana kuralı unutmayın: deneyin . Teori iyidir, ancak yalnızca farklı yaklaşımlarla yapılan pratik deneyler en iyisini ortaya koyacaktır.
ffriend

@ffriend, Bu anahtar kelime listesini nasıl alırız?
NG_21

1
@ffriend "experience" = '5 yıl', "Language" = 'C' harflerini aşağıdaki cümleyle ayıklamanın en iyi yolu nedir? "5 yıl boyunca hata izleme sistemleri geliştirmek ve C'deki sistem uygulamalarını yönetmek için veri oluşturmakla geçirdim". Ben NLTK ile Rake kullanılan ve sadece yok sayılan kelime + noktalamalar kaldırıldı, ancak yukarıdaki cümleden i vb veri oluşturma, sistemler, teşekkürler, gelişmekte hata izleme gibi kelimeler gerekmez
Halid Usman

3
@KhalidUsman: NLTL ile zaten çalıştığınızdan, adlandırılmış varlık tanıma araçlarına , özellikle "Normal İfadelerle Öğütme" bölümüne bakın. Genel olarak, adlandırılmış varlıkları çıkarmak için bir anahtar kelime sözlüğü (örneğin "yıl", "C", vb.) Ve basit kural kümesi ("" C "içerir" veya "<sayı> yıl" gibi) kullanmak istersiniz. serbest biçimli bir metnin dışında.
Arkadaş

7

Bu zor bir problem. Bununla baş etmenin birçok yolu var. Sanırım, özgeçmişler yarı yapılandırılmış belgeler olarak ele alınabilir. Bazen belgelerde minimal bir yapıya sahip olmak faydalıdır. İnanıyorum ki, özgeçmişlerinde bazı tablo bilgileri göreceksiniz. Bunları özellik değer çiftleri olarak ele almak isteyebilirsiniz. Örneğin, "Beceri seti" özelliği için bir terimler listesi elde edeceksiniz.

Buradaki ana fikir, "beceri", "eğitim", "yayın" vb. Gibi temel ifadelerin bir listesini manuel olarak yapılandırmaktır. Bir sonraki adım, bu önemli ifadelerle ilgili terimleri bir şekilde sömürerek çıkarmaktır. Tablolar halinde) veya bu anahtar ifadelerin etrafındaki terimlerin yakınlığını kullanarak, örneğin "Java" kelimesinin "beceri" terimine yakın olması gerçeği, kişinin Java'da yetenekli olduğunu gösterebilir.

Bu bilgileri çıkardıktan sonra, bir sonraki adım bu anahtar ifadelerin her biri için bir özellik vektörü oluşturmak olabilir. Daha sonra bir dokümanı farklı alanlara sahip bir vektör olarak temsil edebilirsiniz (her biri bir anahtar ifade için) Örneğin, proje ve eğitim olmak üzere iki alanla temsil edilen aşağıdaki iki özgeçmişi düşünün .

Doküman 1: {proje: (java, 3) (c, 4)}, {eğitim: (bilgisayar, 2), (fizik, 1)}

Doc2: {proje: (java, 3) (python, 2)}, {eğitim: (matematik, 3), (bilgisayar, 2)}

Yukarıdaki örnekte, frekanslı bir terim gösteriyorum. Tabii ki, terimleri çıkarırken durma sözcükleri kaldırmanız ve kaldırmanız gerekir. Örneklerden açıktır ki, özgeçmişi Doc1 olan kişinin C'de D2'den daha yetenekli olduğu açıktır. Uygulama akıllıca, belgeleri Lucene'de alan vektörleri olarak göstermek çok kolaydır.

Şimdi, bir sonraki adım, bir iş şartnamesi verilen bir özgeçmiş listesinin alınmasıdır. Aslında, sorguları (iş özellikleri) alan vektörleri olarak da temsil ediyorsanız, bu oldukça yalındır. İndeksli bir özgeçmiş koleksiyonundan Lucene'yi kullanarak bir aday listesini (özgeçmiş) almanız yeterli.


Algoritma-bilge: Ne önerirsiniz?
user1769197,

sorgu işi vektörü verilen en benzer özgeçmiş vektörlerini hesaplamak için algoritma mı demek istiyorsunuz? BM25 veya Dil Modeli gibi herhangi bir standart algoritmayı kullanabilirsiniz ...
Debasis,

Bu algoritmaları hiç duymadım. Bu NLP algoritmaları mı yoksa ML algo mu?
user1769197

Bunlar standart alma modelleri ... alma modeli, bir belge (sizin durumunuzdaki özgeçmiş) ve bir sorgu (sizin durumunuzdaki iş) arasındaki benzerliğin nasıl hesaplanacağını tanımlar.
Debasis,

Bilgi alma konusunda hiçbir bilgim yok, kümelenme / en yakın komşu gibi makine öğrenme algoritmaları da benim durumumda işe yarayacak mı?
user1769197

7

Bir çevrimiçi iş sitesi için çalışıyorum ve özgeçmişlere göre iş önermek için çözümler üretiyoruz. Yaklaşımımız, bir kişinin iş unvanını (veya bir öğrenciyi ve biliniyorsa istenen iş unvanını), özgeçmişinden çıkardığımız becerileri ve konumlarını (çoğu insan için çok önemlidir) ve buna dayalı işlerle eşleşmeler bulur.

Belge sınıflandırma açısından da benzer bir yaklaşım izlerdim. Her bir özgeçmiş için tf idf matrisini standart bir sözcük çantası olarak tanımlamanızı, sadece kişinin iş unvanını ve becerilerini (bunun için aranacak bir yetenek listesi tanımlamanız gereken) çıkarmanızı ve bir ML'ye beslemenizi öneririm) algoritması. Knn'ı denemeyi tavsiye ederim ve bir SVM, ikincisi yüksek boyutlu metin verileriyle çok iyi çalışıyor. Doğrusal SVM'ler doğrusal olmayanlardan daha iyi performans gösterir (örneğin RBf çekirdekleri kullanarak). Makul sonuç çıkaran bir sonuç varsa, o zaman doğal bir dil çözümleyici \ chunker ve aynı zamanda regex'inkiyle eşleşen bazı özel yapım ifadeler kullanarak özelliklerle uğraşırdım.


3 veya daha fazla sınıfınız varken hala SVM kullanıyor musunuz? Doğal bir dil ayrıştırıcı kullanarak hangi özellikleri elde etmek istiyorsunuz? Ne amaçla ?
user1769197,

N svm'leri n sınıfları için dinlenme stratejisine karşı bir tane kullanarak eğitebilirsiniz. SciKitLearn bunu otomatik olarak yapmak için bir kod kullanır. Teknik olarak n-1 sınıflandırıcılarına ihtiyacınız var, ancak n işlerinin daha iyi olduğunu buldum.
Simon

@Simon Bu öneri sistemi için tüm adımları yazabilir misiniz? ML konusunda çok az deneyime sahibim (yüksek lisans tezi uyguladım), ancak IR alanında tamamen yeni. Şimdi bu sistem üzerinde çalışıyorum ve aşağıdaki adımları yazdım. 1. Anahtar kelimeleri çıkarmak için NLTK kullanın, 2. Anahtar kelimeler ve deyimler için puan hesaplayın, 3. Stemmer, 4. Sınıflandırma (en zorlu görev) ve 5. Frekans matrisi, tf-idf veya BM25 algo. Ben doğru uygulama yolunda mıyım? Teşekkürler
Khalid Usman,

@KhalidUsman Size tam olarak nasıl çalıştığını söyleyemem, bu başımı belaya sokabilir. En kolay çözüm, verileri Solr veya Elastic Search'e koymak ve MLT danışmanı uygulamalarını kullanmak olacaktır. Daha karmaşık bir yaklaşım, anahtar kelimeleri ve cümleleri çıkarmak, belgeleri LSA'ya itmek ve ortaya çıkan vektörleri knn yapmaktır. Ardından, Ortak Filtreleme ve genel popülerlik gibi diğer sinyalleri kullanmak isteyebilirsiniz.
Simon,

@Simon, rehberliğiniz için teşekkürler. 2. yolu kullanıyorum, RAKE + NLTK kullanarak anahtar kelimeler / anahtar kelimeler çıkarttım ve bundan sonra tf-idf veya BM25 kullanmayı planlıyorum. Haklı mıyım? Lütfen KNN’yi biraz daha detaylandırabilir misiniz, yani anahtar kelimelere knn uygulayacağım, anahtar kelimeler bir özellik olarak mı kullanmalıyım? Teşekkürler
Khalid Usman,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.