"""
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
# 处理