status-law-gbot / tools /repair_dataset_structure.py
Rulga's picture
Refactor training data export function and add dataset structure repair tool
3595c1e
import logging
import time
import sys
import os
from pathlib import Path
from dotenv import load_dotenv
# Загружаем переменные окружения из .env файла
load_dotenv()
# Добавляем корневую директорию проекта в PYTHONPATH
root_dir = str(Path(__file__).parent.parent)
sys.path.append(root_dir)
from huggingface_hub import HfApi
from config.settings import (
DATASET_ID,
DATASET_CHAT_HISTORY_PATH,
HF_TOKEN
)
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("repair_dataset_structure.log", encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
def repair_chat_files_structure():
"""
Move misplaced chat files from root to existing chat_history directory
"""
try:
api = HfApi(token=HF_TOKEN)
# Получаем список всех файлов в датасете
files = api.list_repo_files(
repo_id=DATASET_ID,
repo_type="dataset"
)
# Находим только файлы чата в корневой директории (без пути)
misplaced_files = [
f for f in files
if f.endswith('.json') and
'/' not in f and # только файлы в корне
'-' in f # характерный признак файлов чата (timestamp)
]
logger.info(f"Found {len(misplaced_files)} misplaced chat files")
moved_count = 0
error_count = 0
for file_path in misplaced_files:
try:
# Проверяем флаг остановки
if hasattr(repair_chat_files_structure, 'stop_flag') and repair_chat_files_structure.stop_flag:
logger.info("Stopping process...")
break
# Добавляем задержку между операциями
time.sleep(2)
# Скачиваем содержимое файла
file_content = api.hf_hub_download(
repo_id=DATASET_ID,
filename=file_path,
repo_type="dataset"
)
# Перемещаем в существующую chat_history директорию
new_path = f"chat_history/{file_path}"
# Загружаем файл в chat_history
with open(file_content, 'rb') as f:
api.upload_file(
path_or_fileobj=f,
path_in_repo=new_path,
repo_id=DATASET_ID,
repo_type="dataset"
)
# Удаляем файл из корневой директории
api.delete_file(
path_in_repo=file_path,
repo_id=DATASET_ID,
repo_type="dataset"
)
logger.info(f"Moved {file_path} to {new_path}")
moved_count += 1
except Exception as e:
logger.error(f"Error processing file {file_path}: {str(e)}")
error_count += 1
continue
logger.info(f"Successfully moved {moved_count} files from root to chat_history")
if error_count > 0:
logger.warning(f"Failed to process {error_count} files")
except Exception as e:
logger.error(f"Error accessing dataset: {str(e)}")
def fix_duplicated_paths():
"""
Fix duplicated chat_history paths in filenames
"""
try:
api = HfApi(token=HF_TOKEN)
# Получаем только файлы из папки chat_history с дублированным путем
wrong_paths = [
f for f in api.list_repo_files(
repo_id=DATASET_ID,
repo_type="dataset"
)
if f.startswith('chat_history/') and
f.endswith('.json') and
'chat_history\\' in f # ищем файлы с Windows-путем в имени
]
logger.info(f"Found {len(wrong_paths)} files with duplicated chat_history path")
fixed_count = 0
error_count = 0
for file_path in wrong_paths:
try:
# Проверяем флаг остановки
if hasattr(fix_duplicated_paths, 'stop_flag') and fix_duplicated_paths.stop_flag:
logger.info("Stopping process...")
break
# Добавляем задержку между операциями
time.sleep(2)
# Скачиваем содержимое файла
file_content = api.hf_hub_download(
repo_id=DATASET_ID,
filename=file_path,
repo_type="dataset"
)
# Создаем правильный путь
filename = os.path.basename(file_path).replace('chat_history\\', '')
new_path = f"chat_history/{filename}"
# Загружаем файл с правильным путем
with open(file_content, 'rb') as f:
api.upload_file(
path_or_fileobj=f,
path_in_repo=new_path,
repo_id=DATASET_ID,
repo_type="dataset"
)
# Удаляем файл со старым путем
api.delete_file(
path_in_repo=file_path,
repo_id=DATASET_ID,
repo_type="dataset"
)
logger.info(f"Renamed {file_path} to {new_path}")
fixed_count += 1
except Exception as e:
logger.error(f"Error processing file {file_path}: {str(e)}")
error_count += 1
continue
logger.info(f"Successfully renamed {fixed_count} files")
if error_count > 0:
logger.warning(f"Failed to process {error_count} files")
except Exception as e:
logger.error(f"Error accessing dataset: {str(e)}")
if __name__ == "__main__":
try:
logger.info("=== Starting Dataset Structure Repair ===")
logger.info(f"Dataset ID: {DATASET_ID}")
# Сначала перемещаем файлы из корня
#repair_chat_files_structure()
# Затем исправляем пути
logger.info("=== Starting Path Fix ===")
fix_duplicated_paths()
logger.info("=== Repair Complete ===")
except KeyboardInterrupt:
logger.info("\nReceived keyboard interrupt, stopping gracefully...")
repair_chat_files_structure.stop_flag = True
fix_duplicated_paths.stop_flag = True
time.sleep(3)
logger.info("Process stopped by user")
except Exception as e:
logger.error(f"Unexpected error: {str(e)}")