रिज्यूम डेटा के आधार पर जॉब क्लासिफिकेशन करने के लिए मुझे किन एल्गोरिदम का इस्तेमाल करना चाहिए?


28

ध्यान दें कि मैं आर में सब कुछ कर रहा हूं।

समस्या इस प्रकार है:

मूल रूप से, मेरे पास रिज्यूमे (सीवी) की एक सूची है। कुछ उम्मीदवारों को पहले काम का अनुभव होगा और कुछ को नहीं। यहाँ लक्ष्य है: उनके सीवी पर पाठ के आधार पर, मैं उन्हें विभिन्न नौकरी क्षेत्रों में वर्गीकृत करना चाहता हूं। मैं उन मामलों में विशेष रूप से शामिल हूं, जिनमें उम्मीदवारों के पास कोई अनुभव नहीं है / एक छात्र है, और मैं यह वर्गीकृत करने के लिए एक भविष्यवाणी करना चाहता हूं कि इस नौकरी के उम्मीदवारों के स्नातक होने के बाद सबसे अधिक संभावना होगी।

प्रश्न 1: मैं मशीन लर्निंग एल्गोरिदम को जानता हूं। हालांकि, मैंने पहले कभी एनएलपी नहीं किया। मैं इंटरनेट पर लेटेंट डिरिचलेट आवंटन पर आया था। हालांकि, मुझे यकीन नहीं है कि यह मेरी समस्या से निपटने का सबसे अच्छा तरीका है।

मेरा मूल विचार: इसे एक पर्यवेक्षित शिक्षण समस्या बनाना । मान लीजिए हमारे पास पहले से ही बड़ी मात्रा में लेबल डेटा हैं, जिसका अर्थ है कि हमने उम्मीदवारों की सूची के लिए नौकरी क्षेत्रों को सही ढंग से लेबल किया है। हम ML एल्गोरिदम (यानी निकटतम पड़ोसी ...) का उपयोग करके मॉडल को प्रशिक्षित करते हैं और उन अनलॉक्ड डेटा में फ़ीड करते हैं , जो ऐसे उम्मीदवार हैं जिनके पास कोई कार्य अनुभव नहीं है / छात्र हैं, और यह अनुमान लगाने की कोशिश करते हैं कि वे किस नौकरी क्षेत्र से संबंधित हैं।

अद्यतन प्रश्न 2: क्या एक फिर से शुरू में सब कुछ निकालकर एक पाठ फ़ाइल बनाने के लिए एक अच्छा विचार होगा और पाठ फ़ाइल में इन आंकड़ों को प्रिंट करें, ताकि प्रत्येक फिर से शुरू एक पाठ फ़ाइल के साथ जुड़ा हो, जिसमें असंरचित तार शामिल हैं, और फिर हम पाठ फ़ाइलों पर लागू माइनिंग तकनीक और डेटा को संरचित या यहां तक ​​कि पाठ फ़ाइलों से बाहर इस्तेमाल की जाने वाली शर्तों की आवृत्ति मैट्रिक्स बनाने के लिए बनाते हैं? उदाहरण के लिए, पाठ फ़ाइल कुछ इस तरह दिख सकती है:

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

यही मेरा मतलब है 'असंरचित', यानी एक ही लाइन स्ट्रिंग में सब कुछ ढह जाना।

क्या यह दृष्टिकोण गलत है? कृपया मुझे सही करें अगर आपको लगता है कि मेरा दृष्टिकोण गलत है।

प्रश्न 3: मुश्किल हिस्सा यह है: कीवर्ड को कैसे पहचानें और निकालें ? tmआर में पैकेज का उपयोग करना ? tm पैकेज किस एल्गोरिथ्म पर आधारित है? क्या मुझे एनएलपी एल्गोरिदम का उपयोग करना चाहिए? यदि हाँ, तो मुझे किस एल्गोरिदम को देखना चाहिए? कृपया मुझे कुछ अच्छे संसाधनों की ओर भी ध्यान दें।

सभी विचारों का स्वागत है।

जवाबों:


14

की जाँच करें इस लिंक।

यहां, वे आपको वर्डक्लाउड बनाने के लिए अनस्ट्रक्चर्ड टेक्स्ट लोड करने के माध्यम से ले जाएंगे। आप इस रणनीति को अनुकूलित कर सकते हैं और वर्डक्लाउड बनाने के बजाय, उपयोग की जाने वाली शर्तों की आवृत्ति मैट्रिक्स बना सकते हैं। विचार यह है कि असंरचित पाठ को लेना और उसे किसी तरह से संरचना करना। आप डॉक्यूमेंट टर्म मैटीरियल के माध्यम से सब कुछ को लोअरकेस (या अपरकेस) में बदल देते हैं, स्टॉप शब्द हटा देते हैं और प्रत्येक जॉब फंक्शन के लिए बार-बार शब्द ढूंढते हैं। आपके पास शब्दों को गढ़ने का विकल्प भी है। यदि आप शब्दों को स्टेम करते हैं तो आप एक ही शब्द के रूप में विभिन्न रूपों का पता लगाने में सक्षम होंगे। उदाहरण के लिए, example प्रोग्राम्ड ’और 'प्रोग्रामिंग’ को med प्रोग्राम ’पर आधारित किया जा सकता है। आप संभवतः अपने एमएल मॉडल प्रशिक्षण में भारित सुविधा के रूप में इन लगातार शब्दों की घटना को जोड़ सकते हैं।

आप इसे अक्सर वाक्यांशों के लिए भी अनुकूलित कर सकते हैं, प्रत्येक नौकरी समारोह के लिए 2-3 शब्दों के सामान्य समूह ढूंढ सकते हैं।

उदाहरण:

1) पुस्तकालयों को लोड करें और उदाहरण डेटा का निर्माण करें

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) अब हम कुछ पाठ संरचना करते हैं। मैं सकारात्मक हूँ निम्नलिखित करने के लिए तेज / छोटे तरीके हैं।

# 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) एक कॉर्पस स्रोत और दस्तावेज़ अवधि मैट्रिक्स बनाएं।

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

अब हमारे पास फ़्रीक्वेंसी मैट्रिक्स, जॉबफ्रेक है, जो कि (3 बाय x) मैट्रिक्स, 3 एंट्रीज़ और एक्स नंबर ऑफ़ वर्ड्स है।

जहां से आप यहां जाते हैं वह आपके ऊपर है। आप केवल विशिष्ट (अधिक सामान्य) शब्द रख सकते हैं और उन्हें अपने मॉडल में सुविधाओं के रूप में उपयोग कर सकते हैं। दूसरा तरीका यह है कि इसे सरल रखें और प्रत्येक नौकरी विवरण में कुछ प्रतिशत शब्दों का उपयोग करें, "जावा" का कहना है कि 'सॉफ्टवेयर इंजीनियर' में 80% और 'गुणवत्ता आश्वासन' में केवल 50% घटना होगी।

अब यह देखने का समय आ गया है कि क्यों 'आश्वासन' में 1 'आर' है और 'घटना' में 2 'आर' हैं।


मुझे आपका उदाहरण देखना अच्छा लगेगा।
user1769197

त्वरित उदाहरण के साथ अद्यतन किया गया।
nfmcclure

11

बस कीवर्ड निकालें और उन पर एक क्लासिफायर ट्रेन करें। यह सब वास्तव में है।

सीवी में अधिकांश पाठ वास्तव में कौशल से संबंधित नहीं है। उदाहरण वाक्य पर विचार करें "मैं जावा में अनुभवी और अत्यधिक कुशल हूं"। यहाँ 7 में से केवल 1 शब्द एक कौशल नाम है, बाकी सिर्फ एक शोर है जो आपकी वर्गीकरण सटीकता को नीचे रखने वाला है।

अधिकांश सीवी वास्तव में संरचित नहीं हैं। या बहुत स्वतंत्र रूप से संरचित। या वर्गों के लिए असामान्य नामों का उपयोग करें। या फ़ाइल प्रारूप जो पाठ में अनुवादित होने पर संरचना को संरक्षित नहीं करते हैं। मेरे पास दिनांक, समय, नाम, पते और यहां तक ​​कि लोगों को असंरचित पाठ से निकालने का अनुभव है, लेकिन कौशल (या विश्वविद्यालय या कुछ भी) सूची में नहीं, यहां तक ​​कि निकटता से भी नहीं।

तो बस अपने CVs को टोकन (और संभवतः स्टेम ) करें, पूर्वनिर्धारित सूची से केवल शब्दों का चयन करें (आप इस सूची को हथियाने के लिए लिंक्डइन या कुछ इसी तरह का उपयोग कर सकते हैं), एक फीचर वेक्टर बनाएं और कुछ वर्ग के क्लासिफायर (जैसे, SVM और Naive Bayes) आज़माएं। ।

(नोट: मैंने लिंक्डइन प्रोफाइल को 50 से अधिक वर्गों में वर्गीकृत करने के लिए एक समान दृष्टिकोण का उपयोग किया> 90% सटीकता के साथ, इसलिए मुझे पूरा यकीन है कि भोली कार्यान्वयन भी अच्छी तरह से काम करेगा।)


कहो कि मैं लिंक्डिन डेटा का विश्लेषण कर रहा हूं, क्या आपको लगता है कि मेरे लिए पिछले कार्य अनुभव, शिक्षा सिफारिशों और एक प्रोफाइल के कौशल को एक पाठ फ़ाइल में मर्ज करना और उससे कीवर्ड निकालना एक अच्छा विचार होगा?
14:17 पर उपयोगकर्ता 1769197

लिंक्डइन में अब कौशल टैग हैं जो लोग खुद को सौंपते हैं और अन्य उपयोगकर्ता समर्थन कर सकते हैं, इसलिए मूल रूप से कीवर्ड को मैन्युअल रूप से निकालने की कोई आवश्यकता नहीं है। लेकिन कम संरचित डेटा के मामले में - हाँ, यह सब कुछ विलय करने और फिर कीवर्ड पुनः प्राप्त करने में मददगार हो सकता है। हालांकि, मुख्य नियम को याद रखें: इसे आज़माएं । थ्योरी अच्छी है, लेकिन विभिन्न दृष्टिकोणों के साथ केवल व्यावहारिक प्रयोग सबसे अच्छा प्रकट करेंगे।
दोस्ती

@ लाभ, हम उस खोजशब्द सूची को कैसे प्राप्त करते हैं?
NG_21

1
@ffriend निम्नलिखित वाक्य से "अनुभव" = '5 वर्ष', "भाषा" = 'C' निकालने का सबसे अच्छा तरीका क्या है। "मैंने 5 साल बिताए हैं बग-ट्रैकिंग सिस्टम विकसित करने और सी में डेटा प्रबंधन प्रणाली एप्लिकेशन बनाने में।" मैंने एनएलटीके के साथ रेक का इस्तेमाल किया और इसने बस स्टॉपवॉटर + विराम चिह्नों को हटा दिया, लेकिन उपरोक्त वाक्य से मुझे विकासशील, बग-ट्रैकिंग, सिस्टम, बनाने, डेटा आदि जैसे शब्दों की आवश्यकता नहीं है धन्यवाद
खालिद उस्मान

3
@ खालिदउस्मान: चूंकि आप पहले से ही एनएलटीएल के साथ काम करते हैं, इसलिए नाम की मान्यता इकाई पर एक नज़र डालें , विशेष रूप से "चॉन्किंग विद रेग्युलर एक्सप्रेशंस" सेक्शन। सामान्य तौर पर, आप नामित संस्थाओं को निकालने के लिए कीवर्ड का एक शब्दकोश (जैसे "वर्ष", "सी", आदि) और नियमों का सरल सेट (जैसे "" '' सी 'या "<संख्या> वर्ष") का उपयोग करना चाहेंगे। एक मुक्त-स्वरूप पाठ से बाहर।
दोस्तों

7

यह एक मुश्किल समस्या है। इसे संभालने के कई तरीके हैं। मुझे लगता है, रिज्यूमे को सेमी-स्ट्रक्चर्ड डॉक्यूमेंट के रूप में माना जा सकता है। कभी-कभी, दस्तावेजों में कुछ न्यूनतम संरचना रखना फायदेमंद होता है। मेरा मानना ​​है कि, रिज्यूमे में आपको कुछ सारणीबद्ध डेटा दिखाई देगा। आप इन्हें विशेषता मूल्य जोड़े के रूप में मान सकते हैं। उदाहरण के लिए, आपको "कौशल सेट" विशेषता के लिए शर्तों की एक सूची मिलेगी।

मुख्य विचार "कौशल", "शिक्षा", "प्रकाशन" आदि जैसे प्रमुख वाक्यांशों की एक सूची को मैन्युअल रूप से कॉन्फ़िगर करना है। अगला कदम उन शब्दों को निकालना है जो इन प्रमुख वाक्यांशों से संबंधित हैं, या तो किसी तरह से संरचना का दोहन करके (जैसे) तालिकाओं के रूप में) या इन प्रमुख वाक्यांशों के आसपास के शब्दों की निकटता का उपयोग करके, उदाहरण के लिए कि "जावा" शब्द "कौशल" शब्द के करीब निकटता में है, यह इंगित कर सकता है कि व्यक्ति जावा में कुशल है।

इन सूचनाओं को निकालने के बाद, अगला कदम इन प्रमुख वाक्यांशों में से प्रत्येक के लिए एक फीचर वेक्टर का निर्माण करना हो सकता है। फिर आप विभिन्न क्षेत्रों (एक कुंजी वाक्यांश के लिए प्रत्येक) के साथ एक वेक्टर के रूप में एक दस्तावेज़ का प्रतिनिधित्व कर सकते हैं। उदाहरण के लिए, परियोजना और शिक्षा , दो क्षेत्रों के साथ प्रतिनिधित्व किए गए निम्नलिखित दो रिज्यूमे पर विचार करें ।

Doc1: {प्रोजेक्ट: (जावा, 3) (c, 4)}, {शिक्षा: (कंप्यूटर, 2), (भौतिकी, 1)}

Doc2: {प्रोजेक्ट: (जावा, 3) (अजगर, 2)}, {शिक्षा: (गणित, 3), (कंप्यूटर, 2)}

उपरोक्त उदाहरण में, मैं आवृत्ति के साथ एक शब्द दिखाता हूं। बेशक, शब्दों को निकालने के दौरान आपको स्टॉप-शब्द को हटाने और हटाने की आवश्यकता होती है। उदाहरणों से स्पष्ट है कि जिस व्यक्ति का रिज्यूम Doc1 है, वह D2 की तुलना में C में अधिक कुशल है। कार्यान्वयन के लिहाज से, ल्यूसीन में फील्ड वैक्टर के रूप में दस्तावेजों का प्रतिनिधित्व करना बहुत आसान है।

अब, अगला कदम नौकरी विनिर्देश दिए गए रिज्यूमे की रैंक सूची को फिर से प्राप्त करना है। वास्तव में, यह काफी सीधा है अगर आप क्षेत्र के वैक्टर के रूप में प्रश्नों (जॉब स्पेक्स) का प्रतिनिधित्व करते हैं। आपको बस अनुक्रमित रिज्यूमे के संग्रह से ल्यूसिन का उपयोग करके उम्मीदवारों (फिर से शुरू) की एक सूचीबद्ध सूची को पुनः प्राप्त करने की आवश्यकता है।


एल्गोरिथम-वार: आप क्या सुझाएंगे?
user1769197

आपका मतलब है कि सबसे समान रिज्यूम वैक्टर की गणना के लिए एल्गोरिथ्म एक क्वेरी जॉब वेक्टर है? आप BM25 या भाषा मॉडल जैसे किसी भी मानक एल्गोरिथ्म का उपयोग कर सकते हैं ...
Debasis

मैंने इन एल्गोरिदम के बारे में कभी नहीं सुना है। क्या ये एनएलपी एल्गोरिदम या एमएल एलगो हैं?
user1769197

ये मानक पुनर्प्राप्ति मॉडल हैं ... एक पुनर्प्राप्ति मॉडल परिभाषित करता है कि एक दस्तावेज़ (आपके मामले में फिर से शुरू) और एक क्वेरी (आपके मामले में नौकरी) के बीच समानता की गणना कैसे करें।
डेबिसिस

मुझे जानकारी पुनर्प्राप्ति के बारे में कोई जानकारी नहीं है, क्या आपको लगता है कि मशीन सीखने वाले एल्गोरिदम जैसे क्लस्टरिंग / निकटतम पड़ोसी भी मेरे मामले में काम करेंगे?
user1769197

7

मैं एक ऑनलाइन नौकरी साइट के लिए काम करता हूं और हम रिज्यूमे के आधार पर नौकरियों की सिफारिश करने के लिए समाधान बनाते हैं। हमारा दृष्टिकोण एक व्यक्ति की नौकरी का शीर्षक (या एक छात्र और ज्ञात अगर वांछित नौकरी का शीर्षक), कौशल के साथ हम उनके फिर से शुरू से निकालते हैं, और उनका स्थान (जो ज्यादातर लोगों के लिए बहुत महत्वपूर्ण है) और उसके आधार पर नौकरियों के साथ मैच पाते हैं।

दस्तावेज़ वर्गीकरण के संदर्भ में, मैं एक समान दृष्टिकोण लेगा। मैं शब्दों के मॉडल के एक मानक बैग के रूप में प्रत्येक फिर से शुरू के लिए एक tf idf मैट्रिक्स की गणना करने की सलाह दूंगा, बस व्यक्ति की नौकरी का शीर्षक और कौशल (जिसके लिए आपको देखने के लिए कौशल की एक सूची को परिभाषित करने की आवश्यकता होगी), और एक एमएल में फ़ीड करें कलन विधि। मैं घुटने की कोशिश करने की सिफारिश करूंगा, और एक एसवीएम, बाद वाला उच्च आयामी पाठ डेटा के साथ बहुत अच्छी तरह से काम करता है। रैखिक एसवीएम की गैर-रैखिक (जैसे आरबीएफ गुठली का उपयोग करके) से बेहतर करने की प्रवृत्ति है। यदि आपके पास उचित परिणाम प्राप्त करने वाले हैं, तो मैं फिर एक प्राकृतिक भाषा parser \ chunker का उपयोग करते हुए सुविधाओं को निकालने के साथ खेलूंगा, और कुछ कस्टम निर्मित वाक्यांश भी regex द्वारा मेल खाते हैं।


क्या आपके पास अभी भी एसवीएम का उपयोग है जब आपके पास 3 या अधिक वर्ग हैं? और आप प्राकृतिक भाषा पार्सर का उपयोग करके क्या विशेषताएं निकालना चाहते हैं? किस लिए ?
user1769197

आप एक शेष बनाम रणनीति का उपयोग करके n वर्गों के लिए n svm के लिए प्रशिक्षित कर सकते हैं। SciKitLearn में स्वचालित रूप से ऐसा करने के लिए कोड है। तकनीकी तौर पर आपको n-1 क्लासिफायर की आवश्यकता होती है, लेकिन मैंने पाया है कि n बेहतर काम करता है।
सिमोन

@ साइमन क्या आप इस अनुशंसा प्रणाली के लिए पूर्ण चरण लिख सकते हैं? मुझे एमएल में बहुत कम अनुभव (एमएस थीसिस लागू करने) का है, लेकिन आईआर क्षेत्र में पूरी तरह से नया है। अब मैं इस प्रणाली पर काम कर रहा हूं और मैंने निम्नलिखित चरण लिखे हैं। 1. कीवर्ड निकालने के लिए NLTK का उपयोग करें, 2. कीवर्ड और वाक्यांशों के लिए स्कोर की गणना करें, 3. स्टीमर, 4. वर्गीकरण (सबसे चुनौतीपूर्ण कार्य) और 5. आवृत्ति मैट्रिक्स, tf-idf या BM25 algo। क्या मैं कार्यान्वयन के सही तरीके पर हूं? धन्यवाद
खालिद उस्मान

@KhalidUsman मैं आपको ठीक-ठीक नहीं बता सकता कि यह कैसे काम करता है, जिससे मुझे परेशानी हो सकती है। सबसे आसान उपाय यह होगा कि आप डेटा को सोलर या इलास्टिक सर्च में डालें और अपने एमएलटी रिकमेंडर कार्यान्वयन का उपयोग करें। एक अधिक परिष्कृत दृष्टिकोण प्रमुख शब्दों और वाक्यांशों को निकालने के लिए है, एलएसए के माध्यम से डॉक्स को धक्का दें, और परिणामस्वरूप वैक्टर पर के-एनएन करें। फिर आप अन्य संकेतों जैसे कि सहयोगी फ़िल्टरिंग, और समग्र लोकप्रियता का उपयोग करना चाह सकते हैं।
शमौन

@Simon, आपके मार्गदर्शन के लिए धन्यवाद। मैं दूसरा तरीका लागू कर रहा हूं, मैंने RAKE + NLTK का उपयोग करके कीवर्ड / कीफ़्रेज निकाले हैं और उसके बाद मैं tf-idf या BM25 लागू करने की योजना बना रहा हूं। क्या मैं सही हू? क्या आप कृपया KNN के तरीके को थोड़ा विस्तार से बता सकते हैं, मेरा मतलब है कि कीवर्ड पर knn कैसे लागू करें, क्या मुझे कीवर्ड को सुविधाओं के रूप में बनाना चाहिए? साभार
खालिद उस्मान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.