Files

100 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# data/real —— 真实公开数据集接入
本目录存放从公开数据集加工而来的真实评测/演示数据,与 `data/testset/`(合成测试集)
**分开报告、不混算**。源数据位于 `datasets/XH-202621/data/`(只读),全部产物可由
`scripts/build_real_dataset.py`(random.seed=2026 固定)复现重建。
## 目录结构与来源
| 目录 | 来源 | 授权 | 内容 |
|---|---|---|---|
| `autoweaks_jd/` | AutoWeakS(北大/人大,arXiv:2012.14234)`Tecent_job_phrase.txt`(2820 行腾讯 JD)、`JD_job_phrase.txt`(706 行京东 JD) | 论文公开语料(研究用途) | 200 条真实 JD 样本(腾讯 160/京东 40,≈4:1 与源行数比一致)+ silver gold;全量 `jd_full.jsonl` 2215 条 + 500 条分层评测集 `jd_eval_500.jsonl`(含原 200 条样本) |
| `aistudio_resumes/` | AIStudio 中文简历标注集 `train.json`(2000 条) | CC0 | 200 份简历 txt(保留 PII,用于验证脱敏链路)+ 字段级 gold |
| `chinese_resume → batch_demo_resumes/` | `Chinese_resume_data.csv`(5001 条结构化简历,含 PII) | 公开数据集(研究用途) | 32 份渲染后**经 `app.match.resume.mask_text` 脱敏**的 txt;原始 CSV 与未脱敏文本一律不写入 data/ |
| `esco_reference/` | ISCO/ESCO 国际职业分类 | ESCO 为 EU 公开分类 | 只拷 4 个关键 labels 锚点文件(未整目录拷贝),供岗位归类对齐参考 |
## 处理口径
### autoweaks_jd(真实 JD 测试集 / 语料)
- **去分词**:源文件为词级分词格式(词间单空格)。CJK 之间、CJK 与拉丁 token 之间
去空格,拉丁-拉丁保留单空格(`detokenize()`,如 `熟悉 hadoop spark 开发` → `熟悉hadoop spark开发`)。
- **技术岗过滤**:命中 Python|Java|JavaScript|前端|后端|软件|算法|数据|开发|云|AI|机器学习|
测试|运维|Android|iOS|Go 等关键词,且至少命中 1 个词表技能;全文去重。
- **JDRecord 兼容 JSONL**:jid(AW0001~AW0200)/job_title(启发式)/company(腾讯|京东)/
publish_date(2019 随机)/source("autoweaks")/url(空)/text。
- **job_title 为启发式标注**:真实 JD 无"岗位名称:"行,按文本前 200 字关键词归类
(算法/前端/后端/测试/运维/数据分析等),评测中该字段只作参考,主指标是技能 F1。
- **gold 为 silver 标准(初标+抽检)**:
1. 初标 = SkillMatcher 全文扫描(required_skills)+ 场景词表(scenarios);
真实 JD 无编号版面,responsibilities/preferred_skills 口径为空,不参与评分;
即使抽取器从正文"优先考虑"等字样产出加分候选,preferred_skills 也不计入
(gold 无该字段标注,避免真实语料口径漂移);
2. 人工抽检 30 条(每 7 条取 1 + 随机补 1):**初标与人工复核一致 29/30(96.7%)**;
唯一不一致 AW0001 漏抽 Node.js/React(源文本写作 nodeJS/reactJS),定位为词表别名
缺失——已给词表补 `NodeJS`/`ReactJS` 别名并重新初标,**未为过指标修改 gold**。
3. 抽检另发现 1 处真实抽取器局限(非 gold 错误):AW0050 自由文本中混入"任职资格"
字样触发版面区域切分,导致区域前的 RTOS 漏抽——gold 保留正确答案,评测如实
反映(recall −0.12%)。
- **已知局限**:词表(179 项)未覆盖的真实技能(Ruby/Perl/Memcached/JVM/Sass/大数据/
OpenStack 等)不在 gold 口径内;源文本错别字(如 pathon=python)不做纠正。
词表扩至 179 项后新增命中(SLAM/ROS 各 1-2 条、路径规划 1 条)为 gold 未覆盖口径,
影响约 0.1 个百分点,未为过指标修改 gold。
### 数据扩产记录(`scripts/expand_real_dataset.py`,T1-T5)
在 `build_real_dataset.py`(200 条样本基线)基础上扩产,random.seed=2026 可复现:
- **T1 AutoWeakS 全量(`jd_full.jsonl`)**:去分词 → 技术岗过滤 → 全文去重后,
腾讯池 1850 条、京东池 365 条,共 2215 条唯一文本;全量 = 原 200 条样本
(jid/原文逐字保留)+ 新增 2015 条(腾讯 1690 / 京东 325,jid 接续 AW0201~AW2215)。
**日期策略**:源数据无发布日期,新增条目统一 `publish_date=2019-06-01`,原样本保留
其既有随机日期;**该子集整体不参与演化分析,仅作语料/评测**。
- **T2 真实 JD 评测集 500 条(`jd_eval_500.jsonl` + `gold_answers_500.json`)**:
包含原 200 条样本,另按岗位类别分层补 300 条,优先补齐样本覆盖少的类别;
gold 沿用"SkillMatcher 初标"口径(responsibilities/preferred_skills 为空,
不参与评分)。一致性自检:500 条 gold 的每个技能均可回溯到原文(SkillMatcher
以原文命中生成,脚本内断言通过);**人工抽检 ≥50 条由团队在提交前执行并补记**。
- **T3 AIStudio 简历 50 → 200**:按"工作/项目经历含技术内容 + 电话合法 + 有姓名"
过滤,从剩余候选中抽 150 条渲染为 `aistudio_051~200.txt`,gold.json 同步扩展
(姓名/电话/词表技能/源 source_id)。该目录保留 PII 属既有约定,仅用于验证脱敏链路。
- **T4 批量演示 12 → 32**:从 `Chinese_resume_data.csv`(筛选结果=通过)再抽 20 条,
优先覆盖既有文件未覆盖的意向岗位;**落盘前必须过 `mask_text`**,测试守卫确认
无 `1[3-9]\d{9}` 手机明文与邮箱明文。
- **T5 英文数据集(data_jobs/djinni/jd_en/careercorpus/jobhop)未接入**:赛题为中文
岗位场景,英文 JD 对演示与指标无实质价值;方法可迁移性由 ESCO 参考文件与中文评测
佐证,不引入英文语料到主目录。
### aistudio_resumes(真实简历集)
- 抽 200 条:优先工作经历/项目经历含技术内容、电话合法(`1[3-9]\d{9}`)、有姓名。
- 渲染为本工程简历文本格式:姓名/电话/学历/籍贯 + 教育经历/工作经历/项目经历分节。
**保留 PII**(姓名、手机号明文),用于验证解析即脱敏链路;gold 按脱敏形态比对。
- `gold.json`:每份给 姓名、电话、词表技能清单(SkillMatcher 扫描初标 + 人工抽检
10 条复核,**10/10 一致**)。
- **脏数据实录**(源集本身为众包标注合成,未做清洗,如实保留):
- 职务与工作内容常不匹配(如职务"司机"但工作内容是后端开发);
- 学位/毕业时间逻辑混乱(一人多个博士学位、时间倒挂);
- 项目名称多为社科课题名,与技术内容无关;
- 技能标注口径 = "文本中出现的词表技能",与简历主人实际水平无关。
### batch_demo_resumes(批量演示素材)
- 从 5001 条中按"筛选结果=通过"过滤,覆盖 10+ 类意向岗位(算法/前端/后端/测试/数据/
运维/云计算/移动开发/全栈/数据分析等)抽 32 条;
- 按 姓名/性别/手机/邮箱/求职意向/教育背景/技能清单(技术栈+熟练度)/自我评价 渲染;
- **落盘前过 `mask_text`**:手机→`150****79`、邮箱→`j***@gmail.com`、姓名→`张*`。
原始 CSV 与未脱敏文本一律不得写入 data/(有测试守卫)。
## 评测
`scripts/evaluate.py` 新增两个独立维度(控制台分行打印,`reports/metrics.json`
新增 `real_jd` / `real_jd_500` / `real_resume` 小节):
- `真实 JD(AutoWeakS 初标+抽检)`:jd_sample.jsonl 重新抽取 vs gold_answers.json,
字段级 micro-F1(required_skills 0.7 / preferred_skills 0.2 / scenarios 0.1,
空口径字段不参与并按剩余权重归一);
- `真实 JD(500 条分层)`:jd_eval_500.jsonl 重新抽取 vs gold_answers_500.json,
同一口径,包含原 200 条,另按岗位类别分层补 300 条;
- `真实简历(AIStudio CC0)`:200 份解析 vs gold.json,姓名/电话命中率(脱敏形态比对)
+ 技能 F1(双方均无词表技能的简历记完全一致 F1=1)。
实测:真实 JD 技能 F1 ≈ 99.9%(目标 ≥80%),真实姓名命中 100%、电话命中 100%。