غربالگری رزومه با پایتون

پروژه یادگیری ماشین برای غربالگری رزومه با پایتون

کمپانی‌ها و شرکت‌ها معمولاً برای هر آگهی استخدام، هزاران رزومه مختلف دریافت می کنن و بعد از بررسی و غربالگری رزومه‌ها توسط مسئولان مربوطه، بهترین اشخاص واجد شرایط استخدام میشن. در این مقاله، یک پروژه یادگیری ماشین معرفی میشه که هدف اصلی از پیاده‌سازی اون، غربالگری رزومه با زبان برنامه‌نویسی پایتون هست.

غربالگری رزومه چیست؟

استخدام افراد مستعد مناسب برای همه مشاغل یک چالش محسوب میشه. دلایل زیر میتونن باعث بزرگ‌تر شدن این چالش بشن و دلیل اصلی آن حجم بالای متقاضیان هست:

  • نیاز به استخدام افراد زیاد
  • در حال رشد بودن جایگاه شغلی موردنظر در بازار
  • بالا بودن نرخ ترک یا استعفا از شغل موردنظر

در سازمان‌های خدماتی معمولی، متخصصانی استخدام میشن که از لحاظ مهارت‌های فنی و تجربه در زمینه کسب‌وکار موردنظر تمام شرایط لازم را داشته باشن. این افراد برای حل مشکلات مشتریان به پروژه‌های مختلف اختصاص داده میشن. انتخاب بهترین استعداد از بین متقاضیان به‌عنوان غربالگری رزومه شناخته میشه.

معمولاً شرکت‌های بزرگ زمان کافی برای بررسی تک تک رزومه‌ها رو ندارن، بنابراین از الگوریتم‌های یادگیری ماشین برای غربالگری رزومه استفاده میکنن.

پروژه یادگیری ماشین برای غربالگری رزومه با پایتون

در این بخش، وارد مرحله پیاده‌سازی این پروژه جالب میشیم. این کار با ایمپورت کردن کتابخانه‌های لازم و دیتاست شروع میشه:

(برای دانلود دیتاست، روی این لینک کلیک کنید.)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from sklearn.naive_bayes import MultinomialNB
from sklearn.multiclass import OneVsRestClassifier
from sklearn import metrics
from sklearn.metrics import accuracy_score
from pandas.plotting import scatter_matrix
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics

resumeDataSet = pd.read_csv('UpdatedResumeDataSet.csv' ,encoding='utf-8')
resumeDataSet['cleaned_resume'] = ''
resumeDataSet.head()

حالا بیایید یه نگاهی بندازیم به دسته‌بندی‌های رزومه موجود در این دیتاست:

print ("Displaying the distinct categories of resume -")
print (resumeDataSet['Category'].unique())

خب در این بخش هم یه نگاهی میندازیم به دسته‌بندی ها و تعداد رکوردهایی که به هر کدوم از اونها تعلق دارن:

print ("Displaying the distinct categories of resume and the number of records belonging to each category -")
print (resumeDataSet['Category'].value_counts())

رسم نمودار برای تعداد رکورد مربوط به هر کدوم از دسته‌بندی ها میتونه درک میزان تقاضا برای هر کدوم از دسته ها رو راحت تر کنه:

import seaborn as sns
plt.figure(figsize=(15,15))
plt.xticks(rotation=90)
sns.countplot(y="Category", data=resumeDataSet)

Resume Categories

حالا بیاید توزیع دسته‌بندی ها رو به صورت مصور نشون بدیم:

from matplotlib.gridspec import GridSpec
targetCounts = resumeDataSet['Category'].value_counts()
targetLabels  = resumeDataSet['Category'].unique()
# Make square figures and axes
plt.figure(1, figsize=(25,25))
the_grid = GridSpec(2, 2)


cmap = plt.get_cmap('coolwarm')
colors = [cmap(i) for i in np.linspace(0, 1, 3)]
plt.subplot(the_grid[0, 1], aspect=1, title='CATEGORY DISTRIBUTION')

source_pie = plt.pie(targetCounts, labels=targetLabels, autopct='%1.1f%%', shadow=True, colors=colors)
plt.show()

Resume Distribution

در این بخش یه تابع کمکی ایجاد میشه که URL ها، تگ ها، هشتگ ها، حروف خاص و علائم نگارشی رو حذف کنه:

import re
def cleanResume(resumeText):
    resumeText = re.sub('http\S+\s*', ' ', resumeText)  # remove URLs
    resumeText = re.sub('RT|cc', ' ', resumeText)  # remove RT and cc
    resumeText = re.sub('#\S+', '', resumeText)  # remove hashtags
    resumeText = re.sub('@\S+', '  ', resumeText)  # remove mentions
    resumeText = re.sub('[%s]' % re.escape("""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""), ' ', resumeText)  # remove punctuations
    resumeText = re.sub(r'[^\x00-\x7f]',r' ', resumeText) 
    resumeText = re.sub('\s+', ' ', resumeText)  # remove extra whitespace
    return resumeText
    
resumeDataSet['cleaned_resume'] = resumeDataSet.Resume.apply(lambda x: cleanResume(x))

بعد از اجرای این تابع، دیتاست حالت تمیزتر و مرتب‌تری پیدا میکنه. کار بعدی اینه که ابر کلمات یا Wordcloud را نمایش بدیم. یک Wordcloud کلماتی که بیشتر از بقیه در یه ستون خاص از دیتاست تکرار شدن را نشون میده البته همه کلمات رو نشون میده ولی سایز کلمات پرتکرار بزرگ‌تر از بقیه هست.

import nltk
from nltk.corpus import stopwords
import string
from wordcloud import WordCloud

oneSetOfStopWords = set(stopwords.words('english')+['``',"''"])
totalWords =[]
Sentences = resumeDataSet['Resume'].values
cleanedSentences = ""
for i in range(0,160):
    cleanedText = cleanResume(Sentences[i])
    cleanedSentences += cleanedText
    requiredWords = nltk.word_tokenize(cleanedText)
    for word in requiredWords:
        if word not in oneSetOfStopWords and word not in string.punctuation:
            totalWords.append(word)
    
wordfreqdist = nltk.FreqDist(totalWords)
mostcommon = wordfreqdist.most_common(50)
print(mostcommon)

wc = WordCloud().generate(cleanedSentences)
plt.figure(figsize=(15,15))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

resume screening

حالا این کلمات رو به مقادیر دسته‌ای تبدیل می‌کنیم:

from sklearn.preprocessing import LabelEncoder

var_mod = ['Category']
le = LabelEncoder()
for i in var_mod:
    resumeDataSet[i] = le.fit_transform(resumeDataSet[i])

آموزش مدل یادگیری ماشین برای غربالگری رزومه

قدم بعدی در این پروژه، آموزش یک مدل برای غربالگری رزومه هست. اینجا از مدل طبقه‌بندی کننده KNeighborsClassifier استفاده می‌کنیم. اول باید دیتاست رو به دیتاست آموزش و تست تقسیم کنیم:

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.sparse import hstack

requiredText = resumeDataSet['cleaned_resume'].values
requiredTarget = resumeDataSet['Category'].values

word_vectorizer = TfidfVectorizer(
    sublinear_tf=True,
    stop_words='english',
    max_features=1500)
word_vectorizer.fit(requiredText)
WordFeatures = word_vectorizer.transform(requiredText)

print ("Feature completed .....")

X_train,X_test,y_train,y_test = train_test_split(WordFeatures,requiredTarget,random_state=0, test_size=0.2)
print(X_train.shape)
print(X_test.shape)

در کد بالا از TfidfVectorizer برای مرتب‌سازی و وزن دهی به کلمات استفاده شده. این وزن دهی بر اساس تعداد تکرار هر یک از کلمات انجام میشه.

تفکیک دیتاست با استفاده از train_test_split انجام میشه. با توجه به کد بالا، ۲۰ درصد از دیتاست به‌عنوان داده تست و ۸۰ درصد بقیه به‌عنوان داده آموزشی استفاده میشن.

حالا نوبت میرسه به آموزش مدل و چاپ گزارش طبقه‌بندی.

clf = OneVsRestClassifier(KNeighborsClassifier())
clf.fit(X_train, y_train)
prediction = clf.predict(X_test)
print('Accuracy of KNeighbors Classifier on training set: {:.2f}'.format(clf.score(X_train, y_train)))
print('Accuracy of KNeighbors Classifier on test set: {:.2f}'.format(clf.score(X_test, y_test)))

print("\n Classification report for classifier %s:\n%s\n" % (clf, metrics.classification_report(y_test, prediction)))

Accuracy of KNeighbors Classifier on test set: 0.99

 Classification report for classifier OneVsRestClassifier(estimator=KNeighborsClassifier(algorithm=’auto’, leaf_size=30, metric=’minkowski’,

           ,metric_params=None, n_jobs=None, n_neighbors=5, p=2

         ,(‘weights=’uniform

        :(n_jobs=None

              precision    recall  f1-score   support

           0       1.00      1.00      1.00         3

           1       1.00      1.00      1.00         3

           2       1.00      0.80      0.89         5

           3       1.00      1.00      1.00         9

           4       1.00      1.00      1.00         6

           5       0.83      1.00      0.91         5

           6       1.00      1.00      1.00         9

           7       1.00      1.00      1.00         7

           8       1.00      0.91      0.95        11

           9       1.00      1.00      1.00         9

          10       1.00      1.00      1.00         8

          11       0.90      1.00      0.95         9

          12       1.00      1.00      1.00         5

          13       1.00      1.00      1.00         9

          14       1.00      1.00      1.00         7

          15       1.00      1.00      1.00        19

          16       1.00      1.00      1.00         3

          17       1.00      1.00      1.00         4

          18       1.00      1.00      1.00         5

          19       1.00      1.00      1.00         6

          20       1.00      1.00      1.00        11

          21       1.00      1.00      1.00         4

          22       1.00      1.00      1.00        13

          23       1.00      1.00      1.00        15

          24       1.00      1.00      1.00         8

   micro avg       0.99      0.99      0.99       193

   macro avg       0.99      0.99      0.99       193

weighted avg       0.99      0.99      0.99       193

بعد از فیت داده های تست و آموزش، آموزش مدل انجام میشه. بعد از اون پیش‌بینی داده های تست با استفاده از predict انجام میشه.

دقت مدل با تقسیم تعداد پیش‌بینی های درست بر تعداد کل پیش‌بینی ها محاسبه میشه. این دقت یکی از معیارهای ارزیابی عملکرد مدل هست. با توجه به خروجی، می‌بینیم که دقت مدل ۰.۹۹ شده و این میزان دقت نشان‌دهنده کارایی بالای مدل هست.

خب در این بخش با نحوه آموزش یک مدل برای غربالگری رزومه آشنا شدید. امیدواریم که از این پست آموزشی لذت برده باشید و یادگیری غربالگری رزومه با زبان پایتون برای شما مفید واقع بشه.

برای هرگونه سوال در زمینه آموزش ها فقط کافیه روی لینک واتساپ یا تلگرام (در زیر همین پست) کلیک کنید. یا با شماره تماس بالای صفحه سایت تماس بگیرید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...