| import json | |
| import argparse | |
| import multiprocessing as mp | |
| from faker import Faker | |
| import os | |
| import random | |
| def generate_chunk(chunk_id, num_examples, languages, output_dir, chunk_size=10000): | |
| """ | |
| Генерирует чанк датасета. | |
| Если languages — список, то для каждого примера случайно выбирается язык. | |
| """ | |
| fakers = {lang: Faker(lang) for lang in languages} | |
| filename = os.path.join(output_dir, f"chunk_{chunk_id:05d}.jsonl") | |
| with open(filename, 'w', encoding='utf-8') as f: | |
| for _ in range(num_examples): | |
| lang = random.choice(languages) | |
| fake = fakers[lang] | |
| text = fake.paragraph(nb_sentences=random.randint(5, 15), variable_nb_sentences=True) | |
| record = {"text": text, "language": lang} | |
| f.write(json.dumps(record, ensure_ascii=False) + '\n') | |
| return filename | |
| def main(): | |
| parser = argparse.ArgumentParser(description="Генерация мультиязычного синтетического датасета в формате JSONL") | |
| parser.add_argument("--total_examples", type=int, default=1_000_000, | |
| help="Общее количество примеров (текстов) для генерации") | |
| parser.add_argument("--languages", type=str, nargs='+', default=["en_US", "ru_RU", "zh_CN"], | |
| help="Список локалей через пробел (например, en_US ru_RU zh_CN)") | |
| parser.add_argument("--output_dir", type=str, default="./multilingual_dataset", | |
| help="Директория для сохранения чанков") | |
| parser.add_argument("--chunk_size", type=int, default=10000, | |
| help="Количество примеров в одном файле-чанке") | |
| parser.add_argument("--num_workers", type=int, default=4, | |
| help="Количество параллельных процессов для генерации") | |
| args = parser.parse_args() | |
| os.makedirs(args.output_dir, exist_ok=True) | |
| num_chunks = (args.total_examples + args.chunk_size - 1) // args.chunk_size | |
| chunks = [] | |
| for i in range(num_chunks): | |
| start = i * args.chunk_size | |
| end = min(start + args.chunk_size, args.total_examples) | |
| num_in_chunk = end - start | |
| chunks.append((i, num_in_chunk, args.languages, args.output_dir, args.chunk_size)) | |
| pool = mp.Pool(processes=args.num_workers) | |
| results = [] | |
| for chunk in chunks: | |
| results.append(pool.apply_async(generate_chunk, chunk)) | |
| pool.close() | |
| pool.join() | |
| for r in results: | |
| r.get() | |
| print(f"Генерация завершена. Чанки сохранены в {args.output_dir}") | |
| if __name__ == "main": | |
| main() | |