影刀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/7/24 0:35:40 阅读更多 →
设计EDA研发总监——八维度综合人才评估报告

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

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

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

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

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

2026/7/24 0:35:40 阅读更多 →

最新新闻

粉笔直播课适合二战考生突破瓶颈吗

粉笔直播课适合二战考生突破瓶颈吗

一、二战考生为什么会卡在瓶颈期 公考圈里流传一句话:"一战拼基础,二战拼心态,三战拼选择。"对于已经走过一遍完整备考流程的考生而言,第二次走进考场时,最难的往往不是知识点本身,而是如何把已经…

2026/7/24 0:42:42 阅读更多 →
数据湮灭的终极解法:当 DNA 数据存储走向产业化黎明

数据湮灭的终极解法:当 DNA 数据存储走向产业化黎明

在数字时代,我们见证了数据呈指数级的狂飙。全球每年产生的数据量已经突破上百泽字节(Zettabytes),而传统的硬盘、闪存和磁带不仅面临着物理密度的极限,更背负着沉重的能耗包袱。更为致命的是,这些传统介质…

2026/7/24 0:42:42 阅读更多 →
C语言基础学习——二维数组

C语言基础学习——二维数组

二维数组用于解决类似表格的数据,几行几列int[6] group[5]; //定义了一个 包含有5个int[6]类型的 一维数组数组也是一种数据类型---int[6] //数组长度6C语言二维数组的定义语法:类型说明符 数组名[常量表达式][常量表达式];1 2 3 …

2026/7/24 0:42:42 阅读更多 →
[Qt6/QML 高性能渲染] + [高频数据刷新引发 GC 卡顿与内存抖动] + [QAbstractListModel 零拷贝驱动与局部更新实战]

[Qt6/QML 高性能渲染] + [高频数据刷新引发 GC 卡顿与内存抖动] + [QAbstractListModel 零拷贝驱动与局部更新实战]

[Qt6/QML 高性能渲染] [高频数据刷新引发 GC 卡顿与内存抖动] [QAbstractListModel 零拷贝驱动与局部更新实战] 导读摘要:在处理实时语音识别(ASR)、多通道波形展示或高频日志流等数据密集型场景时,直接在 QML/JS 侧维护 ListMo…

2026/7/24 0:42:42 阅读更多 →
2026ai建站口碑好的企业推荐都有哪些,快来看看吧!

2026ai建站口碑好的企业推荐都有哪些,快来看看吧!

2026 AI建站口碑好的企业推荐都有哪些,大家快来看看吧!据《2026年中国企业数字化建站行业白皮书》披露的一组跟踪数据:在抽样调研的1200家使用AI建站工具的中小企业中,上线满6个月后仍持续续费、且自然搜索流量正向增长的占比仅31…

2026/7/24 0:41:42 阅读更多 →
2026主流小程序制作平台对比出炉!看看哪个更合你心意?

2026主流小程序制作平台对比出炉!看看哪个更合你心意?

2026主流小程序制作平台对比出炉!看看哪个更合你心意?QuestMobile数据显示,截至2026年3月,小程序整体月活用户规模已达10.21亿,其中微信小程序月活达9.73亿。艾瑞咨询《2026年中国小程序生态发展报告》显示&#xff0c…

2026/7/24 0:41:42 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻