mauricett/lichess_sf
收藏数据集概述
数据集名称
Lichess Games With Stockfish Analysis
数据集描述
该数据集是Lichess数据库的精简版本,仅包含具有Stockfish评估的游戏。目前,数据集包含2023年全年的游戏,总计超过1亿局游戏和超过20亿个局面。游戏以比原始PGN数据更快的处理格式存储。
数据格式
每个样本包含一局完整的国际象棋游戏,以字典形式存储,包含以下键:
example[fens]- 一个FEN列表,格式稍作简化,缺少半移动时钟和全移动数。起始位置已被排除。example[moves]- 一个UCI格式的移动列表。example[moves][42]是导致example[fens][42]位置的移动。example[scores]- 一个Stockfish评估列表(以百分之一 pawn为单位),以及游戏的最终结果条件(如果有)。评估是从下一个移动玩家的角度进行的。如果example[fens][42]是黑方的回合,example[scores][42]将是黑方的视角。如果游戏以终端条件结束,列表的最后一个元素是字符串 C(将死)、S(逼和)或 I(不足材料)。具有其他结果条件的游戏已被排除。example[WhiteElo], example[BlackElo]- 玩家的Elo评分。
数据加载
数据集支持流式加载,无需本地存储(当前约100GB)。加载数据集需要设置 trust_remote_code=True 以执行自定义数据加载脚本。
py
加载数据集
dataset = load_dataset(path="mauricett/lichess_sf", split="train", streaming=True, trust_remote_code=True)
数据预处理
用户需要定义自己的函数来将数据转换为所需格式。以下是一个示例预处理函数:
py
示例预处理函数
def preprocess(example, tokenizer, score_fn): max_ply = len(example[moves]) random_position = random.randint(0, max_ply-2) fen = example[fens][random_position] move = example[moves][random_position + 1] score = example[scores][random_position + 1] example[fens] = tokenizer(fen) example[moves] = tokenizer(move) example[scores] = score_fn(score) return example
数据集操作
使用 dataset.shuffle() 进行数据集洗牌,使用 dataset.map() 应用预处理函数。
py
数据集洗牌和预处理
dataset = dataset.shuffle(seed=42) dataset = dataset.map(preprocess, fn_kwargs={tokenizer: tokenizer, score_fn: score_fn})
完整示例
以下是一个完整的示例代码,展示了如何加载、预处理和使用数据集:
py import random from datasets import load_dataset from torch.utils.data import DataLoader
class Tokenizer: def init(self): pass def call(self, example): return example
def score_fn(score): return score
def preprocess(example, tokenizer, score_fn): max_ply = len(example[moves]) random_position = random.randint(0, max_ply-2) fen = example[fens][random_position] move = example[moves][random_position + 1] score = example[scores][random_position + 1] example[fens] = tokenizer(fen) example[moves] = tokenizer(move) example[scores] = score_fn(score) return example
tokenizer = Tokenizer()
dataset = load_dataset(path="mauricett/lichess_sf", split="train", streaming=True, trust_remote_code=True)
dataset = dataset.shuffle(seed=42) dataset = dataset.map(preprocess, fn_kwargs={tokenizer: tokenizer, score_fn: score_fn})
dataloader = DataLoader(dataset, batch_size=1, num_workers=1)
for batch in dataloader: print(batch) break



