File size: 4,774 Bytes
e98fa09
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""
prepare_data.py — скачивает датасет и готовит .txt файлы для обучения.
Использует датасет текстов песен с HuggingFace (не требует токена).
"""

import os
from pathlib import Path

TRAIN_DIR = Path("data/train")
VAL_DIR = Path("data/val")

TRAIN_DIR.mkdir(parents=True, exist_ok=True)
VAL_DIR.mkdir(parents=True, exist_ok=True)

# Если данные уже есть — пропускаем
train_files = list(TRAIN_DIR.glob("*.txt"))
if train_files:
    print(f"[Data] Данные уже есть ({len(train_files)} файлов). Пропускаем скачивание.")
    exit(0)

print("[Data] Скачиваем датасет...")

try:
    from datasets import load_dataset

    # Датасет текстов песен — английский, публичный, без авторизации
    # ~400k песен, каждая со словами
    ds = load_dataset(
        "MB24/genius-lyrics",  # публичный датасет текстов песен
        split="train",
        trust_remote_code=True,
    )

    print(f"[Data] Загружено {len(ds)} записей")

    # Берём первые 50k для обучения, 5k для валидации
    train_texts = []
    val_texts = []

    for i, item in enumerate(ds):
        # Поле с текстом песни
        lyrics = item.get("lyrics") or item.get("text") or item.get("content") or ""
        if not lyrics or len(lyrics) < 50:
            continue

        # Чистим текст
        text = lyrics.strip() + "\n\n"

        if i % 10 == 0:
            val_texts.append(text)
        else:
            train_texts.append(text)

        if len(train_texts) >= 50000:
            break

    print(f"[Data] Train: {len(train_texts)}, Val: {len(val_texts)}")

    # Сохраняем чанками по 5000 записей в файл
    chunk_size = 5000
    for chunk_i, start in enumerate(range(0, len(train_texts), chunk_size)):
        chunk = train_texts[start:start + chunk_size]
        out_path = TRAIN_DIR / f"genius_train_{chunk_i:03d}.txt"
        out_path.write_text("".join(chunk), encoding="utf-8")
        print(f"[Data] Записан {out_path} ({len(chunk)} текстов)")

    val_path = VAL_DIR / "genius_val.txt"
    val_path.write_text("".join(val_texts[:1000]), encoding="utf-8")
    print(f"[Data] Записан {val_path}")

except Exception as e:
    print(f"[Data] Ошибка загрузки датасета: {e}")
    print("[Data] Пробуем альтернативный датасет...")

    try:
        from datasets import load_dataset

        # Запасной вариант — WikiText на русском/английском
        ds = load_dataset("wikimedia/wikipedia", "20231101.ru", split="train", streaming=True, trust_remote_code=True)

        train_texts = []
        val_texts = []

        for i, item in enumerate(ds):
            text = item.get("text", "").strip()
            if len(text) < 100:
                continue
            text = text[:2000] + "\n\n"  # берём первые 2000 символов статьи

            if i % 10 == 0:
                val_texts.append(text)
            else:
                train_texts.append(text)

            if len(train_texts) >= 20000:
                break

        chunk_size = 5000
        for chunk_i, start in enumerate(range(0, len(train_texts), chunk_size)):
            chunk = train_texts[start:start + chunk_size]
            out_path = TRAIN_DIR / f"wiki_train_{chunk_i:03d}.txt"
            out_path.write_text("".join(chunk), encoding="utf-8")

        val_path = VAL_DIR / "wiki_val.txt"
        val_path.write_text("".join(val_texts[:500]), encoding="utf-8")
        print(f"[Data] Wikipedia датасет загружен успешно")

    except Exception as e2:
        print(f"[Data] Ошибка запасного датасета: {e2}")
        print("[Data] Создаём минимальные демо-данные...")

        demo = (
            "Языковая модель обучается на текстах.\n"
            "Нейронные сети — основа современного ИИ.\n"
            "Трансформеры используют механизм внимания.\n"
            "Python — язык для машинного обучения.\n"
        ) * 500

        (TRAIN_DIR / "demo.txt").write_text(demo, encoding="utf-8")
        (VAL_DIR / "demo_val.txt").write_text(demo[:5000], encoding="utf-8")
        print("[Data] Демо-данные созданы.")

print("[Data] Подготовка данных завершена.")