Install
openclaw skills install hr-resume-scorer简历批量筛选打分工具。支持PDF/Word/TXT格式简历解析,基于JD进行匹配度分析,多维度评分,生成Excel/JSON/Markdown报告。当用户需要筛选简历、批量评估候选人、简历打分、匹配度分析、生成筛选报告时触发此技能。适用于HR、猎头、招聘团队。
openclaw skills install hr-resume-scorer本技能提供完整的简历筛选解决方案:解析简历文件、基于JD匹配度分析、多维度自动评分、批量处理、生成结构化报告。
核心能力:
| 场景 | 触发词示例 |
|---|---|
| 直接发送简历 | 用户直接发送简历文件(PDF/Word/TXT) |
| 批量筛选 | "帮我筛选这批简历"、"简历打分"、"简历筛选" |
| JD匹配 | "看这些简历和JD匹配度"、"按岗位要求筛选" |
| 生成报告 | "生成简历评分报告"、"输出Excel筛选结果" |
| 单份评估 | "评估这份简历"、"给这个候选人打分" |
当用户直接发送简历文件时,按以下流程处理:
用户发送简历文件
↓
┌─────────────────────────────────────┐
│ 1. 自动检测文件 │
│ - 识别文件格式(PDF/Word/TXT) │
│ - 获取文件路径 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 2. 询问JD(如未提供) │
│ - "请提供岗位描述(JD), │
│ 或输入'跳过'进行基础评分" │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 3. 解析并评分 │
│ - 解析简历内容 │
│ - 提取关键信息 │
│ - 多维度评分 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 4. 即时反馈 │
│ - 展示候选人信息摘要 │
│ - 显示评分结果 │
│ - 给出录用建议 │
└─────────────────────────────────────┘
处理步骤:
ResumeParser.parse_file() 解析文件ResumeScorer.score_resume() 进行评分输出格式:
## 📋 简历解析结果
**候选人**: 张三
**文件名**: 张三_前端开发.pdf
### 基本信息
- 📱 电话: 13800138000
- 📧 邮箱: zhangsan@email.com
- 🎓 学历: 本科
- 💼 经验: 5年
### 技能列表
React, Vue, TypeScript, Node.js, Webpack
### 评分结果
| 维度 | 分数 | 说明 |
|------|------|------|
| 学历背景 | 70 | 本科 |
| 工作经验 | 85 | 5年经验 |
| 技能匹配 | 90 | 高度匹配 |
| 稳定性 | 80 | 较为稳定 |
**总分**: 82.5
**匹配等级**: A-高度匹配
**建议**: 推荐 - 建议安排面试
当用户指定文件路径或目录时,按以下流程处理:
用户提供路径
↓
┌─────────────────────────────────────┐
│ 1. 确认输入 │
│ - 简历文件/目录路径 │
│ - JD文本/文件(可选) │
│ - 输出格式(默认Excel) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 2. 批量解析 │
│ - 遍历目录文件 │
│ - 逐个解析简历 │
│ - 收集结构化数据 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 3. 批量评分 │
│ - 基础维度评分 │
│ - JD匹配度计算(如有JD) │
│ - 按分数排序 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 4. 生成报告 │
│ - 输出Excel/JSON/Markdown │
│ - 展示筛选摘要 │
└─────────────────────────────────────┘
向用户确认:
调用脚本 scripts/resume_scorer.py 中的 ResumeParser:
from resume_scorer import ResumeParser
# 解析单个文件
resume = ResumeParser.parse_file("path/to/resume.pdf")
# 返回结构化数据
print(resume.name) # 候选人姓名
print(resume.phone) # 电话
print(resume.email) # 邮箱
print(resume.education) # 学历列表
print(resume.experience_years) # 工作年限
print(resume.skills) # 技能列表
使用 ResumeScorer 进行多维度评分:
from resume_scorer import ResumeScorer, JDMatcher
# 初始化评分器
scorer = ResumeScorer()
# 解析JD(如有)
jd_requirements = JDMatcher.parse_jd(jd_text)
# 评分
result = scorer.score_resume(resume, jd_requirements)
print(result.total_score) # 总分(0-100)
print(result.match_level) # 匹配等级(S/A/B/C/D/E)
print(result.dimension_scores) # 各维度分数
print(result.strengths) # 优势
print(result.concerns) # 关注点
print(result.recommendation) # 录用建议
使用 BatchProcessor 批量处理:
from resume_scorer import BatchProcessor, ReportGenerator
processor = BatchProcessor()
# 处理整个目录
results = processor.process_directory("path/to/resumes/", jd_text)
# 生成Excel报告
ReportGenerator.to_excel(results, "筛选报告.xlsx")
# 生成Markdown报告
ReportGenerator.to_markdown(results, "筛选报告.md")
| 维度 | 权重 | 说明 |
|---|---|---|
| 学历背景 | 15% | 博士/硕士/本科/大专 |
| 工作经验 | 25% | 年限 + 大厂/行业经验 |
| 技能匹配 | 30% | 与JD技能要求的匹配度 |
| 行业匹配 | 20% | 同行业/相关行业/跨行业 |
| 工作稳定性 | 10% | 平均在职时长 |
匹配等级:
详细评分标准见 references/scoring_criteria.md
| 维度 | 说明 | 分析方法 |
|---|---|---|
| 性格特征 | 领导力、执行力、创新力等 | 关键词分析 |
| 工作风格 | 技术驱动/业务导向/管理型/研究型 | 内容分析 |
| 职业动机 | 技术成长/薪资/发展/平衡 | 关键词分析 |
| 职业倾向 | 管理方向/专家方向/业务方向 | 经验分析 |
| 领导潜力 | 高/中等/需评估 | 管理经验分析 |
| 团队适配 | 协作型/独立型/灵活型 | 工作方式分析 |
#### 👤 人物画像
- **性格特征**: 领导力、执行力、协作力
- **工作风格**: 技术驱动型
- **职业倾向**: 管理方向
- **领导潜力**: 高领导潜力
- **团队适配**: 适合协作型团队
- **总结**: 候选人表现出领导力、执行力、协作力等特质,属于技术驱动型,职业倾向为管理方向。高领导潜力,适合协作型团队。
| 维度 | 说明 | 风险指标 |
|---|---|---|
| 时间一致性 | 工作经历时间是否重叠 | 时间矛盾 |
| 描述真实性 | 是否存在夸大或模糊描述 | 夸大描述、模糊描述 |
| 经验合理性 | 经验与年限是否匹配 | 经验与年龄不符 |
| 跳槽频率 | 是否频繁跳槽 | 频繁跳槽 |
| 学历验证 | 学历信息是否可信 | 教育时间异常 |
| 等级 | 分数区间 | 建议 |
|---|---|---|
| 低风险 | 80-100 | 简历信息较为可信 |
| 中等风险 | 60-79 | 建议面试中深入了解 |
| 较高风险 | 40-59 | 建议深度背景调查 |
| 高风险 | 0-39 | 要求提供第三方证明 |
常见可疑模式:
#### 🔍 真实性检查
- **真实性评分**: 85/100
- **风险等级**: 低风险
- **验证要点**:
- 要求提供学历证书或学信网验证
- 要求提供离职证明或社保记录
- 通过技术面试验证核心技能
| 因素 | 权重 | 说明 |
|---|---|---|
| 历史平均在职时长 | 35% | 过往工作稳定性 |
| 跳槽频率趋势 | 20% | 最近跳槽是否更频繁 |
| 职业发展阶段 | 15% | 初级/成长期/稳定期/资深 |
| 行业特性 | 10% | 互联网/传统行业/创业 |
| 职位匹配度 | 10% | 与JD的匹配程度 |
| 等级 | 预估时长 | 留任概率 |
|---|---|---|
| 低风险 | 3年以上 | 高 |
| 中等风险 | 1-3年 | 中 |
| 高风险 | 1年以下 | 低 |
#### ⏱️ 在职预估
- **预估在职时长**: 2-3年
- **留任风险**: 低风险
# 基础用法:筛选目录下所有简历
python scripts/resume_scorer.py ./resumes/
# 指定JD文件
python scripts/resume_scorer.py ./resumes/ --jd ./jd.txt
# 直接输入JD文本
python scripts/resume_scorer.py ./resumes/ --jd-text "岗位要求:3年以上Python经验..."
# 指定输出格式和路径
python scripts/resume_scorer.py ./resumes/ --format excel --output 筛选结果.xlsx
# JSON格式输出
python scripts/resume_scorer.py ./resumes/ --format json --output results.json
# Markdown格式输出
python scripts/resume_scorer.py ./resumes/ --format markdown --output report.md
| 字段 | 说明 |
|---|---|
| 排名 | 按总分排序 |
| 文件名 | 原始文件名 |
| 候选人 | 提取的姓名 |
| 总分 | 加权总分(0-100) |
| 匹配等级 | S/A/B/C/D/E |
| 学历得分 | 学历维度分数 |
| 经验得分 | 经验维度分数 |
| 技能匹配 | 技能维度分数 |
| 稳定性 | 稳定性维度分数 |
| 优势 | 候选人亮点 |
| 关注点 | 需注意问题 |
| 建议 | 录用建议 |
# PDF解析 (二选一)
pip install PyMuPDF
# 或
pip install pdfplumber
# Word解析
pip install python-docx
# Excel输出
pip install pandas openpyxl
references/scoring_criteria.mdreferences/resume_parsing_guide.mdreferences/personality_analysis_guide.md当用户在对话中直接发送简历文件时,按以下步骤处理:
用户发送的文件会自动保存到工作目录。检测文件扩展名:
.pdf → PDF简历.docx / .doc → Word简历.txt / .md → 文本简历# 获取用户发送的文件路径(从工作目录)
import glob
from resume_scorer import ResumeParser, ResumeScorer, JDMatcher
# 查找最新的简历文件
resume_files = glob.glob("*.pdf") + glob.glob("*.docx") + glob.glob("*.txt")
if resume_files:
file_path = resume_files[-1] # 取最新文件
# 解析简历
resume = ResumeParser.parse_file(file_path)
# 评分(无JD时使用基础评分)
scorer = ResumeScorer()
result = scorer.score_resume(resume)
# 格式化输出
print(f"## 📋 简历解析结果\n")
print(f"**候选人**: {resume.name}")
print(f"**文件名**: {resume.filename}\n")
print(f"### 基本信息")
print(f"- 📱 电话: {resume.phone or '未提供'}")
print(f"- 📧 邮箱: {resume.email or '未提供'}")
print(f"- 🎓 学历: {', '.join(resume.education) if resume.education else '未提供'}")
print(f"- 💼 经验: {resume.experience_years}年\n")
print(f"### 技能列表")
print(f"{', '.join(resume.skills) if resume.skills else '未识别到明确技能'}\n")
print(f"### 评分结果")
print(f"| 维度 | 分数 |")
print(f"|------|------|")
for dim, score in result.dimension_scores.items():
print(f"| {dim} | {score} |")
print(f"\n**总分**: {result.total_score}")
print(f"**匹配等级**: {result.match_level}")
print(f"**建议**: {result.recommendation}")
展示基础评分后,询问用户:
是否提供岗位描述(JD)进行更精准的匹配分析?
- 提供JD文本 → 进行JD匹配度分析
- 输入"跳过" → 保持基础评分
当用户一次发送多个简历文件时:
## 📊 批量简历筛选结果
共解析 5 份简历
| 排名 | 候选人 | 总分 | 等级 | 建议 |
|------|--------|------|------|------|
| 1 | 张三 | 85.5 | A | 推荐面试 |
| 2 | 李四 | 78.0 | B | 建议面试 |
| 3 | 王五 | 72.5 | B | 建议面试 |
| 4 | 赵六 | 65.0 | C | 可考虑 |
| 5 | 钱七 | 55.0 | D | 谨慎考虑 |
是否需要生成详细的Excel报告?
当用户直接粘贴简历内容时:
temp_resume.txt# 保存用户粘贴的文本
with open("temp_resume.txt", "w", encoding="utf-8") as f:
f.write(user_pasted_text)
# 解析并评分
resume = ResumeParser.parse_file("temp_resume.txt")
result = scorer.score_resume(resume)