100 lines
8.0 KiB
Markdown
100 lines
8.0 KiB
Markdown
# 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%。
|