آموزش پردازش زبان طبیعی پروژه محور — راهنمای کاربردی

۹۷۲ بازدید
آخرین به‌روزرسانی: ۱۲ اردیبهشت ۱۴۰۲
زمان مطالعه: ۷ دقیقه
آموزش پردازش زبان طبیعی پروژه محور — راهنمای کاربردی

«پردازش زبان طبیعی» (Natural Language Processing | NLP) از جمله مباحثی محسوب می‌شود که این روزها توجهات زیادی را به خود جلب کرده است. یکی از دلایل اصلی این امر، کاربردهای زیاد و متنوعی است که پردازش زبان طبیعی دارد. در آموزش مباحثی مانند «داده‌کاوی» (Data Mining)، پردازش زبان طبیعی و برنامه‌نویسی، استفاده از پروژه‌های عملی، به افزایش ضریب یادگیری کمک شایان توجهی می‌کند. به همین دلیل، در این مطلب با بهره‌گیری از یک پروژه جذاب و کاربردی، آموزش پردازش زبان طبیعی ارائه شده است.

آموزش پردازش زبان طبیعی با یک پروژه

ساخت رزومه، نیازمند دقت و هوشمندی کافی است. برخی از چالش‌ها و پرسش‌هایی که افراد ضمن ساختن رزومه خود با آن‌ها مواجه می‌شود عبارتند از:

  • آیا پیرامون پروژه‌هایی که پیش از این انجام داده‌ام به صورت تفضیلی اطلاعات ارائه کنم و یا به صورت مختصر و تیتروار به آن‌ها اشاره داشته باشم؟
  • مهارت‌های متعددی را در رزومه بنویسم و یا صرفا مهارت‌های کلیدی خودم را بیان کنم؟
  • آیا از زبان‌های برنامه‌نویسی متعدد در رزومه خود نام ببرم و یا فقط به چند مورد اشاره کنم؟
  • رزومه را در یک صفحه تنظیم کنم و یا تعداد بیشتری صفحه به بیان جزئیات اختصاص بدهم؟

این جنس از چالش‌ها برای اغلب افرادی که قصد ساختن رزومه دارند وجود دارد. از سوی دیگر، افرادی که قصد استخدام نیرو دارند نیز، گاهی با حجم انبوهی از رزومه‌ها مواجه می‌شوند که انتخاب رزومه‌های مناسب را جهت دعوت به مصاحبه دشوار می‌کند. دانشمندان داده نیز از این قاعده مستثنی نیستند. اما، تحلیلگران و «دانشمندان داده» (Data Scientists)، به شیوه خود به حل چنین مشکلاتی می‌پردازند. در این مطلب، پروژه‌ای تعریف شده که نشان می‌دهد، چگونه می‌توان با بهره‌گیری از علم داده، رزومه‌های حائز شرایط را از میزان حجم انبوه رزومه‌ها گزینش کرد.

«ونکات رمن» (Venkat Raman)، دانشمند داده‌ای است که این پروژه را طرح‌ریزی کرده و انجام داده است. رمن، دوستی دارد که مالک و مدیر یک شرکت مشاوره علم داده است. دوست رمن، اخیرا یک پروژه بسیار خوب جذب کرده بود و نیاز به استخدام دو دانشمند داده داشت. بنابراین، یک آگهی شغلی تنظیم کرده و آن را در لینکدین قرار داده بود. در همین راستا، نزدیک به ۲۰۰ رزومه دریافت می‌کند. طی یک جلسه حضوری که بین رمن و مالک شرکت (دوست رمن) برگزار می‌شود، مالک چنین می‌گوید: اگر راهی باشد که بهترین رزومه را از میان همه رزومه‌ها پیدا کنم، کارم با سرعت بسیار بیشتری پیش خواهد رفت. نویسنده مطلب که پیش از این روی چندین پروژه NLP کار کرده بود، تصمیم می‌گیرد که مشکل دوست خود را حل کند. بنابراین به او می گوید که امکان دارد بتواند با استفاده از روش‌های پردازش زبان طبیعی مشکل او را حتی اگر به صورت کامل نه، ولی تا حد زیادی، حل کند. در اینجا است که پروژه رمن آغاز می‌شود و او برای حل این مشکل به روش یک دانشمند داده، دست به کار می‌شود.

بیان دقیق نیازها

شرکت تحلیل داده، نیاز به یک کارشناس «یادگیری عمیق» (Deep Learning)‌ دارد که با دیگر الگوریتم‌های «یادگیری ماشین» (Machine Learning) نیز آشنایی داشته باشند. کاندید دیگر نیز باید بر «کلان داده» (Big Data | بنا بر تصویب فرهنگستان به آن در فارسی مَه‌داده می‌گویند) و روش‌ها و ابزارهای مهندسی داده‌ها از جمله «اسکالا»، AWS، «داکرز» (Dockers) و «کوبرنتز» (Kubernetes) تسلط داشته باشد.

رویکرد

هنگامی که رومن متوجه می‌شود که دوستش در کاندیداها به دنبال چه ویژگی‌هایی است، رویکردی را برای چگونگی حل این مساله طرح می‌کند. در ادامه، رویکرد رومن برای حل این مساله بیان شده است.

  • داشتن یک دیکشنری یا جدول که همه مجموعه مهارت‌ها را داشته باشد؛ در واقع، باید دیکشنری ساخته شود که کلماتی مانند «کِرَس» (keras)، «تنسورفلو» (tensorflow) و RNN در آن ثبت شود. سپس، موارد مذکور در ستونی با نام یادگیری عمیق قرار داده شوند.
  • داشتن یک الگوریتم پردازش زبان طبیعی که کل رزومه‌ها را «تجزیه» (Parse) کند و اساسا به دنبال کلمات منشن شده در دیکشنری یا جدول باشد.
  • گام بعدی شمارش وقوع کلمات در دسته‌های گوناگون است. برای مثال، چیزی مانند جدول زیر باید برای هر متقاضی کار ساخته شود.آموزش پردازش زبان طبیعی

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

پیاده‌سازی

اکنون که رویکرد مورد استفاده مشخص شد، مانع بعدی که باید بر آن غلبه کرد نحوه پیاده‌سازی روش بیان شده است.

پردازش زبان طبیعی

Spacy، کتابخانه‌ای است که می‌توان از آن برای تطبیق کلمه و عبارت استفاده کرد. در این کتابخانه، قابلیتی وجود دارد که به آن «Phrase Matcher» گفته می‌شود. در ادامه، از این قابلیت برای حل مساله موجود استفاده خواهد شد.

خواندن رزومه

بسته‌های گوناگونی وجود دارند که به خواندن رزومه‌ها کمک می‌کنند. خوشبختانه، همه رزومه‌هایی که شرکت دریافت کرده در قالب PDF هستند. بنابراین، می‌توان از بسته‌هایی مانند PDF-Mine یا PyPDF2 برای انجام این کار استفاده کرد. در این مطلب، از PyPDF2 استفاده شده است. در ادامه،‌ پیاده‌سازی روش بیان شده با استفاده از زبان برنامه‌نویسی پایتون و کتابخانه Matplotlib انجام شده است.

1#Resume Phrase Matcher code
2
3
4#importing all required libraries
5
6import PyPDF2
7import os
8from os import listdir
9from os.path import isfile, join
10from io import StringIO
11import pandas as pd
12from collections import Counter
13import en_core_web_sm
14nlp = en_core_web_sm.load()
15from spacy.matcher import PhraseMatcher
16
17#Function to read resumes from the folder one by one
18mypath='D:/NLP_Resume/Candidate Resume' #enter your path here where you saved the resumes
19onlyfiles = [os.path.join(mypath, f) for f in os.listdir(mypath) if os.path.isfile(os.path.join(mypath, f))]
20
21def pdfextract(file):
22    fileReader = PyPDF2.PdfFileReader(open(file,'rb'))
23    countpage = fileReader.getNumPages()
24    count = 0
25    text = []
26    while count < countpage:    
27        pageObj = fileReader.getPage(count)
28        count +=1
29        t = pageObj.extractText()
30        print (t)
31        text.append(t)
32    return text
33
34#function to read resume ends
35
36
37#function that does phrase matching and builds a candidate profile
38def create_profile(file):
39    text = pdfextract(file) 
40    text = str(text)
41    text = text.replace("\\n", "")
42    text = text.lower()
43    #below is the csv where we have all the keywords, you can customize your own
44    keyword_dict = pd.read_csv('D:/NLP_Resume/resume/template_new.csv')
45    stats_words = [nlp(text) for text in keyword_dict['Statistics'].dropna(axis = 0)]
46    NLP_words = [nlp(text) for text in keyword_dict['NLP'].dropna(axis = 0)]
47    ML_words = [nlp(text) for text in keyword_dict['Machine Learning'].dropna(axis = 0)]
48    DL_words = [nlp(text) for text in keyword_dict['Deep Learning'].dropna(axis = 0)]
49    R_words = [nlp(text) for text in keyword_dict['R Language'].dropna(axis = 0)]
50    python_words = [nlp(text) for text in keyword_dict['Python Language'].dropna(axis = 0)]
51    Data_Engineering_words = [nlp(text) for text in keyword_dict['Data Engineering'].dropna(axis = 0)]
52
53    matcher = PhraseMatcher(nlp.vocab)
54    matcher.add('Stats', None, *stats_words)
55    matcher.add('NLP', None, *NLP_words)
56    matcher.add('ML', None, *ML_words)
57    matcher.add('DL', None, *DL_words)
58    matcher.add('R', None, *R_words)
59    matcher.add('Python', None, *python_words)
60    matcher.add('DE', None, *Data_Engineering_words)
61    doc = nlp(text)
62    
63    d = []  
64    matches = matcher(doc)
65    for match_id, start, end in matches:
66        rule_id = nlp.vocab.strings[match_id]  # get the unicode ID, i.e. 'COLOR'
67        span = doc[start : end]  # get the matched slice of the doc
68        d.append((rule_id, span.text))      
69    keywords = "\n".join(f'{i[0]} {i[1]} ({j})' for i,j in Counter(d).items())
70    
71    ## convertimg string of keywords to dataframe
72    df = pd.read_csv(StringIO(keywords),names = ['Keywords_List'])
73    df1 = pd.DataFrame(df.Keywords_List.str.split(' ',1).tolist(),columns = ['Subject','Keyword'])
74    df2 = pd.DataFrame(df1.Keyword.str.split('(',1).tolist(),columns = ['Keyword', 'Count'])
75    df3 = pd.concat([df1['Subject'],df2['Keyword'], df2['Count']], axis =1) 
76    df3['Count'] = df3['Count'].apply(lambda x: x.rstrip(")"))
77    
78    base = os.path.basename(file)
79    filename = os.path.splitext(base)[0]
80       
81    name = filename.split('_')
82    name2 = name[0]
83    name2 = name2.lower()
84    ## converting str to dataframe
85    name3 = pd.read_csv(StringIO(name2),names = ['Candidate Name'])
86    
87    dataf = pd.concat([name3['Candidate Name'], df3['Subject'], df3['Keyword'], df3['Count']], axis = 1)
88    dataf['Candidate Name'].fillna(dataf['Candidate Name'].iloc[0], inplace = True)
89
90    return(dataf)
91        
92#function ends
93        
94#code to execute/call the above functions
95
96final_database=pd.DataFrame()
97i = 0 
98while i < len(onlyfiles):
99    file = onlyfiles[i]
100    dat = create_profile(file)
101    final_database = final_database.append(dat)
102    i +=1
103    print(final_database)
104
105    
106#code to count words under each category and visulaize it through Matplotlib
107
108final_database2 = final_database['Keyword'].groupby([final_database['Candidate Name'], final_database['Subject']]).count().unstack()
109final_database2.reset_index(inplace = True)
110final_database2.fillna(0,inplace=True)
111new_data = final_database2.iloc[:,1:]
112new_data.index = final_database2['Candidate Name']
113#execute the below line if you want to see the candidate profile in a csv format
114#sample2=new_data.to_csv('sample.csv')
115import matplotlib.pyplot as plt
116plt.rcParams.update({'font.size': 10})
117ax = new_data.plot.barh(title="Resume keywords by category", legend=False, figsize=(25,7), stacked=True)
118labels = []
119for j in new_data.columns:
120    for i in new_data.index:
121        label = str(j)+": " + str(new_data.loc[i][j])
122        labels.append(label)
123patches = ax.patches
124for label, rect in zip(labels, patches):
125    width = rect.get_width()
126    if width > 0:
127        x = rect.get_x()
128        y = rect.get_y()
129        height = rect.get_height()
130        ax.text(x + width/2., y + height/2., label, ha='center', va='center')
131plt.show()

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

فایل CSV کلیدواژه‌ها

فایل CSV کلیدواژه‌ها در خط ۴۴ کد، با عنوان «emplate_new.csv» ارجاع داده شده است. هر سازمانی می‌تواند آن را با پایگاه داده اختصاصی خود جایگزین کند (و تغییرات مورد نیاز را در کد ایجاد کند) اما برای راحتی بیشتر در اینجا از فایل CSV ساخته شده در اکسل استفاده شده است.

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

آموزش پردازش زبان طبیعی
برای مشاهده نسخه کامل تصویر، روی آن کلیک کنید.

جدول کلیدواژه‌ها

در خط ۱۱۴ کد، خطی اجرا می‌شود که فایل CSV را تولید می‌کند. این فایل CSV تعداد کلیدواژه‌های محاسبه شده برای هر کاندید را مشخص می‌کند (نام واقعی کاندیدها در اینجا پوشانده شده است).

آموزش پردازش زبان طبیعی

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

آموزش پردازش زبان طبیعی
برای مشاهده تصویر در ابعاد کامل روی آن کلیک کنید.

از نمودار چنین به نظر می‌رسد که Dom Cobb و Fischer بیشترین شباهت را به کارشناس مورد نظر مدیر شرکت دارند و زمینه فعالیت سایر افراد عمومی‌تر است.

آیا این رویکرد موثر است؟

مدیر شرکت با اجرای این کد، موفق به انتخاب ۱۵ رزومه از میان ۲۰۰ رزومه شده است. در مصاحبه‌ها مشخص شده که انتخاب‌های حاصل از اجرای این پروژه، گزینه‌های مناسبی بوده‌اند. انجام چنین کاری بدون بهره‌گیری از پردازش زبان طبیعی و کد پایتون، کاری بسیار زمان‌بر خواهد بود.

دسته‌بندی و تطبیق عبارت

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

بصری‌سازی داده‌ها

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

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

نحوه استفاده از کد

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

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
kdnuggets
نظر شما چیست؟

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