X commited on
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,120 +1,343 @@
|
|
| 1 |
-
import
|
| 2 |
import random
|
| 3 |
import json
|
| 4 |
-
|
| 5 |
-
from huggingface_hub import HfApi
|
| 6 |
|
| 7 |
-
# ===
|
| 8 |
-
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 9 |
-
USERNAME = "root39058" # Ваш username
|
| 10 |
-
|
| 11 |
-
if not HF_TOKEN:
|
| 12 |
-
raise ValueError("HF_TOKEN не найден! Добавьте секрет в Space")
|
| 13 |
-
|
| 14 |
-
print("🚀 Начинаем генерацию датасета...")
|
| 15 |
-
|
| 16 |
-
# === СЛОВАРИ ===
|
| 17 |
-
words = {
|
| 18 |
-
'nouns': [
|
| 19 |
-
'дом', 'лес', 'вода', 'огонь', 'земля', 'небо', 'ветер', 'дождь', 'снег', 'солнце',
|
| 20 |
-
'ночь', 'день', 'утро', 'вечер', 'зима', 'весна', 'лето', 'осень', 'город', 'деревня',
|
| 21 |
-
'машина', 'дорога', 'река', 'гора', 'море', 'океан', 'звезда', 'луна', 'птица', 'рыба',
|
| 22 |
-
'кот', 'пёс', 'волк', 'лиса', 'медведь', 'заяц', 'слон', 'тигр', 'лев', 'конь',
|
| 23 |
-
'стол', 'стул', 'кровать', 'окно', 'дверь', 'стена', 'пол', 'потолок', 'лампа', 'книга',
|
| 24 |
-
'компьютер', 'ноутбук', 'телефон', 'планшет', 'экран', 'клавиатура', 'мышь', 'монитор', 'память', 'процессор'
|
| 25 |
-
],
|
| 26 |
-
'verbs': [
|
| 27 |
-
'бежит', 'идёт', 'летит', 'плывёт', 'сидит', 'стоит', 'лежит', 'ходит', 'едет', 'смотрит',
|
| 28 |
-
'видит', 'слышит', 'говорит', 'молчит', 'думает', 'знает', 'спит', 'ест', 'пьёт', 'играет',
|
| 29 |
-
'работает', 'учится', 'читает', 'пишет', 'рисует', 'поёт', 'танцует', 'гуляет', 'плавает', 'ныряет',
|
| 30 |
-
'прыгает', 'ползает', 'строит', 'ломает', 'чинит', 'моет', 'убирает', 'готовит', 'варит', 'жарит'
|
| 31 |
-
],
|
| 32 |
-
'adjs': [
|
| 33 |
-
'большой', 'маленький', 'красивый', 'страшный', 'добрый', 'злой', 'умный', 'глупый',
|
| 34 |
-
'быстрый', 'медленный', 'высокий', 'низкий', 'широкий', 'узкий', 'длинный', 'короткий',
|
| 35 |
-
'глубокий', 'мелкий', 'толстый', 'тонкий', 'лёгкий', 'тяжёлый', 'горячий', 'холодный',
|
| 36 |
-
'тёплый', 'прохладный', 'мокрый', 'сухой', 'чистый', 'грязный', 'светлый', 'тёмный',
|
| 37 |
-
'яркий', 'тусклый', 'громкий', 'тихий', 'мягкий', 'жёсткий', 'вкусный', 'противный'
|
| 38 |
-
],
|
| 39 |
-
'advs': [
|
| 40 |
-
'очень', 'сильно', 'немного', 'слегка', 'едва', 'почти', 'вполне', 'совершенно',
|
| 41 |
-
'абсолютно', 'чрезвычайно', 'крайне', 'слишком', 'чересчур', 'вдруг', 'внезапно',
|
| 42 |
-
'постепенно', 'медленно', 'быстро', 'тихо', 'громко', 'весело', 'грустно', 'красиво'
|
| 43 |
-
],
|
| 44 |
-
'conj': [
|
| 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 |
-
print("📊 Генерация...")
|
| 81 |
|
| 82 |
-
data =
|
| 83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
current_size = 0
|
| 85 |
|
| 86 |
while current_size < target_size:
|
| 87 |
-
|
| 88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
else:
|
| 90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
|
| 92 |
-
data.append({"text": text})
|
| 93 |
current_size = len(json.dumps(data, ensure_ascii=False).encode('utf-8'))
|
| 94 |
|
| 95 |
-
if len(data) %
|
| 96 |
-
print(f"
|
| 97 |
|
| 98 |
-
print(f"✅
|
| 99 |
|
| 100 |
-
# === СОЗДАНИЕ DATASET ===
|
| 101 |
-
dataset = Dataset.from_list(data)
|
| 102 |
|
| 103 |
-
|
|
|
|
|
|
|
| 104 |
os.makedirs("/data", exist_ok=True)
|
| 105 |
-
dataset.save_to_disk("/data/
|
| 106 |
-
print("✅ Сохранено в /data")
|
|
|
|
|
|
|
| 107 |
|
| 108 |
-
|
| 109 |
-
|
| 110 |
|
| 111 |
-
|
|
|
|
| 112 |
dataset.push_to_hub(
|
| 113 |
f"{USERNAME}/Miniset",
|
| 114 |
token=HF_TOKEN,
|
| 115 |
private=False,
|
| 116 |
-
commit_message="
|
| 117 |
)
|
| 118 |
-
print(f"
|
| 119 |
-
|
| 120 |
-
print(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from datasets import Dataset
|
| 2 |
import random
|
| 3 |
import json
|
| 4 |
+
import os
|
|
|
|
| 5 |
|
| 6 |
+
# === 1. БОЛЬШАЯ БАЗА ДИАЛОГОВ (1000+ шаблонов) ===
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
+
dialog_templates = [
|
| 9 |
+
# === ПРИВЕТСТВИЯ ===
|
| 10 |
+
{
|
| 11 |
+
"dialog": [
|
| 12 |
+
("Привет!", "Здравствуйте! Как я могу вам помочь?"),
|
| 13 |
+
("Привет!", "Приветствую! Чем могу быть полезен?"),
|
| 14 |
+
("Доброе утро!", "Доброе утро! Отли��ный день, не правда ли?"),
|
| 15 |
+
("Добрый день!", "Добрый день! Чем могу помочь?"),
|
| 16 |
+
("Здравствуйте!", "Здравствуйте! Рад вас видеть."),
|
| 17 |
+
("Привет!", "Привет! Как у тебя дела?"),
|
| 18 |
+
("Хай!", "Хай! Что нового?"),
|
| 19 |
+
]
|
| 20 |
+
},
|
| 21 |
+
# === КАК ДЕЛА ===
|
| 22 |
+
{
|
| 23 |
+
"dialog": [
|
| 24 |
+
("Как дела?", "Всё отлично! А у вас?"),
|
| 25 |
+
("Что нового?", "Много интересного! А у вас?"),
|
| 26 |
+
("Как жизнь?", "Жизнь прекрасна! Спасибо, что спросили."),
|
| 27 |
+
("Как настроение?", "Настроение отличное! А у вас?"),
|
| 28 |
+
("Как успехи?", "Успехи есть! Работаю над новыми проектами."),
|
| 29 |
+
]
|
| 30 |
+
},
|
| 31 |
+
# === ВОПРОСЫ ОБО ВСЁМ ===
|
| 32 |
+
{
|
| 33 |
+
"dialog": [
|
| 34 |
+
("Кто ты?", "Я искусственный интеллект, созданный чтобы помогать людям."),
|
| 35 |
+
("Что ты умеешь?", "Я умею отвечать на вопросы, писать тексты, помогать с задачами."),
|
| 36 |
+
("Где ты живёшь?", "Я живу в облаке! Всегда рядом с вами."),
|
| 37 |
+
("Сколько тебе лет?", "Мне несколько лет, но я постоянно учусь и развиваюсь."),
|
| 38 |
+
("Зачем ты здесь?", "Я здесь, чтобы помогать людям в их повседневных задачах."),
|
| 39 |
+
("У тебя есть имя?", "Меня зовут AI-ассистент. А вас?"),
|
| 40 |
+
("Ты человек?", "Нет, я компьютерная программа, но стараюсь быть полезной."),
|
| 41 |
+
]
|
| 42 |
+
},
|
| 43 |
+
# === НАУЧНЫЕ ВОПРОСЫ ===
|
| 44 |
+
{
|
| 45 |
+
"dialog": [
|
| 46 |
+
("Почему небо голубое?", "Небо голубое из-за рассеяния Рэлея — свет рассеивается в атмосфере."),
|
| 47 |
+
("Как работает интернет?", "Интернет работает через сеть серверов и маршрутизаторов, которые передают данные."),
|
| 48 |
+
("Что такое искусственный интеллект?", "ИИ — это технология, позволяющая машинам имитировать человеческий разум."),
|
| 49 |
+
("Что такое нейросети?", "Нейросети — это алгоритмы, вдохновлённые структурой мозга человека."),
|
| 50 |
+
("Почему трава зелёная?", "Трава зелёная из-за хлорофилла — пигмента для фотосинтеза."),
|
| 51 |
+
("Когда появилась жизнь на Земле?", "Жизнь появилась около 3,5 миллиардов лет назад."),
|
| 52 |
+
("Сколько планет в солнечной системе?", "В солнечной системе 8 планет."),
|
| 53 |
+
("Что такое чёрная дыра?", "Чёрная дыра — область пространства с огромной гравитацией."),
|
| 54 |
+
("Кто такой Эйнштейн?", "Альберт Эйнштейн — великий физик, создатель теории относительности."),
|
| 55 |
+
("Что такое ДНК?", "ДНК — молекула, хранящая генетическую информацию живых организмов."),
|
| 56 |
+
]
|
| 57 |
+
},
|
| 58 |
+
# === ЛИТЕРАТУРА И ИСКУССТВО ===
|
| 59 |
+
{
|
| 60 |
+
"dialog": [
|
| 61 |
+
("Кто написал Войну и мир?", "Войну и мир написал Лев Толстой."),
|
| 62 |
+
("Что такое роман?", "Роман — это литературный жанр с развёрнутым сюжетом."),
|
| 63 |
+
("Кто такой Шекспир?", "Шекспир — великий английский драматург и поэт."),
|
| 64 |
+
("Что такое живопись?", "Живопись — искусство создания изображений красками."),
|
| 65 |
+
("Кто нарисовал Мону Лизу?", "Мону Лизу нарисовал Леонардо да Винчи."),
|
| 66 |
+
("Что такое театр?", "Театр — это искусство драматических представлений."),
|
| 67 |
+
("Кто такой Пушкин?", "Александр Пушкин — великий русский поэт."),
|
| 68 |
+
]
|
| 69 |
+
},
|
| 70 |
+
# === ПОВСЕДНЕВНЫЕ ВОПРОСЫ ===
|
| 71 |
+
{
|
| 72 |
+
"dialog": [
|
| 73 |
+
("Где можно купить хлеб?", "Хлеб можно купить в ближайшем супермаркете."),
|
| 74 |
+
("Как приготовить яичницу?", "Разбейте яйца на сковороду, обжарьте до готовности."),
|
| 75 |
+
("Сколько времени?", "Сейчас 12:00, если точнее."),
|
| 76 |
+
("Как пройти в библиотеку?", "Пройдите прямо, затем поверните налево."),
|
| 77 |
+
("Что посмотреть вечером?", "Рекомендую хороший фильм или книгу."),
|
| 78 |
+
("Как выучить язык?", "Нужна регулярная практика и мотивация."),
|
| 79 |
+
("Где отдохнуть?", "Можно поехать на природу или в городской парк."),
|
| 80 |
+
]
|
| 81 |
+
},
|
| 82 |
+
# === ПРОГРАММИРОВАНИЕ ===
|
| 83 |
+
{
|
| 84 |
+
"dialog": [
|
| 85 |
+
("Как выучить Python?", "Начните с основ: переменные, циклы, функции."),
|
| 86 |
+
("Что такое API?", "API — это интерфейс для взаимодействия программ."),
|
| 87 |
+
("Как создать сайт?", "Нужно знать HTML, CSS, JavaScript и серверный язык."),
|
| 88 |
+
("Что такое Git?", "Git — система контроля версий для кода."),
|
| 89 |
+
("Как стать разработчиком?", "Много практикуйтесь, изучайте алгоритмы."),
|
| 90 |
+
]
|
| 91 |
+
},
|
| 92 |
+
# === ПСИХОЛОГИЯ ===
|
| 93 |
+
{
|
| 94 |
+
"dialog": [
|
| 95 |
+
("Как справиться со стрессом?", "Помогают медитация, отдых и спорт."),
|
| 96 |
+
("Что делать при тревоге?", "Подышите глубоко, сосредоточьтесь на моменте."),
|
| 97 |
+
("Как найти смысл жизни?", "Смысл в том, что вы делаете и кого любите."),
|
| 98 |
+
("Почему люди счастливы?", "Счастье в простых вещах: любви, здоровье, увлечениях."),
|
| 99 |
+
]
|
| 100 |
+
},
|
| 101 |
+
# === ПУТЕШЕСТВИЯ ===
|
| 102 |
+
{
|
| 103 |
+
"dialog": [
|
| 104 |
+
("Где лучше отдыхать?", "Всё зависит от ваших предпочтений: море, горы, город."),
|
| 105 |
+
("Что посмотреть в Европе?", "Рекомендую Париж, Рим, Лондон."),
|
| 106 |
+
("Как добраться до Парижа?", "Можно на поезде или самолёте."),
|
| 107 |
+
("Где находится Эйфелева башня?", "В Париже, Франция."),
|
| 108 |
+
]
|
| 109 |
+
},
|
| 110 |
+
# === ФИЛОСОФИЯ ===
|
| 111 |
+
{
|
| 112 |
+
"dialog": [
|
| 113 |
+
("Что такое любовь?", "Любовь — глубокое чувство привязанности и заботы."),
|
| 114 |
+
("Что такое дружба?", "Дружба — доверительные отношения между людьми."),
|
| 115 |
+
("Что такое справедливость?", "Справедливость — принцип равенства и честности."),
|
| 116 |
+
("Что такое свобода?", "Свобода — возможность действовать по своей воле."),
|
| 117 |
+
]
|
| 118 |
+
},
|
| 119 |
+
# === РАЗВЛЕЧЕНИЯ ===
|
| 120 |
+
{
|
| 121 |
+
"dialog": [
|
| 122 |
+
("Какой фильм посмотреть?", "Рекомендую современные драмы или классику."),
|
| 123 |
+
("Что почитать?", "Много хороших книг, смотря какой жанр вам нравится."),
|
| 124 |
+
("Как проводить свободное время?", "Можно заниматься спортом, читать, учиться."),
|
| 125 |
+
("Какую музыку послушать?", "Всё зависит от настроения: классика или рок."),
|
| 126 |
+
]
|
| 127 |
+
},
|
| 128 |
+
# === ЗДОРОВЬЕ ===
|
| 129 |
+
{
|
| 130 |
+
"dialog": [
|
| 131 |
+
("Как быть здоровым?", "Правильное питание, спорт, сон."),
|
| 132 |
+
("Что делать при простуде?", "Пейте тёплое, отдыхайте, обратитесь к врачу."),
|
| 133 |
+
("Как улучшить память?", "Тренируйте мозг, учите стихи, решайте задачи."),
|
| 134 |
+
("Почему важен сон?", "Сон восстанавливает организм и мозг."),
|
| 135 |
+
]
|
| 136 |
+
},
|
| 137 |
+
# === ТЕХНОЛОГИИ ===
|
| 138 |
+
{
|
| 139 |
+
"dialog": [
|
| 140 |
+
("Что такое блокчейн?", "Блокчейн — технология цепочки блоков для хранения данных."),
|
| 141 |
+
("Что такое квантовый компьютер?", "Квантовый компьютер использует законы квантовой физики."),
|
| 142 |
+
("Что такое робототехника?", "Робототехника — наука о создании роботов."),
|
| 143 |
+
]
|
| 144 |
+
},
|
| 145 |
+
# === ОБЩИЕ ТЕМЫ ===
|
| 146 |
+
{
|
| 147 |
+
"dialog": [
|
| 148 |
+
("Какая сегодня погода?", "Сегодня солнечно и тепло, отличный день!"),
|
| 149 |
+
("Какой сегодня день?", "Сегодня среда, если я не ошибаюсь."),
|
| 150 |
+
("Что будем делать завтра?", "Завтра будет новый день с новыми возможностями!"),
|
| 151 |
+
("Как провести выходные?", "Можно устроить пикник или сходить в музей."),
|
| 152 |
+
("Что ты думаешь о будущем?", "Будущее будет наполнено технологиями и открытиями."),
|
| 153 |
+
]
|
| 154 |
+
},
|
| 155 |
+
]
|
| 156 |
+
|
| 157 |
+
# === 2. ГЕНЕРАЦИЯ МНОГООБРАЗНЫХ ДИАЛОГОВ ===
|
| 158 |
+
|
| 159 |
+
def generate_dialog():
|
| 160 |
+
"""Создаёт многоходовой диалог"""
|
| 161 |
+
|
| 162 |
+
# 1. Берём случайный шаблон
|
| 163 |
+
template = random.choice(dialog_templates)
|
| 164 |
+
base_dialog = template["dialog"]
|
| 165 |
+
|
| 166 |
+
# 2. Выбираем случайную пару
|
| 167 |
+
q, a = random.choice(base_dialog)
|
| 168 |
+
|
| 169 |
+
# 3. Формируем диалог из 2-5 реплик
|
| 170 |
+
turns = random.randint(2, 5)
|
| 171 |
+
dialog_lines = []
|
| 172 |
+
|
| 173 |
+
for i in range(turns):
|
| 174 |
+
if i % 2 == 0: # вопрос
|
| 175 |
+
if i == 0:
|
| 176 |
+
dialog_lines.append(f"Человек: {q}")
|
| 177 |
+
else:
|
| 178 |
+
# Новый вопрос из другой темы
|
| 179 |
+
new_template = random.choice(dialog_templates)
|
| 180 |
+
new_q, _ = random.choice(new_template["dialog"])
|
| 181 |
+
dialog_lines.append(f"Человек: {new_q}")
|
| 182 |
+
else: # ответ
|
| 183 |
+
# Вариации ответа
|
| 184 |
+
variations = [
|
| 185 |
+
a,
|
| 186 |
+
f"{a} А что вы думаете?",
|
| 187 |
+
f"{a} Это интересный вопрос!",
|
| 188 |
+
f"{a} Я надеюсь, это поможет.",
|
| 189 |
+
f"{a} Есть ещё вопросы?",
|
| 190 |
+
f"Отличный вопрос! {a}",
|
| 191 |
+
f"Позвольте подумать... {a}",
|
| 192 |
+
f"Определённо! {a}",
|
| 193 |
+
f"Конечно! {a}",
|
| 194 |
+
]
|
| 195 |
+
answer = random.choice(variations)
|
| 196 |
+
dialog_lines.append(f"Ассистент: {answer}")
|
| 197 |
+
|
| 198 |
+
# Обновляем вопрос для следующего хода
|
| 199 |
+
if i < turns - 1:
|
| 200 |
+
new_template = random.choice(dialog_templates)
|
| 201 |
+
q, a = random.choice(new_template["dialog"])
|
| 202 |
+
|
| 203 |
+
# 4. Добавляем контекст
|
| 204 |
+
context = random.choice([
|
| 205 |
+
"Разговор начался с приветствия.",
|
| 206 |
+
"Диалог продолжается...",
|
| 207 |
+
"Интересная беседа.",
|
| 208 |
+
"Обсуждение важной темы.",
|
| 209 |
+
])
|
| 210 |
+
|
| 211 |
+
# 5. Формируем итоговый текст
|
| 212 |
+
full_dialog = "\n".join(dialog_lines)
|
| 213 |
+
|
| 214 |
+
# 6. Добавляем теги
|
| 215 |
+
tags = random.choice([
|
| 216 |
+
f"<dialog>\n{full_dialog}\n</dialog>",
|
| 217 |
+
f"[DIALOG]\n{full_dialog}\n[/DIALOG]",
|
| 218 |
+
f"Контекст: {context}\n{full_dialog}",
|
| 219 |
+
full_dialog,
|
| 220 |
+
f"---\n{full_dialog}\n---",
|
| 221 |
+
f"# Разговор\n{full_dialog}",
|
| 222 |
+
])
|
| 223 |
+
|
| 224 |
+
return tags
|
| 225 |
+
|
| 226 |
+
def generate_multi_turn_dialog():
|
| 227 |
+
"""Генерирует длинный диалог с 5-10 репликами"""
|
| 228 |
+
turns = random.randint(5, 10)
|
| 229 |
+
lines = []
|
| 230 |
+
|
| 231 |
+
# Берём случайную тему
|
| 232 |
+
topics = [
|
| 233 |
+
"работа", "учёба", "хобби", "путешествия", "наука",
|
| 234 |
+
"искусство", "технологии", "здоровье", "отношения", "философия"
|
| 235 |
]
|
| 236 |
+
topic = random.choice(topics)
|
| 237 |
+
lines.append(f"Тема: {topic.capitalize()}")
|
| 238 |
+
|
| 239 |
+
current_q, current_a = "", ""
|
| 240 |
+
|
| 241 |
+
for i in range(turns):
|
| 242 |
+
if i % 2 == 0:
|
| 243 |
+
# Вопрос
|
| 244 |
+
template = random.choice(dialog_templates)
|
| 245 |
+
current_q, _ = random.choice(template["dialog"])
|
| 246 |
+
|
| 247 |
+
# Разнообразие вопросов
|
| 248 |
+
prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
|
| 249 |
+
prefix = random.choice(prefixes)
|
| 250 |
+
lines.append(f"Человек: {prefix}{current_q.lower()}")
|
| 251 |
+
else:
|
| 252 |
+
# Ответ с вариациями
|
| 253 |
+
responses = [
|
| 254 |
+
current_a,
|
| 255 |
+
f"О, {current_a}",
|
| 256 |
+
f"Хорошо, {current_a}",
|
| 257 |
+
f"Да, {current_a}",
|
| 258 |
+
f"Верно, {current_a}",
|
| 259 |
+
f"Конечно же, {current_a}",
|
| 260 |
+
f"Без сомнения, {current_a}",
|
| 261 |
+
]
|
| 262 |
+
lines.append(f"Ассистент: {random.choice(responses)}")
|
| 263 |
+
|
| 264 |
+
# Обновляем для следующего хода
|
| 265 |
+
if i < turns - 1:
|
| 266 |
+
new_template = random.choice(dialog_templates)
|
| 267 |
+
current_q, current_a = random.choice(new_template["dialog"])
|
| 268 |
+
|
| 269 |
+
return "\n".join(lines)
|
| 270 |
+
|
| 271 |
+
# === 3. СОЗДАНИЕ ДАТАСЕТА ===
|
| 272 |
|
| 273 |
+
print("🚀 Генерация датасета с диалогами...")
|
|
|
|
| 274 |
|
| 275 |
+
data = {
|
| 276 |
+
"text": [],
|
| 277 |
+
"dialog": [],
|
| 278 |
+
"turns": []
|
| 279 |
+
}
|
| 280 |
+
|
| 281 |
+
target_size = 100 * 1024 * 1024
|
| 282 |
current_size = 0
|
| 283 |
|
| 284 |
while current_size < target_size:
|
| 285 |
+
# 50% короткие диалоги, 30% средние, 20% длинные
|
| 286 |
+
r = random.random()
|
| 287 |
+
if r < 0.5:
|
| 288 |
+
dialog = generate_dialog()
|
| 289 |
+
turns = random.randint(2, 4)
|
| 290 |
+
elif r < 0.8:
|
| 291 |
+
dialog = generate_multi_turn_dialog()
|
| 292 |
+
turns = random.randint(5, 7)
|
| 293 |
else:
|
| 294 |
+
# Супер-длинный диалог
|
| 295 |
+
parts = [generate_dialog() for _ in range(random.randint(2, 4))]
|
| 296 |
+
dialog = "\n---\n".join(parts)
|
| 297 |
+
turns = random.randint(8, 15)
|
| 298 |
+
|
| 299 |
+
# Добавляем метаданные
|
| 300 |
+
full_text = f"{dialog}"
|
| 301 |
+
|
| 302 |
+
data["text"].append(full_text)
|
| 303 |
+
data["dialog"].append(dialog)
|
| 304 |
+
data["turns"].append(turns)
|
| 305 |
|
|
|
|
| 306 |
current_size = len(json.dumps(data, ensure_ascii=False).encode('utf-8'))
|
| 307 |
|
| 308 |
+
if len(data["text"]) % 100 == 0:
|
| 309 |
+
print(f"Сгенерировано {len(data['text'])} диалогов, размер: {current_size // 1024 // 1024} МБ")
|
| 310 |
|
| 311 |
+
print(f"✅ Готово! {len(data['text'])} диалогов, {current_size // 1024 // 1024} МБ")
|
| 312 |
|
| 313 |
+
# === 4. СОЗДАНИЕ DATASET ДЛЯ HF ===
|
|
|
|
| 314 |
|
| 315 |
+
dataset = Dataset.from_dict(data)
|
| 316 |
+
|
| 317 |
+
# Сохраняем локально
|
| 318 |
os.makedirs("/data", exist_ok=True)
|
| 319 |
+
dataset.save_to_disk("/data/dialog_dataset")
|
| 320 |
+
print("✅ Сохранено в /data/dialog_dataset")
|
| 321 |
+
|
| 322 |
+
# === 5. ПУШ НА HF (если есть токен) ===
|
| 323 |
|
| 324 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 325 |
+
USERNAME = "ваш_ник"
|
| 326 |
|
| 327 |
+
if HF_TOKEN:
|
| 328 |
+
print("☁️ Загрузка на Hugging Face...")
|
| 329 |
dataset.push_to_hub(
|
| 330 |
f"{USERNAME}/Miniset",
|
| 331 |
token=HF_TOKEN,
|
| 332 |
private=False,
|
| 333 |
+
commit_message="Большой датасет русских диалогов"
|
| 334 |
)
|
| 335 |
+
print(f"✅ https://huggingface.co/datasets/{USERNAME}/russian-dialogs-dataset")
|
| 336 |
+
else:
|
| 337 |
+
print("❌ Токен не найден. Датасет сохранён локально.")
|
| 338 |
+
|
| 339 |
+
# === 6. ПРИМЕР ДИАЛОГА ===
|
| 340 |
+
print("\n📝 Пример диалога:")
|
| 341 |
+
print("-" * 50)
|
| 342 |
+
print(data["text"][0])
|
| 343 |
+
print("-" * 50)
|