Desktop Organizer — 猎头简历库整理
把桌面散落的候选人简历变成一套可用的人才库。核心原则:不删除任何文件、dry-run 优先、判定结果必须可审计。
0. 环境准备(每次会话先做)
依赖:
pip install pymupdf
桌面路径 — 必须实测,不能假设:
Windows 上桌面可能被移动到其他盘(如华为笔记本的 HuaweiMoveData)。先读取注册表确认,不要直接扫 C:\Users\<user>\Desktop(那可能只是个空镜像):
# Windows:读注册表确认真实桌面路径
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
或 PowerShell:
(Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders").Desktop
扫描方式 — 不要用 Glob:Glob/find 会漏文件。一律用 Python os.listdir / os.walk。
1. 目录体系
<桌面>/简历库/ ← 主库,22 个方向文件夹
├── 01-世界模型/
├── 02-预训练/
├── ...
└── 22-移动端/
<桌面>/27届/ ← 某一届集中文件夹(命名规约不同,见 §4)
<桌面>/话术/ ← 公司名 / JD 类 docx
<桌面>/客户/<客户名>/ ← JD 归档
| 文件类型 | 目标位置 | 规则 |
|---|---|---|
| 候选人简历 PDF | 简历库/<方向>/ |
判定方向 → 命名 → 归类 |
| 简历 docx | 不自动归类 | 单独列出,人工确认(转 PDF 后原 docx 放类目内 _原件docx/) |
| 公司名 / JD docx | 话术/ |
按文件名识别 |
| 图片 | 原位 | 分析内容后询问,不擅自处理 |
~$ / .lnk / 安装包 / 项目文件夹 |
原位 | 忽略,仅在报告列出 |
2. 22 方向判定
完整关键词表见 references/direction-taxonomy.md。
具身智能类(细分,优先匹配):01-世界模型 02-预训练 03-VLA 04-运控 05-仿真 06-具身数据 07-感知 08-具身综合
通用类:09-大模型 10-Agent 11-多模态 12-语音 13-算法 14-前端 15-后端 16-数据 17-产品 18-测试 19-Infra 20-管理 21-嵌入式 22-移动端
判定顺序:文件名关键词 → PDF 内容「求职意向 / 研究方向」字段 → 全文关键词 → 兜底(归最接近大类,报告中列出待确认)
方向要"最正确"——这些是实战纠错过的:
| 简历内容 | ❌ 错 | ✅ 对 |
|---|---|---|
| 世界模型与机器人学习算法 | VLA | 01-世界模型 |
| 具身仿真平台 / 评测 | 08-具身综合 | 05-仿真 |
| MindVLA 基座模型 | 03-VLA | 02-预训练 |
| 字节 PMO 做 AI 产品 | 06-具身数据 | 17-产品 |
| 多模态 Agent 后训练 | 11-多模态 | 10-Agent |
3. 主库命名规约:姓名-具体工作方向.pdf
文件夹是「大致方向」,文件名后缀必须是简历「实际工作内容」。
✅ 吴栋-世界模型.pdf (放在 01-世界模型/)
✅ 沈勇-语音识别.pdf (放在 13-算法/)
❌ 吴栋-VLA.pdf (用文件夹名当后缀,不合格)
❌ 沈勇-算法.pdf ("算法"是泛词,不合格)
具体方向提取优先级:
- 原文件名里的具体方向词(
代东洋-语音合成-TTC.pdf→代东洋-语音合成.pdf) - 只有泛词(算法/工程师/研发/开发/技术/负责人/研究员/专家)→ 读 PDF 内容,优先「求职意向 / 从事职业 / 研究方向 / 目标岗位」字段
- 仍无法确定 → 文件夹名兜底
姓名提取:取文件名首段(中文 2-4 字 / 英文名 / 中英混排如 Eric李);英文名保留下划线(Cheng_Lu);提取失败读内容;仍失败保持原名并列为待人工处理。
_N 后缀:_2/_3 是版本标记不是方向,提取方向时先剥离,最终保留。
清理噪音:TTC、个人简历/resume/cv、公司后缀、学历(博士/硕士/27届)、城市、长 ID(ATCH2052...)。
流程顺序:判定方向 → 命名 → 归类,一步完成,落盘即新名。
4. 届数文件夹命名规约
<桌面>/27届/ 集中放 27 届候选人简历副本(主库仍保留原件),命名:
姓名-最近一段学校-最近一段实习工作-实习研究方向.pdf
吴栋-北京大学-百度阿波罗-多模态流式仿真世界模型.pdf
曹式铖-南开大学-星海图-G0.5 VLA预训练与后训练.pdf
提取要点:
- 最近学校 = 最高学历(硕士/博士优先于本科;本科西工大 + 硕士北理工 → 用北理工)
- 最近实习 = 起止时间最新的一段(商汤 2025.9-至今 优先于光明实验室 2025.4-2025.8)
- 实习研究方向 = 该段的具体方向,10-20 字
- 无实习者用「XX课题 / XX科研」代替单位,方向填研究方向
- ⚠️ 自动提取不可靠(会把「具身智能」当公司名、把日期当方向)→ 必须生成 CSV 清单让人工核对后再执行
5. 届数判定(最容易漏人的部分)
目标:找出某一届应届生(如 27 届 = 2027 毕业)。
三个坑
坑 1:只看「文件名标 27 届」会漏掉一半人。 大量应届生简历不写届数,写的是「2024.09-至今」。必须按学制推算:
- 硕士 2024 入学(3 年制)/ 2025 入学(2 年制)→ 2027 毕业
- 博士 2022 / 2023 入学(4-5 年制)→ 2027 毕业
坑 2:全文正则匹配「至今」会把在职的也抓进来。 在职人员的工作经历同样写「2024-至今」。必须只在教育经历块内匹配——先定位「教育经历」标题,截到下一个区块标题(工作经历/项目经历/技能/荣誉)之前,再在这段文本里找。窗口内出现「有限公司/股份有限公司/职级/任职/年以上经验/Leader/主管/总监」即判定为工作经历,跳过。
坑 3:英文格式和竖排文本会让标准正则失效。
Sep. 2024 – Jun. 2027 中间夹月份;竖排排版的 PDF 文本流顺序错乱,导致「至今」和入学年不相邻。用宽松邻近匹配兜底:目标年份前后 110 字内同时出现入学年 + 教育词。
判定优先级与置信度
| 规则 | 置信度 |
|---|---|
| 1. 显式标注「27届 / 2027届 / 27年应届 / 预计2027」 | high |
| 2. 教育经历结束年份 = 2027 | high |
| 3. 教育块内「入学年-至今」,按学制推算 = 2027 | high |
| 4. 宽松邻近匹配兜底 | low(误判率高,必须人工复核) |
宽松匹配会命中大量在职人员——这是刻意设计(宁多不漏),但输出必须按置信度分开,low 的逐个人工看。
必须排除的误判
- 工作经历「至今」的在职人员
- 已毕业(2020-2024、2021-2025 等)
- 博士后(非应届)
- 教育时间缺失、无法确认毕业年份的 → 存疑不收录,单独列出
图片型 PDF 单独排查
文本提取 0 字的 PDF(扫描件/图片型)靠文件名判断会漏。渲染成 jpg 做视觉识别:
import pymupdf
doc = pymupdf.open(path)
doc[0].get_pixmap(dpi=150).save("out.jpg")
跨来源核对
届数信息在改名后可能丢失。如果库里已做过一轮改名,要同时参考改名前的原始文件名(可能带「27届」标记)。只读内容会漏,只读文件名也会漏——双源核对。
6. 人才计划扫描
关键词 30+:杰青、优青、海外优青、长江学者、千人计划、青年千人、万人计划、博新计划、卓博计划、上海市超级博士后、科技新星、青托、天才少年、阿里星、水木学者、浦江人才、香江学者、以及企业计划(字节筋斗云、百度探路星、地平线专项等)。
⚠️ 必须区分「本人获得」和「导师获得」:简历常写「导师:XXX(杰青)」——那是导师的头衔。命中上下文含「导师 / Advisor / 合作导师 / Prof.」的,标记为待复核。
7. 执行脚本
# 扫描(结构化 JSON + 控制台摘要)
python scripts/scan_resumes.py --lib "<桌面>/简历库" --out scan.json
python scripts/scan_resumes.py --lib "<桌面>/简历库" --jie 2027 --only-jie
python scripts/scan_resumes.py --lib "<桌面>/简历库" --jie 2027 --only-jie --min-confidence high
python scripts/scan_resumes.py --lib "<桌面>/简历库" --only-scanned --render-dir ./render
# 归档桌面散落简历
python scripts/organize.py --src "<桌面>" --lib "<桌面>/简历库" # 预览
python scripts/organize.py --src "<桌面>" --lib "<桌面>/简历库" --apply --revert-csv revert.csv
# 届数同步
python scripts/jie_sync.py --lib "<桌面>/简历库" --out-dir "<桌面>/27届" --year 2027 --preview review.csv
python scripts/jie_sync.py --lib "<桌面>/简历库" --out-dir "<桌面>/27届" --year 2027 --apply --from-csv review.csv
# 人才计划
python scripts/talent_scan.py --lib "<桌面>/简历库"
8. 安全红线
- 不删除任何文件。重复文件只报告,脚本里没有任何删除调用
- dry-run 默认,
--apply才真正写盘 - 只动源目录根层,不递归子文件夹
- md5 去重跨库比对,同 md5 跳过不移动
- 同名冲突加
_2/_3,绝不覆盖 - 回退表:
--revert-csv输出完整 原路径 ↔ 新路径 - 批量改名/移动前先生成预览清单给使用者确认(几百个文件的操作会触发权限弹窗,也是安全阀)
~$开头是 Word 锁定临时文件,忽略
9. 输出报告格式
每次整理后汇报:
- 处理了多少份、按方向分布
- 新增归档明细(原文件名 → 新路径)
- 跳过 / 重复的文件清单
- 无法判定的,附上内容摘要供人工决策
- 需要人工确认的事项(docx 简历、姓名存疑、图片型 PDF)
10. 定时巡检(可选)
建议做成每周一次的自动化任务,覆盖:
- 扫描桌面根目录新散落简历 → 归档
- 检查 22 个方向文件夹:方向放错的、md5 重复的、空文件夹
- 检查某一届是否漏同步
- 输出巡检报告
参考
references/direction-taxonomy.md— 22 方向完整关键词表 + 常见误判清单scripts/resume_core.py— 核心库(PDF/教育块/姓名/学校/方向/届数/人才计划)README.md— 项目说明