ฉันควรใช้อัลกอริทึมใดเพื่อจำแนกงานตามข้อมูลประวัติย่อ


28

โปรดทราบว่าฉันกำลังทำทุกอย่างในอาร์

ปัญหาเกิดขึ้นดังนี้:

โดยทั่วไปฉันมีรายการเรซูเม่ (CVs) ผู้สมัครบางคนจะมีประสบการณ์การทำงานมาก่อนและบางคนไม่ เป้าหมายที่นี่คือ: ขึ้นอยู่กับข้อความในประวัติส่วนตัวของพวกเขาฉันต้องการแบ่งพวกเขาออกเป็นภาคงานที่แตกต่างกัน โดยเฉพาะอย่างยิ่งฉันในกรณีเหล่านี้ซึ่งผู้สมัครไม่มีประสบการณ์ใด ๆ / เป็นนักเรียนและฉันต้องการที่จะทำนายการจำแนกประเภทของงานที่ผู้สมัครคนนี้น่าจะเป็นหลังจบการศึกษา

คำถามที่ 1: ฉันรู้อัลกอริทึมการเรียนรู้ของเครื่อง อย่างไรก็ตามฉันไม่เคยทำ NLP มาก่อน ฉันเจอการปันส่วน Dirichlet ของ Latent บนอินเทอร์เน็ต อย่างไรก็ตามฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหาของฉันหรือไม่

ความคิดเดิมของฉัน: ทำให้การเรียนรู้นี้ภายใต้การดูแลปัญหา สมมติว่าเรามีข้อมูลที่มีป้ายกำกับจำนวนมากอยู่แล้วซึ่งหมายความว่าเรามีการติดป้ายชื่อหมวดงานให้ถูกต้องสำหรับรายชื่อผู้สมัคร เราฝึกอบรมแบบจำลองโดยใช้อัลกอริธึม ML (เช่นเพื่อนบ้านที่ใกล้ที่สุด ... ) และป้อนข้อมูลในข้อมูลที่ไม่มีป้ายกำกับซึ่งเป็นผู้สมัครที่ไม่มีประสบการณ์การทำงาน / เป็นนักเรียนและพยายามคาดการณ์ว่าพวกเขาจะอยู่ในภาคส่วนใด

อัปเดต คำถามที่ 2: เป็นการดีหรือไม่ที่จะสร้างไฟล์ข้อความโดยแยกทุกอย่างในประวัติย่อและพิมพ์ข้อมูลเหล่านี้ออกมาในไฟล์ข้อความเพื่อให้แต่ละเรซูเม่เกี่ยวข้องกับไฟล์ข้อความซึ่งมีสตริงที่ไม่มีโครงสร้างและจากนั้นเรา นำเทคนิคการขุดข้อความไปใช้กับไฟล์ข้อความและทำให้ข้อมูลมีโครงสร้างหรือแม้กระทั่งการสร้างเมทริกซ์ความถี่ของคำที่ใช้จากไฟล์ข้อความ? ตัวอย่างเช่นไฟล์ข้อความอาจมีลักษณะดังนี้:

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

นี่คือสิ่งที่ฉันหมายถึงโดย 'ไม่มีโครงสร้าง' คือการยุบทุกอย่างเป็นสตริงบรรทัดเดียว

วิธีนี้ผิดหรือเปล่า? โปรดแก้ไขฉันหากคุณคิดว่าวิธีการของฉันไม่ถูกต้อง

คำถามที่ 3: ส่วนที่ยุ่งยากคือ: วิธีการระบุและสารสกัดจากคำหลัก ? ใช้tmแพ็คเกจใน R หรือไม่? อัลกอริทึมเป็นtm แพคเกจขึ้นอยู่กับอะไร? ฉันควรใช้อัลกอริทึม NLP หรือไม่ ถ้าใช่ฉันควรดูอัลกอริทึมอย่างไร โปรดชี้ให้ฉันไปยังแหล่งข้อมูลที่ดีเพื่อดูเช่นกัน

ความคิดใด ๆ จะดี

คำตอบ:


14

ตรวจสอบนี้การเชื่อมโยง

ที่นี่พวกเขาจะนำคุณไปสู่การโหลดข้อความที่ไม่มีโครงสร้างเพื่อสร้าง wordcloud คุณสามารถปรับกลยุทธ์นี้และแทนที่จะสร้าง wordcloud คุณสามารถสร้างเมทริกซ์ความถี่ของคำที่ใช้ ความคิดคือการใช้ข้อความและโครงสร้างที่ไม่มีโครงสร้างอย่างใด คุณเปลี่ยนทุกอย่างเป็นตัวพิมพ์เล็ก (หรือตัวพิมพ์ใหญ่), ลบคำหยุดและค้นหาคำที่พบบ่อยสำหรับแต่ละงานผ่านทางคำศัพท์เกี่ยวกับเอกสาร คุณยังมีตัวเลือกในการกั้นคำ หากคุณแยกคำคุณจะสามารถตรวจจับคำในรูปแบบที่แตกต่างกันเป็นคำเดียวกัน ตัวอย่างเช่น 'programmed' และ 'programming' อาจเกิดจาก 'program' คุณสามารถเพิ่มคำศัพท์บ่อยๆเหล่านี้เป็นคุณสมบัติถ่วงน้ำหนักในการฝึกอบรม ML model ของคุณ

นอกจากนี้คุณยังสามารถปรับให้เหมาะกับวลีที่ใช้บ่อยค้นหากลุ่มทั่วไปประมาณ 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)

ตอนนี้เรามีเมทริกซ์ความถี่ jobFreq นั่นคือเมทริกซ์ (3 คูณ x), 3 รายการและจำนวนคำ X

คุณไปไหนจากที่นี่ขึ้นอยู่กับคุณ คุณสามารถเก็บเฉพาะคำ (ทั่วไป) และใช้เป็นคุณสมบัติในแบบจำลองของคุณ อีกวิธีคือทำให้มันง่ายและมีเปอร์เซ็นต์ของคำที่ใช้ในแต่ละรายละเอียดงานพูดว่า "java" จะมี 80% เกิดขึ้นใน 'วิศวกรซอฟต์แวร์' และเกิดขึ้นเพียง 50% ใน 'การประกันคุณภาพ'

ตอนนี้ได้เวลาค้นหาสาเหตุที่ 'ความมั่นใจ' มี 1 'r' และ 'ปรากฏการณ์' มี 2 'r


ฉันชอบที่จะเห็นตัวอย่างของคุณ
user1769197

อัปเดตด้วยตัวอย่างรวดเร็ว
nfmcclure

11

เพียงแค่ดึงคำหลักและฝึกอบรมลักษณนามกับพวกเขา นั่นคือทั้งหมดที่จริง

ข้อความส่วนใหญ่ในประวัติส่วนตัวไม่เกี่ยวข้องกับทักษะ เช่นพิจารณาประโยค "ฉันมีประสบการณ์และมีประสิทธิภาพสูงใน Java" ที่นี่มีเพียง 1 ใน 7 คำคือชื่อทักษะส่วนที่เหลือเป็นเพียงเสียงที่จะลดความแม่นยำในการจัดหมวดหมู่ของคุณ

ประวัติย่อส่วนใหญ่ไม่ได้มีโครงสร้างจริงๆ หรือจัดโครงสร้างอย่างอิสระเกินไป หรือใช้ชื่อที่ผิดปกติสำหรับส่วนต่างๆ หรือรูปแบบไฟล์ที่ไม่รักษาโครงสร้างเมื่อแปลเป็นข้อความ ฉันมีประสบการณ์ในการแยกวันที่เวลาชื่อที่อยู่และแม้กระทั่งผู้คนที่เจตนาจากข้อความที่ไม่มีโครงสร้าง แต่ไม่ใช่รายการทักษะ (หรือมหาวิทยาลัยหรืออะไรก็ตาม) ไม่ใช่อย่างใกล้ชิด

ดังนั้นเพียง tokenize (และอาจจะเกิดขึ้น ) CV ของคุณเลือกเฉพาะคำจากรายการที่กำหนดไว้ล่วงหน้า (คุณสามารถใช้ LinkedIn หรือสิ่งที่คล้ายกันเพื่อคว้ารายการนี้) สร้างเวกเตอร์คุณลักษณะและลองใช้ตัวแยกประเภทสองตัว (เช่น SVM และ Naive Bayes) .

(หมายเหตุ: ฉันใช้วิธีการที่คล้ายกันในการจัดประเภทโปรไฟล์ LinkedIn เป็นมากกว่า 50 คลาสด้วยความแม่นยำ> 90% ดังนั้นฉันค่อนข้างมั่นใจว่าแม้การใช้งานแบบไร้เดียงสาจะทำงานได้ดี)


สมมติว่าฉันกำลังวิเคราะห์ข้อมูลที่เชื่อมโยงคุณคิดว่าเป็นความคิดที่ดีหรือไม่ที่ฉันจะผสานประสบการณ์การทำงานก่อนหน้านี้การแนะนำการศึกษาและทักษะของโปรไฟล์เดียวเป็นไฟล์ข้อความเดียวและแยกคำหลักออกจากกัน
user1769197

ตอนนี้ LinkedIn มีแท็กทักษะที่ผู้ใช้กำหนดเองและผู้ใช้รายอื่นสามารถรับรองดังนั้นโดยทั่วไปไม่จำเป็นต้องแยกคำหลักด้วยตนเอง แต่ในกรณีที่มีโครงสร้างข้อมูลน้อยกว่า - ใช่อาจเป็นประโยชน์ในการรวมทุกอย่างแล้วเรียกคำหลัก แต่จำไว้กฎหลัก: พยายามที่จะออก ทฤษฎีดี แต่เฉพาะการทดลองเชิงปฏิบัติด้วยวิธีการต่าง ๆ เท่านั้นที่จะเปิดเผยสิ่งที่ดีที่สุด
แฟน

@ เพื่อนเราจะหารายการคำหลักนั้นได้อย่างไร
NG_21

1
@ffriend วิธีที่ดีที่สุดในการแยก "ประสบการณ์" = '5 ปี', "ภาษา" = 'C' จากประโยคต่อไปนี้คืออะไร "ฉันใช้เวลา 5 ปีในการพัฒนาระบบติดตามบั๊กและสร้างแอปพลิเคชันระบบจัดการข้อมูลใน C" ฉันใช้ Rake กับ NLTK และเพิ่งลบเครื่องหมายหยุด + เครื่องหมายวรรคตอน แต่จากประโยคข้างต้นฉันไม่ต้องการคำเช่นการพัฒนาการติดตามบั๊กระบบการสร้างข้อมูล ฯลฯ ขอบคุณ
Khalid Usman

3
@KhalidUsman: เนื่องจากคุณได้ทำงานกับ NLTL แล้วให้ดูที่เครื่องมือการจดจำเอนทิตีที่มีชื่อโดยเฉพาะอย่างยิ่งส่วน "Chunking with Expressions" โดยทั่วไปคุณต้องการใช้พจนานุกรมคำหลัก (เช่น "ปี", "C" ฯลฯ ) และชุดของกฎอย่างง่าย (เช่น "มี" C "" หรือ "<number> ปี") เพื่อดึงหน่วยงานที่มีชื่อ ข้อความที่ไม่มีรูปแบบ
แฟน

7

นี่เป็นปัญหาที่ยุ่งยาก มีหลายวิธีในการจัดการกับมัน ฉันคิดว่าการดำเนินการต่อสามารถถือเป็นเอกสารกึ่งโครงสร้างได้ บางครั้งมันมีประโยชน์ที่จะมีโครงสร้างน้อยที่สุดในเอกสาร ฉันเชื่อว่าในประวัติย่อคุณจะเห็นข้อมูลตารางบางส่วน คุณอาจต้องการใช้คู่เหล่านี้เป็นค่าแอตทริบิวต์ ตัวอย่างเช่นคุณจะได้รับรายการคำศัพท์สำหรับแอตทริบิวต์ "Skill set"

แนวคิดหลักคือการกำหนดรายการวลีที่สำคัญเช่น "ทักษะ", "การศึกษา", "สิ่งพิมพ์" ฯลฯ ด้วยตนเองขั้นตอนต่อไปคือการแยกคำที่เกี่ยวข้องกับวลีสำคัญเหล่านี้ด้วยการใช้โครงสร้างในทางใดทางหนึ่ง (เช่น เป็นตาราง) หรือโดยการใช้คำศัพท์ใกล้เคียงกับวลีสำคัญเหล่านี้เช่นข้อเท็จจริงที่ว่าคำว่า "Java" นั้นอยู่ใกล้กับคำว่า "ทักษะ" อาจบ่งบอกว่าบุคคลนั้นมีความเชี่ยวชาญใน Java

หลังจากที่คุณแยกข้อมูลเหล่านี้แล้วขั้นตอนต่อไปอาจเป็นการสร้างเวกเตอร์ฟีเจอร์สำหรับวลีสำคัญเหล่านี้ จากนั้นคุณสามารถแสดงเอกสารเป็นเวกเตอร์ที่มีฟิลด์ต่างกัน (แต่ละอันมีวลีสำคัญ) ตัวอย่างเช่นพิจารณาสองต่อไปนี้การดำเนินการต่อตัวแทนที่มีสองสาขาคือโครงการและการศึกษา

Doc1: {โครงการ: (java, 3) (c, 4)}, {การศึกษา: (คอมพิวเตอร์, 2), (ฟิสิกส์, 1)}

Doc2: {โครงการ: (java, 3) (python, 2)}, {การศึกษา: (คณิตศาสตร์, 3), (คอมพิวเตอร์, 2)}

ในตัวอย่างข้างต้นฉันแสดงคำที่มีความถี่ แน่นอนในขณะที่แยกคำที่คุณต้องการในการหยุดและลบคำหยุด เป็นที่ชัดเจนจากตัวอย่างที่บุคคลที่มีประวัติย่อว่า Doc1 มีทักษะในภาษา C มากกว่าของ D2 การนำไปใช้อย่างชาญฉลาดมันง่ายมากที่จะแสดงเอกสารเป็นเวกเตอร์ฟิลด์ใน Lucene

ตอนนี้ขั้นตอนต่อไปคือการดึงรายการเรซูเม่ที่ได้รับการจัดอันดับตามข้อกำหนดของงาน ในความเป็นจริงมันค่อนข้างตรงไปตรงมาถ้าคุณแสดงแบบสอบถาม (specs งาน) เป็นเวกเตอร์ฟิลด์เช่นกัน คุณเพียงแค่ต้องดึงรายการอันดับของผู้สมัคร (ประวัติย่อ) โดยใช้ Lucene จากกลุ่มของเรซูเม่ที่จัดทำดัชนี


Algorithm-wise: คุณอยากแนะนำอะไร
user1769197

คุณหมายถึงอัลกอริทึมสำหรับคำนวณเวกเตอร์เรซูเม่ที่คล้ายกันมากที่สุดหรือไม่? คุณสามารถใช้อัลกอริธึมมาตรฐานใด ๆ เช่น BM25 หรือ Language Model ...
Debasis

ฉันไม่เคยได้ยินเกี่ยวกับอัลกอริทึมเหล่านี้เลย อัลกอริธึม NLP เหล่านี้หรือ ML algo ใช่ไหม
user1769197

นี่คือโมเดลการดึงข้อมูลมาตรฐาน ... โมเดลการดึงข้อมูลจะกำหนดวิธีการคำนวณความคล้ายคลึงกันระหว่างเอกสาร (ดำเนินการต่อในเคสของคุณ) และเคียวรี (งานในเคสของคุณ)
Debasis

ฉันไม่มีความรู้เกี่ยวกับการดึงข้อมูลคุณคิดว่าอัลกอริทึมการเรียนรู้ของเครื่องเช่นการรวมกลุ่ม / เพื่อนบ้านที่ใกล้ที่สุดจะใช้งานได้หรือไม่
1769197

7

ฉันทำงานกับไซต์งานออนไลน์และเราสร้างโซลูชันเพื่อแนะนำงานตามประวัติย่อ วิธีการของเราใช้ชื่องานของบุคคล (หรือตำแหน่งงานที่ต้องการหากเป็นนักเรียนและเป็นที่รู้จัก) พร้อมด้วยทักษะที่เราดึงออกมาจากประวัติย่อและตำแหน่งของพวกเขา (ซึ่งสำคัญมากสำหรับคนส่วนใหญ่) และค้นหางานที่ตรงกับงาน

ในแง่ของการจำแนกเอกสารฉันจะใช้วิธีการที่คล้ายกัน ฉันขอแนะนำให้คำนวณ tf idf matrix สำหรับแต่ละเรซูเม่ในรูปแบบถุงคำมาตรฐานโดยแยกเฉพาะตำแหน่งงานและทักษะของบุคคล (ซึ่งคุณจะต้องกำหนดรายการทักษะที่จะมองหา) และป้อนลงใน ML ขั้นตอนวิธี ฉันอยากจะแนะนำให้ลองใช้ knn และ SVM แบบหลังทำงานได้ดีกับข้อมูลข้อความมิติสูง Linear SVM มีแนวโน้มที่จะทำได้ดีกว่าที่ไม่ใช่เชิงเส้น (เช่นการใช้เมล็ด RBf) หากคุณมีผลลัพธ์ที่สมเหตุสมผลฉันจะเล่นด้วยการแยกคุณลักษณะโดยใช้ parser \ chunker ภาษาธรรมชาติและยังมีวลีที่สร้างขึ้นเองที่ตรงกับ regex


คุณยังใช้ SVM เมื่อคุณมี 3 คลาสขึ้นไปหรือไม่? และคุณลักษณะใดที่คุณต้องการแยกโดยใช้ตัวแยกวิเคราะห์ภาษาที่เป็นธรรมชาติ เพื่อจุดประสงค์อะไร ?
user1769197

คุณสามารถฝึกฝน n svm สำหรับคลาส n โดยใช้กลยุทธ์ vs vs rest SciKitLearn มีรหัสให้ทำโดยอัตโนมัติ ในทางเทคนิคคุณต้องการตัวแยกประเภท n-1 แต่ฉันพบว่าการทำงานแบบ n ทำได้ดี
Simon

@Simon คุณสามารถเขียนขั้นตอนที่สมบูรณ์สำหรับระบบแนะนำนี้ได้หรือไม่? ฉันมีประสบการณ์น้อย (ใช้วิทยานิพนธ์ MS) ใน ML แต่ใหม่ทั้งหมดในสาขา IR ตอนนี้ฉันกำลังทำงานกับระบบนี้และฉันเขียนขั้นตอนต่อไปนี้ 1. ใช้ NLTK เพื่อแยกคำหลัก 2. คำนวณคะแนนสำหรับคำหลักและวลี 3. Stemmer 4. การจัดหมวดหมู่ (งานที่ท้าทายที่สุด) และ 5. เมทริกซ์ความถี่ tf-idf หรือ BM25 algo ฉันกำลังใช้วิธีที่ถูกต้องหรือไม่? ขอบคุณ
Khalid Usman

@KhalidUsman ฉันไม่สามารถบอกคุณได้ว่ามันทำงานอย่างไรซึ่งอาจทำให้ฉันมีปัญหา ทางออกที่ง่ายที่สุดคือการใส่ข้อมูลลงใน Solr หรือ Elastic Search และใช้การแนะนำ MLT ของพวกเขา วิธีการที่ซับซ้อนมากขึ้นคือการแยกคำและวลีที่สำคัญดันเอกสารผ่าน LSA และทำ k-nn บนผลเวกเตอร์ จากนั้นคุณอาจต้องการใช้สัญญาณอื่น ๆ เช่นการกรองแบบร่วมมือกันและความนิยมโดยรวม
Simon

@Simon ขอบคุณสำหรับคำแนะนำของคุณ ฉันกำลังใช้วิธีที่ 2 ฉันได้แยกคีย์เวิร์ด / keyphrases โดยใช้ RAKE + NLTK และหลังจากนั้นฉันวางแผนที่จะใช้ tf-idf หรือ BM25 ฉันถูกไหม? คุณช่วยอธิบายเกี่ยวกับ KNN หน่อยได้ไหมฉันหมายถึงวิธีการใช้ KNN กับคำหลักฉันควรสร้างคำหลักเป็นคุณลักษณะหรือไม่ ขอบคุณ
Khalid Usman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.