登录
首页大数据时代使用NLP改进简历
使用NLP改进简历
2022-03-14
收藏

金融技术实施专家大卫·摩尔

招聘人员正在使用越来越复杂的软件和工具来扫描简历,并将其与张贴的工作职位和工作规格进行匹配。如果你的简历是通用的,或者工作说明模糊和/或通用,这些工具将对你不利。AI真的在反对你的工作申请,我不确定你是否知道或是否会接受它!但是让我演示一些技巧,可以帮助您平衡困难。当然,我们将使用NLP自然语言处理)、Python和一些Altair可视化。准备好反击了吗?

考虑到你对你在网上注意到的一个好职位感兴趣。还有多少人会看到同样的工作?和你有大致相同的经验和资历?你认为可能有多少申请人提出申请?会不会少于10个或者少于1000个?

此外,考虑到面试小组可能只有5个强有力的候选人。那么,如何从995份申请中筛选出5个强有力的候选人呢?这就是为什么我说你需要平衡胜算,否则就会被扔出杂草!

处理1,000份简历(CV)


我想,首先,你可以把这些简历分成3或5份。把它们打印出来,分配给人类读者。每个阅读器从他们的堆中提供一个选择。有5个读者,这是一堆200份简历--去挑选最好的一两份。阅读这些会花很长时间,最终可能只会产生一个答案。我们可以用Python在几分钟内阅读所有那些简历!

在Medium上阅读这篇文章“我如何使用NLP(Spacy)筛选数据科学简历”,发现只要两行代码就可以收集这1000份简历的文件名。

#Function to read resumes from the folder one by one
mypath='D:/NLP_Resume/Candidate Resume' 
onlyfiles = [os.path.join(mypath, f) for f in os.listdir(mypath) 
             if os.path.isfile(os.path.join(mypath, f))]


变量'onlyfiles'是一个Python列表,其中包含使用Python os库获得的所有简历的文件名。如果你研究了文章,你还会看到你的简历是如何根据关键词分析几乎自动地进行排名和淘汰的。既然我们正在努力提高几率,我们需要关注你想要的工作规格和你目前的简历。他们匹配吗?

简历与职位描述的匹配


为了提高胜算,我们需要扫描工作描述、简历,并衡量匹配程度。理想情况下,我们这样做,以便输出是有用的调整在游戏中为您。

阅读文件


因为这是你的简历,你可能有PDF或DOCX格式。Python模块可用于读取大多数数据格式。图1演示了如何读取已将内容保存到文本文件中的文档。


第一步总是打开文件并读取行。下面的步骤是从字符串列表转换为单个文本,并在此过程中进行一些清理。图1创建了变量'job content'和'cv content',它们表示一个包含所有文本的string对象。下一个代码片段展示了如何直接读取Word文档。

import docx2txt
resume = docx2txt.process("DAVID MOORE.docx")
text_resume = str(resume)


变量'text_resume'是一个string对象,保存简历中的所有文本,就像以前一样。也可以使用PYPDF2。

import PyPDF2


只需说,从业者有一系列的选项来阅读文档,将它们转换为干净的处理过的文本。这些文件可能很广泛,很难阅读,坦率地说,也很枯燥。你可以从总结开始。

处理文本


我喜欢Gensim并且经常使用它。

from gensim.summarization.summarizer import summarize
from gensim.summarization import keywords


我们通过读取一个Word文件创建了变量'RESUME_TEXT'。让我们对简历和职位发布做一个总结。

print(summarize(text_resume, ratio=0.2))


Summarizer.summarizer.summary将为您创建一个简洁的摘要。

summarize(jobContent, ratio=0.2)


现在你可以阅读工作角色和你现有简历的总体摘要了!您是否遗漏了摘要中突出显示的工作角色?细致入微的小细节可以帮助你推销自己。你的总结文件是否有意义,并显示出你的基本素质?

也许仅仅一个简明的总结是不够的。接下来,让我们来衡量一下你的简历和工作说明书有多相似。图2提供了代码。


广义地说,我们创建一个文本对象列表,然后创建一个sklearn CountVectorizer()类的实例。我们还引入了cosine_similarity度量,它帮助我们度量两个文档的相似性。'您的简历符合工作描述的69.44%'。听起来很棒,但我不会得意忘形。现在您可以阅读文档的摘要并获得相似度度量。几率在提高。

接下来,我们可以看看职位描述关键词,看看简历中哪些是匹配的。我们是否错过了几个关键字,可以加强匹配接近100%?现在去斯帕西。到目前为止,这是一段相当长的旅程。Gensim,sklearn,现在是Spacy!我希望你没有头晕!

from spacy.matcher import PhraseMatcher
matcher = PhraseMatcher(Spnlp.vocab)
from collections import Counter
from gensim.summarization import keywords


我们将使用spacy的PhraseMatcher特性来匹配工作描述和简历中的关键短语。Gensim关键字可以帮助提供匹配的短语。图3显示了如何运行匹配。


使用图3中的代码片段提供了一个匹配的关键字列表。图4显示了总结这些关键字匹配的方法。使用集合中的计数器字典。


“报告”一词包含在工作描述中,简历有3个点击量。哪些短语或关键字在招聘启事中,而不在简历中?我们能再加点吗?我使用Pandas来回答这个问题-您可以看到图5中的输出。


如果这是真的,那也很奇怪。文档级别的匹配率为69.44%,但看看简历上没有提到的一长串关键词。图6显示了所提到的关键字。


在现实中,与工作规范匹配的关键字很少,这导致我对69.44%的余弦相似度度量持怀疑态度。尽管如此,这种可能性还是在提高,因为我们可以在简历中看到职位说明书中没有的关键词。更少的关键字匹配意味着你更有可能被淘汰。查看缺失的关键字,你可以继续,加强简历,并重新运行分析。不过,只是在简历中加入关键词会有负面影响,你必须非常小心你的艺术。你可能通过了最初的自动筛选,但你会因为缺乏写作技能而被淘汰。我们确实需要对短语进行排名,并专注于工作规范中的基本主题或词汇。

接下来让我们看看排名短语。对于这个练习,我将使用我自己的NLP类和一些我以前使用过的方法。

from nlp import nlp as nlp
LangProcessor = nlp()
keywordsJob = LangProcessor.keywords(jobContent)
keywordsCV = LangProcessor.keywords(cvContent)


使用我自己的类,我从前面创建的job和Resume对象中恢复了排序短语。下面的代码片段为您提供了方法定义。我们现在使用rake模块来提取ranked_prasses和分数。

def keywords(self, text):
 keyword = {}
 self.rake.extract_keywords_from_text(text)
 keyword['ranked phrases'] = self.rake.get_ranked_phrases_with_scores()
 return keyword


图7提供了方法调用输出的说明。


“项目管理方法-项目管理”排在第31.2位,所以这是招聘中最关键的话题。简历中的关键短语也可以稍加改动就打印出来。

for item in keywordsCV['ranked phrases'][:10]:
 print (str(round(item[0],2)) + ' - ' + item[1] )


阅读简历和招聘启事中最重要的短语,我们可以问自己是否有匹配或相似的程度?我们当然可以运行一个序列来找出答案!下面的代码在职务公告和简历中的排名短语之间创建交叉引用。

sims = []
phrases = []
for key in keywordsJob['ranked phrases']:
 rec={}
 rec['importance'] = key[0]
 texts = key[1] sims=[]
 avg_sim=0
 for cvkey in keywordsCV['ranked phrases']:
  cvtext = cvkey[1]
  sims.append(fuzz.ratio(texts, cvtext))
  #sims.append(lev.ratio(texts.lower(),cvtext.lower()))
  #sims.append(jaccard_similarity(texts,cvtext)) count=0
 for s in sims:
 count=count+s
 avg_sim = count/len(sims)
 rec['similarity'] = avg_sim
 rec['text'] = texts
 phrases.append(rec)


注意,我们使用fuzzy-wuzzy作为匹配引擎。代码还有一个Levenshtein比率和JACCARD_SIMAGILE函数。图8展示了这可能是什么样子。


“重要性”变量是简历中的短语得分。“相似性”变量是Fuzzy-Wuzzy的比值得分。“项目管理方法”一词排在31.2位,但交叉引用被评分的简历短语平均得分仅为22.5位。虽然项目管理是这份工作的首要任务,但简历在不同的技术项目上得分更明显。通过执行类似的练习,您可以看到AI是如何对抗应用程序的。


图9显示了另一个视角。使用标记(单词)显示每个单词在工作描述中的重要性,而不是在简历中的点击量--文档中某个特定单词出现的次数越多,影响就越大。财务这个词在职位描述中的重要性不高,但在简历中的影响力很大。这是一个财务人员在找IT工作吗?文字可以出卖你与AI!

我敢肯定你现在已经拿到那张照片了。使用NLP工具和库可以帮助真正理解一个工作描述和衡量相对匹配。这当然不是强健或福音,但它确实倾向于甚至几率。你的话很重要,但你不能在简历中胡乱添加关键词。你真的得写一份强有力的简历,申请适合你的角色。文本处理和文本挖掘是一个很大的课题,我们只触及到可以做什么的表面。我发现文本挖掘和基于文本的机器学习模型非常准确。让我们看看使用牛郎星的一些视觉效果,然后总结。

牵牛星视觉


我最近经常使用牵牛星,所以Seaborn或Matplotlib更多。牵牛星中的语法正好能让我听懂。我做了三个视觉效果来帮助讨论--图10显示了关键字在简历中的重要性和影响力。使用颜色比例,我们可以看到像收养这样的词在简历中出现了两次,但在招聘公告中的优先级较低。


图11显示了在招聘公告和简历中找到的排序主题的交叉引用。最重要的短语是“项目管理…”,但它在简历中的排名中得分较低。


图12描绘了类似的词。财务在简历上被用了10次,但在招聘启事上却只字不提。项目一词会在简历中提到,也会出现在招聘公告中。


看着图表,在我看来简历和工作描述似乎不太匹配。很少的共享关键词和排名短语看起来很不一样。这就是让你的简历被杂草洗掉的原因!

结论


阅读这篇文章可能更像是一部大预算的“拍摄他们死的CGI好莱坞”电影。所有的大牌演员一般都出现在那些大片中。大型NLP库在本文中扮演了主要角色,我们甚至还客串了更多的名字,也许是更老、更成熟的名字,比如NLTK。我们使用了Gensim、Spacy、sklearn等库,并演示了它们的用法。我自己的类客串了一次,包装了NLTK、rake、textblob和一堆其他模块,所有这些都展示了对文本分析的见解,向您展示了如何与获得梦想工作的机会分开。

想要找到理想的工作,需要清晰而不懈地关注细节,仔细准备工作申请、简历和求职信。使用自然语言处理不会把你变成最好的候选人。那取决于你!但它可以提高你击败AI驱动的早期回合的机会。


数据分析咨询请扫描二维码

客服在线
立即咨询