影刀RPA 自动化简历筛选系统:HR提效实战
影刀RPA 自动化简历筛选系统HR提效实战作者林焱写在前面招聘旺季HR每天要看几百份简历光靠人工筛选效率极低。影刀可以帮HR搭一套自动简历筛选系统批量解析PDF/Word简历 → 按岗位要求评分 → 自动分类 → 生成候选人汇总表把80%的初筛工作交给自动化。店群矩阵自动化突破运营极限temu店群自动化报活动案例一、简历解析从PDF/Word提取信息importosimportreimportjsonimportpdfplumber# pip install pdfplumberfromdocximportDocument# pip install python-docxfrompathlibimportPathimportpandasaspddefextract_text_from_pdf(pdf_path):从PDF简历提取文字texttry:withpdfplumber.open(pdf_path)aspdf:forpageinpdf.pages:page_textpage.extract_text()ifpage_text:textpage_text\nexceptExceptionase:print(fPDF解析失败{pdf_path}-{e})returntextdefextract_text_from_docx(docx_path):从Word简历提取文字texttry:docDocument(docx_path)forparaindoc.paragraphs:textpara.text\n# 提取表格中的文字fortableindoc.tables:forrowintable.rows:forcellinrow.cells:textcell.text text\nexceptExceptionase:print(fWord解析失败{docx_path}-{e})returntextdefextract_resume_text(file_path):根据文件类型提取简历文字extPath(file_path).suffix.lower()ifext.pdf:returnextract_text_from_pdf(file_path)elifextin[.docx,.doc]:returnextract_text_from_docx(file_path)else:print(f不支持的文件格式{ext})return二、关键信息提取defextract_resume_info(text,filename): 从简历文字中提取结构化信息 info{文件名:filename,姓名:,手机:,邮箱:,学历:,毕业学校:,专业:,工作年限:,当前公司:,期望薪资:,技能关键词:[],全文:text[:500]# 保存前500字方便人工核查}# 1. 提取手机号phone_matchre.search(r1[3-9]\d{9},text)ifphone_match:info[手机]phone_match.group()# 2. 提取邮箱email_matchre.search(r[\w\.-][\w\.-]\.\w,text)ifemail_match:info[邮箱]email_match.group()# 3. 提取学历edu_patterns{博士:r博士,硕士:r硕士|研究生|MBA|MPA,本科:r本科|学士|大学本科,大专:r大专|专科|高职,}foredu_level,patterninedu_patterns.items():ifre.search(pattern,text):info[学历]edu_levelbreak# 4. 提取工作年限从X年工作经验或计算工作起始年份years_matchre.search(r(\d)\s*年.*?经[历验]|工作.*?(\d)\s*年,text)ifyears_match:yearsyears_match.group(1)oryears_match.group(2)info[工作年限]f{years}年# 5. 提取期望薪资salary_matchre.search(r期望.*?(\d[\-~到至]\d)[k千K]?.*?[月/年]?|(\d[\-~到至]\d)[k千K].*?期望,text,re.IGNORECASE)ifsalary_match:info[期望薪资]salary_match.group(1)orsalary_match.group(2)# 6. 提取常见技能关键词skill_keywords[# 编程语言Python,Java,JavaScript,TypeScript,Go,C,C#,PHP,Swift,# 前端Vue,React,Angular,HTML,CSS,Node.js,# 后端/数据库MySQL,Redis,MongoDB,PostgreSQL,Spring Boot,Django,FastAPI,# 工具/平台Git,Docker,Kubernetes,AWS,阿里云,Jenkins,# 数据/AI机器学习,深度学习,TensorFlow,PyTorch,pandas,numpy,SQL,# 业务技能Excel,VBA,PowerBI,Tableau,Photoshop,Figma,Axure]found_skills[skillforskillinskill_keywordsifskill.lower()intext.lower()]info[技能关键词]found_skillsreturninfo三、岗位匹配评分defscore_resume(resume_info,job_requirements): 根据岗位要求对简历评分0-100分 job_requirements示例 { 必须技能: [Python, SQL, 机器学习], # 有则加分没有则扣重分 加分技能: [pandas, TensorFlow, Docker], # 有则加分 最低学历: 本科, # 不满足则降为低分 最低年限: 2, # 最少工作年限 期望薪资范围: [15, 25], # 期望薪资范围单位K } score50# 基础分reasons[]# 1. 必须技能检查每个10分缺失-15分required_skillsjob_requirements.get(必须技能,[])forskillinrequired_skills:ifskillinresume_info.get(技能关键词,[]):score10reasons.append(f10具备必须技能「{skill}」)else:score-15reasons.append(f-15缺少必须技能「{skill}」)# 2. 加分技能每个5分bonus_skillsjob_requirements.get(加分技能,[])forskillinbonus_skills:ifskillinresume_info.get(技能关键词,[]):score5reasons.append(f5具备加分技能「{skill}」)# 3. 学历检查edu_order{大专:1,本科:2,硕士:3,博士:4}min_edujob_requirements.get(最低学历,大专)candidate_eduresume_info.get(学历,)candidate_edu_leveledu_order.get(candidate_edu,0)required_edu_leveledu_order.get(min_edu,1)ifcandidate_edu_levelrequired_edu_level:ifcandidate_edu_levelrequired_edu_level:score5# 超过要求加5分reasons.append(f5学历({candidate_edu})高于要求({min_edu}))else:score-20reasons.append(f-20学历({candidate_edu})不满足要求({min_edu}))# 4. 工作年限min_yearsjob_requirements.get(最低年限,0)years_textresume_info.get(工作年限,)years_matchre.search(r(\d),years_text)ifyears_match:yearsint(years_match.group(1))ifyearsmin_years:bonusmin((years-min_years)*3,15)# 超出年限每年加3分最多15分scorebonusifbonus0:reasons.append(f{bonus}工作年限{years}年超出要求{min_years}年)else:score-10reasons.append(f-10工作年限{years}年不足要求{min_years}年)# 5. 薪资范围salary_rangejob_requirements.get(期望薪资范围)salary_textresume_info.get(期望薪资,)ifsalary_rangeandsalary_text:salary_matchre.search(r(\d),salary_text)ifsalary_match:candidate_salaryint(salary_match.group(1))ifcandidate_salarysalary_range[1]:reasons.append(f薪资期望{candidate_salary}K在预算范围内)else:score-5reasons.append(f-5薪资期望{candidate_salary}K超出预算{salary_range[1]}K)# 分数归一化到0-100scoremax(0,min(100,score))returnscore,reasonsdefclassify_candidate(score):根据分数分类候选人ifscore75:returnA类强烈推荐elifscore55:returnB类可面试elifscore40:returnC类备选else:returnD类不推荐四、批量处理简历importglobdefbatch_screen_resumes(resume_folder,job_requirements,output_fileNone): 批量筛选指定文件夹中的简历 ifoutput_fileisNone:output_filef简历筛选结果_{pd.Timestamp.now().strftime(%Y%m%d_%H%M)}.xlsx# 获取所有简历文件pdf_filesglob.glob(f{resume_folder}/**/*.pdf,recursiveTrue)docx_filesglob.glob(f{resume_folder}/**/*.docx,recursiveTrue)all_filespdf_filesdocx_filesprint(f共发现{len(all_files)}份简历开始处理...)results[]fori,file_pathinenumerate(all_files,1):filenameos.path.basename(file_path)print(f[{i}/{len(all_files)}] 处理{filename})# 提取文本textextract_resume_text(file_path)ifnottext.strip():print(f ⚠️ 文本提取为空跳过)continue# 提取信息resume_infoextract_resume_info(text,filename)# 评分score,reasonsscore_resume(resume_info,job_requirements)categoryclassify_candidate(score)result{文件名:filename,分类:category,综合评分:score,姓名:resume_info.get(姓名,),手机:resume_info.get(手机,),邮箱:resume_info.get(邮箱,),学历:resume_info.get(学历,),工作年限:resume_info.get(工作年限,),期望薪资:resume_info.get(期望薪资,),技能关键词:, .join(resume_info.get(技能关键词,[])),评分理由:\n.join(reasons[:5]),# 显示前5条理由文件路径:file_path}results.append(result)# 按分数排序results.sort(keylambdax:x[综合评分],reverseTrue)# 保存Exceldfpd.DataFrame(results)withpd.ExcelWriter(output_file,engineopenpyxl)aswriter:# A类候选人df_adf[df[分类].str.startswith(A)]df_bdf[df[分类].str.startswith(B)]df_alldf df_a.to_excel(writer,sheet_nameA类强烈推荐,indexFalse)df_b.to_excel(writer,sheet_nameB类可面试,indexFalse)df_all.to_excel(writer,sheet_name全部汇总,indexFalse)# 输出统计print(f\n 筛选结果统计 )print(f总简历数{len(results)})forcategoryin[A类强烈推荐,B类可面试,C类备选,D类不推荐]:countsum(1forrinresultsifr[分类]category)print(f{category}{count}人)print(f\n结果已保存{output_file})returnresults# 配置岗位要求DATA_ANALYST_REQUIREMENTS{必须技能:[Python,SQL,pandas],加分技能:[机器学习,PowerBI,Tableau,numpy],最低学历:本科,最低年限:2,期望薪资范围:[15,30]# 15K-30K}# 执行批量筛选resultsbatch_screen_resumes(./简历库/数据分析岗/,DATA_ANALYST_REQUIREMENTS)五、踩坑记录坑1PDF提取效果参差不齐扫描版PDF图片PDFpdfplumber提取到的是空文本。需要先判断是否是图片PDF如果是则调用OCR百度OCR或tesseract先识别文字再处理。坑2简历信息提取精度有限正则提取手机号、邮箱准确率较高90%但学历、年限的提取容易出错简历写法太多样化。对于A类候选人建议人工复核关键字段。坑3隐私合规问题处理简历涉及个人信息需要确保数据安全不上传到公网、不留存超过招聘需要的期限、严格控制访问权限。坑4Word 97-2003格式.docpython-docx只支持.docx格式.doc格式需要先转换。用LibreOffice命令行批量转换soffice --convert-to docx *.doc。总结简历自动筛选系统的核心价值把HR从每天几百份简历的初筛工作中解放出来专注于面试和评估。评分模型需要根据公司实际情况调整权重前期可以和HR一起校准几批简历让结果贴近真实判断标准。署名林焱

相关新闻

影刀RPA 自动化测试入门:用RPA做冒烟测试

影刀RPA 自动化测试入门:用RPA做冒烟测试

title: “影刀RPA 自动化测试入门:用RPA做冒烟测试” date: 2026-07-01 author: 林焱 影刀RPA 自动化测试入门:用RPA做冒烟测试 每次发版后要手工点一遍主流程确认没问题,费时费力还容易漏测。用影刀做冒烟测试,让机器人替你点一…

2026/10/17 8:14:56 阅读更多 →
设计EDA研发总监——八维度综合人才评估报告

设计EDA研发总监——八维度综合人才评估报告

评估岗位:设计EDA研发总监(高层技术管理岗) 评估定位:公司EDA技术一号位、部门负责人;主打战略规划、体系搭建、团队经营、技术壁垒构建、重大攻关决策、跨事业部顶层协同。统筹全公司EDA研发体系、平台建设、国产化替代、先进工艺预研、技术人才梯队与部门经营指标,管辖…

2026/10/17 8:37:08 阅读更多 →
【经济、大数据、人工智能可投、EI稳定检索】第五届信息经济、数据建模与云计算国际学术会议(ICIDC2026)

【经济、大数据、人工智能可投、EI稳定检索】第五届信息经济、数据建模与云计算国际学术会议(ICIDC2026)

第五届信息经济、数据建模与云计算国际学术会议(ICIDC 2026)定于2026年8月28-30日在中国-哈尔滨举行。会议将继续围绕信息经济、数据建模和云计算等研究领域展开讨论。会议旨在为从事经济、数据建模和云计算的专家学者提供一个共享科研成果和前沿技术,了解学术发展趋…

2026/10/17 8:37:24 阅读更多 →

最新新闻

TrueType字体解析:表目录、字符映射与轮廓还原

TrueType字体解析:表目录、字符映射与轮廓还原

简介:这份资源是一套TrueType字体格式解析类,面向从事游戏开发、图形设计、文本渲染等方向且需要深入处理字体文件的开发者。压缩包共2个文件,包含1个cpp实现文件和1个h头文件,整体仅42KB,代码量精简,便于直…

2026/10/18 5:41:43 阅读更多 →
同样标着五层瓦楞,怎么判断是不是“偷克重”的低配纸板?

同样标着五层瓦楞,怎么判断是不是“偷克重”的低配纸板?

同样标着五层瓦楞,怎么判断是不是“偷克重”的低配纸板?一、“偷克重”的常见手法五层瓦楞纸板由面纸、两张芯纸、两张瓦楞纸组成,部分厂家会在标注五层结构的前提下,降低各层原纸的克重,或是减薄芯纸、瓦楞纸的厚度。…

2026/10/18 5:41:43 阅读更多 →
JQuickExcel 流式导出配置:从阈值、窗口到临时文件的工程取舍

JQuickExcel 流式导出配置:从阈值、窗口到临时文件的工程取舍

JQuickExcel 流式导出配置:从阈值、窗口到临时文件的工程取舍 tags: #JQuickExcel #JavaExcel #开源 #POI #Excel工具 更多示例: JQuick-Excel 官网示例 https://www.jquick.org/jquick-excel/#demo-formulas0005 简介 我在处理大批量 Excel 导出时,…

2026/10/18 5:41:43 阅读更多 →
百考通资源平台:从海量题库到结构化数据的高效开发实践

百考通资源平台:从海量题库到结构化数据的高效开发实践

1. 为什么我说"百考通"不是又一个资料堆做开发这些年,我攒过的资料库、模板站、教程合集没有十套也有八套,但说实话,大部分都是"收藏即吃灰"。原因很简单:资源数量再多,跟实际开发需求对不上&…

2026/10/18 5:41:43 阅读更多 →
复合折射透镜CRL的VirtualLab Fusion建模与仿真:12 keV铍材料全流程

复合折射透镜CRL的VirtualLab Fusion建模与仿真:12 keV铍材料全流程

直接切入吧。过去这一年多我一直在跟X射线聚焦打交道,从最开始的苦等同步辐射机时,到后来在VirtualLab Fusion里把复合折射透镜的模型反复推到重来,算是把这条技术路线从原理到仿真再到实验数据闭环走了一遍。今天就把这套基于VirtualLab Fus…

2026/10/18 5:41:43 阅读更多 →
LabVIEW与VisionPro集成实战:从.NET直调到C#中间层方案

LabVIEW与VisionPro集成实战:从.NET直调到C#中间层方案

搞机器视觉集成这些年,"用LabVIEW做流程控制、拿VisionPro干算法活"的组合,我在不止一个项目里见过。LabVIEW 2020的图形化开发环境做交互界面、运动控制和数据流逻辑确实顺手,但真要处理复杂的视觉检测、精密定位、多模板匹配&…

2026/10/18 5:40:42 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →