From 643226e252a2fa142969374c784bfc4901f6dd80 Mon Sep 17 00:00:00 2001 From: KMnO4-zx <1021385881@qq.com> Date: Thu, 26 Jun 2025 11:02:10 +0800 Subject: [PATCH] =?UTF-8?q?docs(chapter5):=20=E6=9B=B4=E6=96=B0tokenizer?= =?UTF-8?q?=E8=AE=AD=E7=BB=83=E6=95=B0=E6=8D=AE=E5=8A=A0=E8=BD=BD=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用出门问问序列猴子开源数据集替代wikitext数据集,并添加JSONL文件读取方法 --- docs/chapter5/第五章 动手搭建大模型.md | 44 +++++++++++--------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/docs/chapter5/第五章 动手搭建大模型.md b/docs/chapter5/第五章 动手搭建大模型.md index f4af116..7ba7b21 100644 --- a/docs/chapter5/第五章 动手搭建大模型.md +++ b/docs/chapter5/第五章 动手搭建大模型.md @@ -766,34 +766,26 @@ from typing import Generator #### Step 2: 加载训练数据 -我们使用 `datasets.load_dataset()` 库加载一个英文文本数据集,用于训练 BPE Tokenizer。这里我们使用 `wikitext` 数据集,包含了维基百科的文章文本。 +这里我们使用与预训练相同的数据集(出门问问序列猴子开源数据集)训练tokenizer,可使用`code/download_dataset.sh` 和 `code/deal_dataset.py` 下载和预处理数据集。 + +> 注:由于数据集过大,可能会导致在训练过程中内存不足。因为本项目为学习目的,建议学习者手动分割小部分数据集用于训练验证,笔者也在 Github 仓库中存放了训练好的 tokenizer,可以直接使用。 ```python -dataset = load_dataset("wikitext", "wikitext-103-v1", split="train") - -# 准备训练数据 -def batch_iterator(batch_size=1000): - for i in range(0, len(dataset), batch_size): - yield dataset[i:i + batch_size]["text"] -``` - -如果你使用本地的文本数据集,可以将数据加载到一个列表中,然后传入 `batch_iterator()` 函数中。如下所示: - -```python -def load_text_from_files(path_list): - text_data = [] - for file_path in path_list: - with open(file_path, 'r', encoding='utf-8') as file: - text_data.extend(file.readlines()) - return text_data - -def batch_iterator(text_data, batch_size=1000): - for i in range(0, len(text_data), batch_size): - yield text_data[i:i + batch_size] - -# 假设你的文件路径列表是 -path_list = ['text_data1.txt', 'text_data2.txt', 'text_data3.txt'] -text_data = load_text_from_files(path_list) +def read_texts_from_jsonl(file_path: str) -> Generator[str, None, None]: + """读取JSONL文件并安全提取文本数据""" + with open(file_path, 'r', encoding='utf-8') as f: + for line_num, line in enumerate(f, 1): + try: + data = json.loads(line) + if 'text' not in data: + raise KeyError(f"Missing 'text' field in line {line_num}") + yield data['text'] + except json.JSONDecodeError: + print(f"Error decoding JSON in line {line_num}") + continue + except KeyError as e: + print(e) + continue ``` #### Step 3: 创建配置文件