salesbot / src /preprocess.py
IuriiNov's picture
Initial commit
7b8da59
Raw History Blame Contribute Delete
3.22 kB
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()