status-law-gbot / tools /repair_dataset_structure.py
Rulga's picture
Refactor training data export function and add dataset structure repair tool
3595c1e
raw
history blame
7.6 kB
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)}")