💻 源码
# -*- coding: utf-8 -*-
"""
对 queryData.jsonl 进行清洗:
1. 删除 questionScore < 7 的记录
2. 对 instruction 文本去重,保留分数最高的一条
3. 重新编号 id,写回原文件
"""
import json
import os


def cleanQueryData(targetFile, minScore=7):
    # ---------- 读取全部记录 ----------
    records = []
    with open(targetFile, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if line:
                records.append(json.loads(line))
    print(f"原始记录数: {len(records)}")

    # ---------- 第一步:过滤低分记录 ----------
    filtered = []
    removedByScore = 0
    for rec in records:
        score = rec.get("questionScore", -1)
        if score >= minScore: # 打分大于等于阈值7分, 就保留
            filtered.append(rec)
        else:
            removedByScore += 1
    print(f"删除 questionScore < {minScore} 的记录: {removedByScore} 条")
    print(f"过滤后剩余: {len(filtered)} 条")

    # ---------- 第二步:按 instruction 去重 ----------
    # 用字典记录每个 instruction 对应的最佳记录(分数最高的)
    bestByInstruction = {}
    duplicateCount = 0
    for rec in filtered:
        instr = rec["instruction"]
        if instr not in bestByInstruction:
            bestByInstruction[instr] = rec
        else:
            # 保留分数更高的那条
            existing = bestByInstruction[instr]
            if rec.get("questionScore", 0) > existing.get("questionScore", 0):
                bestByInstruction[instr] = rec
            duplicateCount += 1

    deduped = list(bestByInstruction.values())
    print(f"去重删除重复记录: {duplicateCount} 条")
    print(f"去重后剩余: {len(deduped)} 条")

    # ---------- 第三步:重新编号 id ----------
    for i, rec in enumerate(deduped):
        rec["id"] = i + 1

    # ---------- 第四步:写回原文件 ----------
    with open(targetFile, 'w', encoding='utf-8') as f:
        for rec in deduped:
            f.write(json.dumps(rec, ensure_ascii=False) + '\n')

    print(f"\n清洗完成,共 {len(deduped)} 条记录已保存到 {targetFile}")

    # ---------- 打印各类别统计 ----------
    print(f"\n各类别剩余数量:")
    categoryCount = {}
    for rec in deduped:
        cate = rec.get("category", "")
        categoryCount[cate] = categoryCount.get(cate, 0) + 1
    for cate, count in categoryCount.items():
        print(f"  {cate}: {count} 条")

    # ---------- 打印被删除的低分记录 ----------
    if removedByScore > 0:
        print(f"\n被删除的低分记录(score<{minScore}):")
        for rec in records:
            if rec.get("questionScore", -1) < minScore:
                print(f"  id={rec['id']}, score={rec['questionScore']}, "
                      f"category={rec['category']}, instruction={rec['instruction'][:30]}...")

    # ---------- 打印被去重的记录 ----------
    if duplicateCount > 0:
        print(f"\n被去重的重复记录:")
        seen = set()
        for rec in filtered:
            instr = rec["instruction"]
            if instr in seen:
                print(f"  id={rec['id']}, score={rec['questionScore']}, "
                      f"category={rec['category']}, instruction={rec['instruction'][:30]}...")
            else:
                seen.add(instr)


if __name__ == "__main__":
    targetFile = "../data/testDataTemp/queryData.jsonl"
    cleanQueryData(targetFile, minScore=7)