HR简历分析评分报告

Other

简历批量筛选打分工具。支持PDF/Word/TXT格式简历解析,基于JD进行匹配度分析,多维度评分,生成Excel/JSON/Markdown报告。当用户需要筛选简历、批量评估候选人、简历打分、匹配度分析、生成筛选报告时触发此技能。适用于HR、猎头、招聘团队。

Install

openclaw skills install hr-resume-scorer

简历批量筛选打分技能

概述

本技能提供完整的简历筛选解决方案:解析简历文件、基于JD匹配度分析、多维度自动评分、批量处理、生成结构化报告。

核心能力

  • 支持 PDF、Word、TXT、Markdown 格式简历解析
  • 基于职位描述(JD)的智能匹配度分析
  • 5维度评分体系:学历、经验、技能匹配、行业匹配、稳定性
  • 批量处理 + Excel/JSON/Markdown 报告输出

使用场景

场景触发词示例
直接发送简历用户直接发送简历文件(PDF/Word/TXT)
批量筛选"帮我筛选这批简历"、"简历打分"、"简历筛选"
JD匹配"看这些简历和JD匹配度"、"按岗位要求筛选"
生成报告"生成简历评分报告"、"输出Excel筛选结果"
单份评估"评估这份简历"、"给这个候选人打分"

工作流程

模式一:用户直接发送简历(推荐)

当用户直接发送简历文件时,按以下流程处理:

用户发送简历文件
  ↓
┌─────────────────────────────────────┐
│ 1. 自动检测文件                      │
│    - 识别文件格式(PDF/Word/TXT)    │
│    - 获取文件路径                    │
└─────────────────────────────────────┘
  ↓
┌─────────────────────────────────────┐
│ 2. 询问JD(如未提供)                │
│    - "请提供岗位描述(JD),           │
│       或输入'跳过'进行基础评分"      │
└─────────────────────────────────────┘
  ↓
┌─────────────────────────────────────┐
│ 3. 解析并评分                        │
│    - 解析简历内容                    │
│    - 提取关键信息                    │
│    - 多维度评分                      │
└─────────────────────────────────────┘
  ↓
┌─────────────────────────────────────┐
│ 4. 即时反馈                          │
│    - 展示候选人信息摘要              │
│    - 显示评分结果                    │
│    - 给出录用建议                    │
└─────────────────────────────────────┘

处理步骤

  1. 检测文件:用户发送文件后,自动识别为简历文件
  2. 询问JD:如对话中未提供JD,询问用户是否提供岗位描述
  3. 解析简历:使用 ResumeParser.parse_file() 解析文件
  4. 评分分析:使用 ResumeScorer.score_resume() 进行评分
  5. 展示结果:以Markdown格式展示候选人信息和评分结果

输出格式

## 📋 简历解析结果

**候选人**: 张三
**文件名**: 张三_前端开发.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         │
│    - 展示筛选摘要                    │
└─────────────────────────────────────┘

步骤详解

Step 1: 确认输入

向用户确认:

  1. 简历位置:文件路径、目录路径,或用户直接发送文件
  2. JD信息:职位描述文本或文件路径(可选)
  3. 输出格式:Excel(默认)、JSON、Markdown
  4. 输出路径:默认当前目录下

Step 2: 解析简历

调用脚本 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)         # 技能列表

Step 3: 评分分析

使用 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)    # 录用建议

Step 4: 批量处理

使用 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%平均在职时长

匹配等级

  • S (90-100): 极匹配,强烈推荐
  • A (80-89): 高度匹配,推荐面试
  • B (70-79): 较为匹配,建议面试
  • C (60-69): 基本匹配,可考虑
  • D (50-59): 部分匹配,谨慎考虑
  • E (<50): 匹配度低,不推荐

详细评分标准见 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

输出报告示例

Excel报告字段

字段说明
排名按总分排序
文件名原始文件名
候选人提取的姓名
总分加权总分(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

注意事项

  1. 文件格式:确保简历文件格式正确,PDF推荐使用文本型PDF
  2. 编码问题:中文简历建议使用UTF-8编码
  3. 批量数量:单次建议不超过100份,大批量请分批处理
  4. JD质量:JD越详细,匹配分析越准确
  5. 人工复核:自动评分仅供参考,重要岗位建议人工复核

参考文档

  • 评分标准详情:references/scoring_criteria.md
  • 简历解析指南:references/resume_parsing_guide.md
  • 人物画像与真实性检查:references/personality_analysis_guide.md

附录:对话式简历解析指南

场景A:用户直接发送简历文件

当用户在对话中直接发送简历文件时,按以下步骤处理:

1. 识别文件

用户发送的文件会自动保存到工作目录。检测文件扩展名:

  • .pdf → PDF简历
  • .docx / .doc → Word简历
  • .txt / .md → 文本简历

2. 解析并展示结果

# 获取用户发送的文件路径(从工作目录)
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}")

3. 询问是否需要JD匹配

展示基础评分后,询问用户:

是否提供岗位描述(JD)进行更精准的匹配分析?
- 提供JD文本 → 进行JD匹配度分析
- 输入"跳过" → 保持基础评分

场景B:用户发送多个简历文件

当用户一次发送多个简历文件时:

  1. 收集所有文件:遍历工作目录中的简历文件
  2. 批量解析:逐个解析并评分
  3. 汇总展示:按分数排序,展示排名表
  4. 询问是否导出:是否需要生成Excel/JSON报告
## 📊 批量简历筛选结果

共解析 5 份简历

| 排名 | 候选人 | 总分 | 等级 | 建议 |
|------|--------|------|------|------|
| 1 | 张三 | 85.5 | A | 推荐面试 |
| 2 | 李四 | 78.0 | B | 建议面试 |
| 3 | 王五 | 72.5 | B | 建议面试 |
| 4 | 赵六 | 65.0 | C | 可考虑 |
| 5 | 钱七 | 55.0 | D | 谨慎考虑 |

是否需要生成详细的Excel报告?

场景C:用户粘贴简历文本

当用户直接粘贴简历内容时:

  1. 保存为临时文件:将文本保存为 temp_resume.txt
  2. 解析并评分:使用标准流程处理
  3. 展示结果:即时反馈评分结果
# 保存用户粘贴的文本
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)

最佳实践

  1. 即时反馈:用户发送文件后,立即解析并展示结果
  2. 渐进式分析:先展示基础评分,再询问是否需要JD匹配
  3. 清晰展示:使用表格和格式化输出,便于阅读
  4. 灵活导出:根据用户需求生成不同格式的报告
  5. 错误处理:解析失败时给出明确提示和解决建议