# Hugging Face Datasets 流式数据：按文档组划分训练验证集，避免同源片段泄漏

## 执行范围

已运行Hugging Face Datasets真实IterableDataset，36片段按12文档稳定分组且训练/验证无同源交集；未下载远端数据集或训练模型。

## 输入与目标

原创20文档各3片段的JSONL，含相同文档非相邻片段

交付：两组可重建数据清单、分片记录和泄漏对照

## 运行

在 reference 目录执行；先按文件 requirements.txt / package.json 或原生工具文档安装依赖。浏览器练习需 `npx playwright install chromium`；也可设置 `PLAYWRIGHT_EXECUTABLE_PATH` 为自己的 Chrome 路径。

```sh
python split.py
```

## 目录

- fixtures：作者原创输入，不包含用户真实资料。
- starter：读者待完成任务。
- reference：作者完成参考。
- results：作者实际运行所得或明确标注的待运行输入/预期合同。

## 七步

1. **定义同源关系**

原创12份文档各拆3段，共36行，doc_id表示同源。先明确同源文档不能横跨训练和验证，再考虑行数比例。

2. **打开原生流**

用load_dataset json streaming=True读取本地JSONL，真实对象是IterableDataset，不先整体转换成普通列表再声称流式。

3. **使用稳定分组键**

对doc_id做SHA稳定分配，所有chunk_id沿用同一文档归属。不要使用跨进程随机化的Python hash作为永久划分合同。

4. **写入两个分片**

边迭代边将文档归属的行写入训练或验证，保留doc_id/chunk_id。验证集合必须非空，丢行与重复行都应报错。

5. **检查泄漏交集**

计算训练doc_id与验证doc_id交集，本题为空；总行数仍为36。没有交集只是本题分组边界，不证明所有语义近似都无泄漏。

6. **运行错误对照**

按行号轮流切分时，多份文档同时进入两边。真实报告列出这些同源ID，让“随机切行也没问题”的误区可见。

7. **交付分组证据**

保存train/validation JSONL与split-report，换进程重跑归属应一致。模型训练或远程下载均不在本题执行范围。

## 来源

- https://huggingface.co/docs/datasets/stream


## 原生工具与边界补充

仅使用本地作者JSONL，设置本地HF_HOME可将Datasets缓存放在自有运行目录。不会从HF下载数据或模型。
