""" 07_split_sft_rl.py 最终合并和拆分: 1. 合并所有数据(real + filtered speed/chiral + new speed/chiral/reverse) 2. 统一时间戳格式为 HH:MM:SS(精确到1秒) 3. 拆分为 SFT 和 RL 两个数据集 4. 输出最终文件 """ import json import os import re import collections OUT_DIR = "/root/final_dataset" # 输入文件 REAL_DATA = f"{OUT_DIR}/sft/real_data.jsonl" SPEED_FILTERED = f"{OUT_DIR}/sft/speed_filtered.jsonl" CHIRAL_FILTERED = f"{OUT_DIR}/sft/chiral_filtered.jsonl" SPEED_SINGLE_SFT = f"{OUT_DIR}/sft/speed_single_sft.jsonl" CHIRAL_SINGLE_SFT = f"{OUT_DIR}/sft/chiral_single_sft.jsonl" REVERSE_SINGLE_SFT = f"{OUT_DIR}/sft/reverse_single_sft.jsonl" SPEED_SINGLE_RL = f"{OUT_DIR}/rl/speed_single_rl.json" CHIRAL_SINGLE_RL = f"{OUT_DIR}/rl/chiral_single_rl.json" REVERSE_SINGLE_RL = f"{OUT_DIR}/rl/reverse_single_rl.json" # 输出文件 SFT_OUTPUT = f"{OUT_DIR}/sft/video_qa_sft_v5_for_cot.jsonl" RL_OUTPUT = f"{OUT_DIR}/rl/video_qa_rl_augmented.json" STATS_OUTPUT = f"{OUT_DIR}/docs/DATA_STATS.json" def normalize_timestamp_in_response(response): """ 将 response 中的时间戳统一为 HH:MM:SS 精确到1秒。 处理格式: - → - → - 00:00:01.2 - 00:00:03.8 → 00:00:01 - 00:00:04 """ if not response: return response def round_timestamp(match): ts = match.group(1) # 解析 HH:MM:SS.x 格式 parts = ts.split(':') if len(parts) == 3: h, m, s_part = parts # 去掉小数部分,四舍五入到秒 if '.' in s_part: s_float = float(s_part) s = round(s_float) # 处理进位 s_int = int(s) m_int = int(m) h_int = int(h) if s_int >= 60: s_int -= 60 m_int += 1 if m_int >= 60: m_int -= 60 h_int += 1 return f"{h_int:02d}:{m_int:02d}:{s_int:02d}" else: return ts return ts # 处理