Tôi nên sử dụng thuật toán nào để thực hiện phân loại công việc dựa trên dữ liệu sơ yếu lý lịch?


28

Lưu ý rằng tôi đang làm mọi thứ trong R.

Vấn đề diễn ra như sau:

Về cơ bản, tôi có một danh sách các sơ yếu lý lịch (CV). Một số ứng viên sẽ có kinh nghiệm làm việc trước đây và một số thì không. Mục tiêu ở đây là: dựa trên văn bản trên CV của họ, tôi muốn phân loại chúng thành các lĩnh vực công việc khác nhau. Tôi đặc biệt trong những trường hợp đó, trong đó các ứng viên không có kinh nghiệm / là sinh viên và tôi muốn đưa ra dự đoán để phân loại ngành nghề nào mà ứng viên này sẽ thuộc về sau khi tốt nghiệp.

Câu 1: Tôi biết các thuật toán học máy. Tuy nhiên, tôi chưa bao giờ làm NLP trước đây. Tôi đã xem qua phân bổ Dirichlet tiềm ẩn trên internet. Tuy nhiên, tôi không chắc đây có phải là cách tiếp cận tốt nhất để giải quyết vấn đề của tôi không.

Ý tưởng ban đầu của tôi: làm cho điều này trở thành một vấn đề học tập có giám sát . Giả sử chúng tôi đã có một lượng lớn dữ liệu được dán nhãn, nghĩa là chúng tôi đã gắn nhãn chính xác cho các lĩnh vực công việc cho một danh sách các ứng cử viên. Chúng tôi đào tạo mô hình bằng các thuật toán ML (tức là hàng xóm gần nhất ...) và cung cấp dữ liệu không ghi nhãn đó, những ứng viên không có kinh nghiệm làm việc / là sinh viên và cố gắng dự đoán họ sẽ thuộc ngành nghề nào.

Cập nhật Câu hỏi 2: Có nên tạo một tệp văn bản bằng cách trích xuất mọi thứ trong sơ yếu lý lịch và in các dữ liệu này ra trong tệp văn bản để mỗi sơ yếu lý lịch được liên kết với một tệp văn bản chứa các chuỗi không có cấu trúc, sau đó chúng tôi áp dụng các kỹ thuật khai thác văn bản cho các tệp văn bản và làm cho dữ liệu trở nên có cấu trúc hoặc thậm chí để tạo ra một ma trận tần số của các thuật ngữ được sử dụng trong các tệp văn bản? Ví dụ: tệp văn bản có thể trông giống như thế này:

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

Đây là những gì tôi có nghĩa là 'không cấu trúc', nghĩa là thu gọn mọi thứ thành một chuỗi dòng duy nhất.

Cách tiếp cận này có sai không? Xin hãy sửa tôi nếu bạn nghĩ cách tiếp cận của tôi là sai.

Câu 3: Phần khó là: làm thế nào để xác định và trích xuất các từ khóa ? Sử dụng tmgói trong R? Thuật toán tm dựa trên gói nào? Tôi có nên sử dụng thuật toán NLP? Nếu có, tôi nên xem xét các thuật toán nào? Xin vui lòng chỉ cho tôi một số tài nguyên tốt để xem xét là tốt.

Bất cứ ý tưởng sẽ là tuyệt vời.

Câu trả lời:


14

Kiểm tra liên kết này .

Tại đây, họ sẽ đưa bạn qua việc tải văn bản phi cấu trúc để tạo một wordcloud. Bạn có thể điều chỉnh chiến lược này và thay vì tạo một wordcloud, bạn có thể tạo một ma trận tần số của các thuật ngữ được sử dụng. Ý tưởng là lấy văn bản phi cấu trúc và cấu trúc nó bằng cách nào đó. Bạn thay đổi mọi thứ thành chữ thường (hoặc chữ hoa), xóa các từ dừng và tìm các thuật ngữ thường xuyên cho từng chức năng công việc, thông qua Ma trận thuật ngữ tài liệu. Bạn cũng có tùy chọn bắt nguồn từ. Nếu bạn phát sinh từ, bạn sẽ có thể phát hiện các dạng từ khác nhau dưới cùng một từ. Ví dụ: 'lập trình' và 'lập trình' có thể được bắt nguồn từ 'chương trình'. Bạn có thể có thể thêm sự xuất hiện của các thuật ngữ thường xuyên này như một tính năng có trọng số trong đào tạo mô hình ML của bạn.

Bạn cũng có thể điều chỉnh từ này thành các cụm từ thường xuyên, tìm các nhóm phổ biến gồm 2-3 từ cho mỗi chức năng công việc.

Thí dụ:

1) Tải thư viện và xây dựng dữ liệu mẫu

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) Bây giờ chúng tôi làm một số cấu trúc văn bản. Tôi tích cực có những cách nhanh hơn / ngắn hơn để làm như sau.

# 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) Tạo một nguồn văn bản và ma trận thuật ngữ tài liệu.

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

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

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

Bây giờ chúng ta có ma trận tần số, jobFreq, đó là ma trận (3 x x), 3 mục nhập và X số từ.

Bạn đi đâu từ đây là tùy bạn. Bạn chỉ có thể giữ các từ cụ thể (phổ biến hơn) và sử dụng chúng làm các tính năng trong mô hình của mình. Một cách khác là giữ cho nó đơn giản và có một tỷ lệ phần trăm các từ được sử dụng trong mỗi mô tả công việc, nói rằng "java" sẽ có 80% xuất hiện trong 'kỹ sư phần mềm' và chỉ 50% xuất hiện trong 'đảm bảo chất lượng'.

Bây giờ là lúc để tìm kiếm lý do tại sao 'đảm bảo' có 1 'r' và 'xảy ra' có 2 'r'.


Tôi rất thích xem ví dụ của bạn.
dùng1769197

Cập nhật với ví dụ nhanh.
nfmcclure

11

Chỉ cần trích xuất từ khóa và đào tạo một phân loại về chúng. Đó là tất cả, thực sự.

Hầu hết các văn bản trong CV không thực sự liên quan đến kỹ năng. Ví dụ, hãy xem xét câu "Tôi có kinh nghiệm và hiệu quả cao trong Java". Ở đây chỉ có 1 trong 7 từ là một tên kỹ năng, phần còn lại chỉ là một tiếng ồn sẽ làm giảm độ chính xác phân loại của bạn.

Hầu hết các CV không thực sự có cấu trúc. Hoặc cấu trúc quá tự do. Hoặc sử dụng tên bất thường cho các phần. Hoặc các định dạng tệp không bảo tồn cấu trúc khi dịch sang văn bản. Tôi có kinh nghiệm trích xuất ngày, thời gian, tên, địa chỉ và thậm chí mọi người có ý định từ văn bản phi cấu trúc, nhưng không phải là một danh sách kỹ năng (hoặc trường đại học hoặc bất cứ điều gì), thậm chí không chặt chẽ.

Vì vậy, chỉ cần token hóa (và có thể là gốc ) CV của bạn, chỉ chọn các từ trong danh sách được xác định trước (bạn có thể sử dụng LinkedIn hoặc một cái gì đó tương tự để lấy danh sách này), tạo một vectơ đặc trưng và thử một vài phân loại (giả sử, SVM và Naive Bayes) .

(Lưu ý: Tôi đã sử dụng một cách tiếp cận tương tự để phân loại hồ sơ LinkedIn thành hơn 50 lớp với độ chính xác> 90%, vì vậy tôi khá chắc chắn rằng việc triển khai ngây thơ sẽ hoạt động tốt.)


Giả sử tôi đang phân tích dữ liệu được liên kết, bạn có nghĩ rằng tôi nên hợp nhất kinh nghiệm làm việc trước đây, khuyến nghị giáo dục và kỹ năng của một hồ sơ vào một tệp văn bản và trích xuất từ ​​khóa không?
dùng1769197

LinkedIn hiện có các thẻ kỹ năng mà mọi người tự gán cho mình và những người dùng khác có thể xác nhận, vì vậy về cơ bản không cần phải trích xuất từ ​​khóa theo cách thủ công. Nhưng trong trường hợp dữ liệu ít cấu trúc - có, có thể hữu ích để hợp nhất mọi thứ và sau đó lấy từ khóa. Tuy nhiên, hãy nhớ quy tắc chính: hãy thử nó . Lý thuyết là tốt, nhưng chỉ những thí nghiệm thực tế với các phương pháp khác nhau mới tiết lộ điều tốt nhất.

@ffriend, làm thế nào để chúng tôi có được danh sách từ khóa đó?
NG_21

1
@ffriend Cách tốt nhất để trích xuất "kinh nghiệm" = '5 năm', "Ngôn ngữ" = 'C' từ câu sau đây là gì. "Tôi đã dành 5 năm để phát triển các hệ thống theo dõi lỗi và tạo các ứng dụng hệ thống quản lý dữ liệu trong C". Tôi đã sử dụng Rake với NLTK và nó chỉ xóa các từ dừng + dấu chấm câu, nhưng từ câu trên tôi không cần các từ như phát triển, theo dõi lỗi, hệ thống, tạo, dữ liệu, v.v ... Cảm ơn
Khalid Usman

3
@KhalidUsman: vì bạn đã làm việc với NLTL, hãy xem các công cụ nhận dạng thực thể được đặt tên , đặc biệt là phần "Chunking với biểu thức chính quy". Nói chung, bạn sẽ muốn sử dụng từ điển từ khóa (ví dụ: "năm", "C", v.v.) và bộ quy tắc đơn giản (như "chứa 'C'" hoặc "<number> năm") để trích xuất các thực thể có tên trong một văn bản dạng tự do.

7

Đây là một vấn đề khó khăn. Có nhiều cách để xử lý nó. Tôi đoán, sơ yếu lý lịch có thể được coi là tài liệu bán cấu trúc. Đôi khi, có lợi khi có một số cấu trúc tối thiểu trong các tài liệu. Tôi tin rằng, trong sơ yếu lý lịch bạn sẽ thấy một số dữ liệu dạng bảng. Bạn có thể muốn coi đây là các cặp giá trị thuộc tính. Ví dụ: bạn sẽ nhận được một danh sách các thuật ngữ cho thuộc tính "Bộ kỹ năng".

Ý tưởng chính là cấu hình thủ công một danh sách các cụm từ chính như "kỹ năng", "giáo dục", "xuất bản", vv Bước tiếp theo là trích xuất các thuật ngữ liên quan đến các cụm từ chính này bằng cách khai thác cấu trúc theo cách nào đó (chẳng hạn dưới dạng bảng) hoặc bằng cách sử dụng sự gần gũi của các thuật ngữ xung quanh các cụm từ chính này, ví dụ thực tế là từ "Java" gần với thuật ngữ "kỹ năng" có thể chỉ ra rằng người đó có kỹ năng về Java.

Sau khi bạn trích xuất những thông tin này, bước tiếp theo có thể là xây dựng một vectơ đặc trưng cho mỗi cụm từ chính này. Sau đó, bạn có thể biểu diễn một tài liệu dưới dạng một vectơ với các trường khác nhau (mỗi trường cho một cụm từ chính). Ví dụ, hãy xem xét hai hồ sơ sau đây được đại diện với hai lĩnh vực, đó là dự ángiáo dục .

Doc1: {project: (java, 3) (c, 4)}, {giáo dục: (máy tính, 2), (vật lý, 1)}

Tài liệu 2: {dự án: (java, 3) (python, 2)}, {giáo dục: (toán học, 3), (máy tính, 2)}

Trong ví dụ trên, tôi hiển thị một thuật ngữ với tần số. Tất nhiên, trong khi trích xuất các thuật ngữ bạn cần phải bắt nguồn và loại bỏ các từ dừng. Rõ ràng từ các ví dụ cho thấy người có sơ yếu lý lịch là Doc1 có nhiều kỹ năng về C hơn so với D2. Thực hiện khôn ngoan, rất dễ dàng để biểu diễn các tài liệu dưới dạng vectơ trường trong Lucene.

Bây giờ, bước tiếp theo là lấy một danh sách các sơ yếu lý lịch được xếp hạng cho một đặc tả công việc. Trên thực tế, điều đó khá đơn giản nếu bạn đại diện cho các truy vấn (thông số công việc) dưới dạng vectơ trường. Bạn chỉ cần truy xuất một danh sách các ứng cử viên (sơ yếu lý lịch) được xếp hạng bằng cách sử dụng Lucene từ một bộ hồ sơ được lập chỉ mục.


Thuật toán-khôn ngoan: bạn muốn giới thiệu cái gì?
dùng1769197

bạn có nghĩa là thuật toán để tính toán các vectơ tiếp tục tương tự nhất được đưa ra một vectơ công việc truy vấn? bạn có thể sử dụng bất kỳ thuật toán tiêu chuẩn nào, chẳng hạn như BM25 hoặc Mô hình ngôn ngữ ...
Gỡ lỗi

Tôi chưa bao giờ nghe nói về các thuật toán này cả. Đây là những thuật toán NLP hay ML algo?
dùng1769197

đây là các mô hình truy xuất tiêu chuẩn ... một mô hình truy xuất xác định cách tính độ tương tự giữa một tài liệu (tiếp tục trong trường hợp của bạn) và một truy vấn (công việc trong trường hợp của bạn).
Khởi nghiệp

Tôi không có kiến ​​thức về truy xuất thông tin, bạn có nghĩ rằng các thuật toán học máy như phân cụm / hàng xóm gần nhất cũng sẽ hoạt động trong trường hợp của tôi không?
dùng1769197

7

Tôi làm việc cho một trang web việc làm trực tuyến và chúng tôi xây dựng các giải pháp để giới thiệu việc làm dựa trên sơ yếu lý lịch. Cách tiếp cận của chúng tôi là chức danh công việc của một người (hoặc chức danh công việc mong muốn nếu là sinh viên và được biết đến), cùng với các kỹ năng chúng tôi trích xuất từ ​​sơ yếu lý lịch của họ và vị trí của họ (rất quan trọng đối với hầu hết mọi người) và tìm thấy sự phù hợp với công việc dựa trên điều đó.

về mặt phân loại tài liệu, tôi sẽ có một cách tiếp cận tương tự. Tôi sẽ khuyên bạn nên tính toán một ma trận idf tf cho mỗi sơ yếu lý lịch như một mô hình từ chuẩn, rút ​​ra chỉ tiêu đề và kỹ năng công việc của người đó (mà bạn sẽ cần xác định danh sách các kỹ năng cần tìm) và đưa nó vào ML thuật toán. Tôi khuyên bạn nên thử knn và một SVM, cái sau hoạt động rất tốt với dữ liệu văn bản có chiều cao. Các SVM tuyến tính có xu hướng làm tốt hơn phi tuyến tính (ví dụ: sử dụng hạt nhân RBf). Nếu bạn có kết quả hợp lý, thì tôi sẽ chơi với các tính năng trích xuất bằng trình phân tích cú pháp ngôn ngữ tự nhiên \ chunker và một số cụm từ được xây dựng tùy chỉnh phù hợp với regex.


Bạn vẫn sử dụng SVM khi bạn có 3 lớp trở lên? Và những tính năng nào bạn muốn trích xuất bằng trình phân tích cú pháp ngôn ngữ tự nhiên? Cho mục đích gì ?
dùng1769197

Bạn có thể đào tạo n svm's cho n lớp bằng chiến lược một so với chiến lược còn lại. SciKitLearn có mã để làm điều đó tự động. Về mặt kỹ thuật, bạn cần phân loại n-1, nhưng tôi đã thấy có n hoạt động tốt hơn.
Simon

@Simon Bạn có thể viết các bước đầy đủ cho hệ thống khuyến nghị này không? Tôi có ít kinh nghiệm (thực hiện luận án MS) trong ML, nhưng hoàn toàn mới trong lĩnh vực IR. Bây giờ tôi đang làm việc trên hệ thống này và tôi đã viết các bước sau. 1. Sử dụng NLTK để trích xuất từ ​​khóa, 2. Tính điểm cho từ khóa và cụm từ, 3. Trình gốc, 4. Phân loại (nhiệm vụ khó khăn nhất) và 5. Ma trận tần số, tf-idf hoặc BM25. Tôi có đúng cách thực hiện không? Cảm ơn
Khalid Usman

@KhalidUsman Tôi không thể cho bạn biết chính xác cách thức hoạt động của nó, điều đó có thể khiến tôi gặp rắc rối. Giải pháp đơn giản nhất là đưa dữ liệu vào Solr hoặc Tìm kiếm đàn hồi và sử dụng các triển khai đề xuất MLT của họ. Một cách tiếp cận tinh vi hơn là trích xuất các từ và cụm từ chính, đẩy các tài liệu thông qua LSA và thực hiện k-nn trên các vectơ kết quả. Sau đó, bạn có thể muốn sử dụng các tín hiệu khác như Lọc cộng tác và mức độ phổ biến.
Simon

@Simon, cảm ơn sự hướng dẫn của bạn. Tôi đang áp dụng cách thứ 2, tôi đã trích xuất từ ​​khóa / cụm từ khóa bằng cách sử dụng RAKE + NLTK và sau đó tôi đã lên kế hoạch áp dụng tf-idf hoặc BM25. Tôi có đúng không Bạn có thể vui lòng xây dựng cách KNN một chút không, ý tôi là làm thế nào để áp dụng knn cho các từ khóa, tôi có nên tạo từ khóa như một tính năng không? Cảm ơn
Khalid Usman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.