AICreator1 commited on
Commit
e98fa09
·
verified ·
1 Parent(s): b8f43be

Upload prepare_data.py

Browse files
Files changed (1) hide show
  1. prepare_data.py +123 -0
prepare_data.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ prepare_data.py — скачивает датасет и готовит .txt файлы для обучения.
3
+ Использует датасет текстов песен с HuggingFace (не требует токена).
4
+ """
5
+
6
+ import os
7
+ from pathlib import Path
8
+
9
+ TRAIN_DIR = Path("data/train")
10
+ VAL_DIR = Path("data/val")
11
+
12
+ TRAIN_DIR.mkdir(parents=True, exist_ok=True)
13
+ VAL_DIR.mkdir(parents=True, exist_ok=True)
14
+
15
+ # Если данные уже есть — пропускаем
16
+ train_files = list(TRAIN_DIR.glob("*.txt"))
17
+ if train_files:
18
+ print(f"[Data] Данные уже есть ({len(train_files)} файлов). Пропускаем скачивание.")
19
+ exit(0)
20
+
21
+ print("[Data] Скачиваем датасет...")
22
+
23
+ try:
24
+ from datasets import load_dataset
25
+
26
+ # Датасет текстов песен — английский, публичный, без авторизации
27
+ # ~400k песен, каждая со словами
28
+ ds = load_dataset(
29
+ "MB24/genius-lyrics", # публичный датасет текстов песен
30
+ split="train",
31
+ trust_remote_code=True,
32
+ )
33
+
34
+ print(f"[Data] Загружено {len(ds)} записей")
35
+
36
+ # Берём первые 50k для обучения, 5k для валидации
37
+ train_texts = []
38
+ val_texts = []
39
+
40
+ for i, item in enumerate(ds):
41
+ # Поле с текстом песни
42
+ lyrics = item.get("lyrics") or item.get("text") or item.get("content") or ""
43
+ if not lyrics or len(lyrics) < 50:
44
+ continue
45
+
46
+ # Чистим текст
47
+ text = lyrics.strip() + "\n\n"
48
+
49
+ if i % 10 == 0:
50
+ val_texts.append(text)
51
+ else:
52
+ train_texts.append(text)
53
+
54
+ if len(train_texts) >= 50000:
55
+ break
56
+
57
+ print(f"[Data] Train: {len(train_texts)}, Val: {len(val_texts)}")
58
+
59
+ # Сохраняем чанками по 5000 записей в файл
60
+ chunk_size = 5000
61
+ for chunk_i, start in enumerate(range(0, len(train_texts), chunk_size)):
62
+ chunk = train_texts[start:start + chunk_size]
63
+ out_path = TRAIN_DIR / f"genius_train_{chunk_i:03d}.txt"
64
+ out_path.write_text("".join(chunk), encoding="utf-8")
65
+ print(f"[Data] Записан {out_path} ({len(chunk)} текстов)")
66
+
67
+ val_path = VAL_DIR / "genius_val.txt"
68
+ val_path.write_text("".join(val_texts[:1000]), encoding="utf-8")
69
+ print(f"[Data] Записан {val_path}")
70
+
71
+ except Exception as e:
72
+ print(f"[Data] Ошибка загрузки датасета: {e}")
73
+ print("[Data] Пробуем альтернативный датасет...")
74
+
75
+ try:
76
+ from datasets import load_dataset
77
+
78
+ # Запасной вариант — WikiText на русском/английском
79
+ ds = load_dataset("wikimedia/wikipedia", "20231101.ru", split="train", streaming=True, trust_remote_code=True)
80
+
81
+ train_texts = []
82
+ val_texts = []
83
+
84
+ for i, item in enumerate(ds):
85
+ text = item.get("text", "").strip()
86
+ if len(text) < 100:
87
+ continue
88
+ text = text[:2000] + "\n\n" # берём первые 2000 символов статьи
89
+
90
+ if i % 10 == 0:
91
+ val_texts.append(text)
92
+ else:
93
+ train_texts.append(text)
94
+
95
+ if len(train_texts) >= 20000:
96
+ break
97
+
98
+ chunk_size = 5000
99
+ for chunk_i, start in enumerate(range(0, len(train_texts), chunk_size)):
100
+ chunk = train_texts[start:start + chunk_size]
101
+ out_path = TRAIN_DIR / f"wiki_train_{chunk_i:03d}.txt"
102
+ out_path.write_text("".join(chunk), encoding="utf-8")
103
+
104
+ val_path = VAL_DIR / "wiki_val.txt"
105
+ val_path.write_text("".join(val_texts[:500]), encoding="utf-8")
106
+ print(f"[Data] Wikipedia датасет загружен успешно")
107
+
108
+ except Exception as e2:
109
+ print(f"[Data] Ошибка запасного датасета: {e2}")
110
+ print("[Data] Создаём минимальные демо-данные...")
111
+
112
+ demo = (
113
+ "Языковая модель обучается на текстах.\n"
114
+ "Нейронные сети — основа современного ИИ.\n"
115
+ "Трансформеры используют механизм внимания.\n"
116
+ "Python — язык для машинного обучения.\n"
117
+ ) * 500
118
+
119
+ (TRAIN_DIR / "demo.txt").write_text(demo, encoding="utf-8")
120
+ (VAL_DIR / "demo_val.txt").write_text(demo[:5000], encoding="utf-8")
121
+ print("[Data] Демо-данные созданы.")
122
+
123
+ print("[Data] Подготовка данных завершена.")