File size: 3,216 Bytes
7b8da59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
import re
import os

# Пути к файлам
DATA_PATH = "data/dialogues.json"  # Исходный файл
OUTPUT_PATH = "data/training_dataset.jsonl"  # Финальный датасет

def fix_dataset_format(data):
    """
    Исправляет формат диалогов:
    - Убирает stop_dialogue(...)
    - Добавляет стартовый контекст
    - Удаляет дублирующиеся сообщения
    - Сохраняет хотя бы одно сообщение на каждую пару
    """
    fixed_data = []
    total_entries = 0  
    removed_entries = 0  

    for conv in data:
        conversation = conv["dialogue"]
        context = ""
        last_role = None  

        for i, message in enumerate(conversation):
            role = message["role"]
            text = message["message"]

            # Убираем stop_dialogue(...)
            text = re.sub(r'stop_dialogue\(".*?"\)', "", text).strip()

            # Убираем повторное приветствие от sales_bot
            if i == 1 and role == "sales_bot":
                continue

            entry = {
                "question": text if role == "client" else "",
                "context": context,
                "response": text if role == "sales_bot" else ""
            }

            # Добавляем стартовый контекст только 1 раз
            if i == 0:
                context = "<|user|> Клієнт підключився до розмови.\n\n<|assistant|> Вітаю! Я – ШІ школи усного рахунку «Соробан». Чи є у вас хвилинка поспілкуватися?"

            # Обновляем контекст
            context += f"\n\n<|{role}|> {text}"

            # Проверяем, что хотя бы что-то есть (не удаляем всё)
            if entry["question"] or entry["response"]:
                fixed_data.append(entry)
                total_entries += 1
            else:
                removed_entries += 1
                print(f"⚠️ Пропущено сообщение: {entry}")

    print(f"📊 Исходных записей: {len(data)}, итоговых записей: {total_entries}, удалено: {removed_entries}")
    return fixed_data


def preprocess_data():
    """Основной процессинг данных"""
    if not os.path.exists(DATA_PATH):
        raise FileNotFoundError(f"❌ Файл {DATA_PATH} не найден!")

    with open(DATA_PATH, "r", encoding="utf-8") as f:
        raw_data = json.load(f)

    print(f"📂 Загружено {len(raw_data)} диалогов из {DATA_PATH}")

    # Фиксим и форматируем датасет
    fixed_dataset = fix_dataset_format(raw_data)

    # Сохраняем в JSONL
    with open(OUTPUT_PATH, "w", encoding="utf-8") as f_out:
        for entry in fixed_dataset:
            f_out.write(json.dumps(entry, ensure_ascii=False) + "\n")

    print(f"✅ Датасет успешно обработан и сохранен в {OUTPUT_PATH}")


if __name__ == "__main__":
    preprocess_data()