Skip to content

資料清洗與分類腳本 (extract_data.py) 功能說明 #1

Description

@bubbleee030

資料清洗與分類腳本 (extract_data.py) 功能說明

最後更新日期: 2025-07-23


🎯 總體目標 (Overall Goal)

此腳本的主要目標是自動化處理 eval_results 目錄下的實驗數據。它會遍歷所有子目錄,從 .json.jsonl 檔案中提取所需資料,並執行一系列的驗證、去重與分類任務,最終產出乾淨、可用於後續分析的結構化資料。


⚙️ 核心功能流程 (Core Workflow)

整個處理流程分為三大步驟,依序執行:

步驟 1:資料提取與格式驗證 (extract_and_validate)

此階段負責從原始檔案中讀取資料,並進行初步的篩選與驗證。

  • 檔案遍歷: 從指定的根目錄 (./eval_results) 開始,遞迴搜尋所有 .json.jsonl 檔案。
  • 智慧篩選:
    • 透過檔名 (findMission) 解析出任務類型 (如 petition, od 等)。
    • 自動跳過檔名包含 raft 的檔案。
    • 從檔案路徑中解析出 genmodeljudgemodel 名稱。
  • 資料提取:
    • .jsonl 檔案: 逐行讀取並解析為 JSON 物件。
    • .json 檔案: 讀取整個檔案,並特別提取 eval_result_from_first_iteration 欄位中的資料。
  • 格式驗證:
    • 確保 full_output 欄位存在、非空,且不包含 "think" 字樣(可能是未處理的原始輸出)。
    • 驗證 full_output 包含所有必要的標籤 (如 【給分原因】, 【分數】 等)。
    • 確保 model_response 欄位存在且非空。
    • 不符合格式的資料會被記錄到 format_error.json,並在日誌中留下紀錄。

步驟 2:近似文本去重複 (find_and_remove_duplicates)

為了確保資料的獨特性,此步驟使用 SimHash 演算法 來找出並移除內容相似的資料。

  • SimHash 計算: 為每一筆資料的 full_output 文本計算出一個 64-bit 的 SimHash 指紋。
  • 相似度比較:
    • 透過計算兩個 SimHash 指紋之間的「漢明距離 (Hamming Distance)」來判斷文本相似度。
    • 若漢明距離小於或等於設定的閾值 (threshold=2),則將其視為近似重複項。
  • 移除重複: 保留先出現的資料,並將後出現的相似資料移除。
  • 所有被移除的重複資料及其比對來源,都會被詳細記錄在 deduplicated_log.json

步驟 3:語言與任務分類 (classify)

最後,將清理乾淨的資料進行最終分類。

  • 簡繁體偵測:
    • 載入 simplified_chars.txt 字典檔。
    • 檢查每筆資料的 full_outputmodel_response 是否包含簡體字。
    • 若偵測到簡體字,會標記其語言為 simplified,並記錄觸發的字元與來源欄位。否則標記為 traditional
  • 任務分類: 根據步驟 1 解析出的 mission 類型進行分類。
  • 資料分桶 (Bucketing):
    • 根據「語言」和「任務」的組合,將資料存放到不同的集合中 (例如 traditional_petition, simplified_qa 等)。
    • 所有分類結果會分別儲存成獨立的 JSON 檔案。

🚀 如何執行

  1. 確保已安裝所有必要的 Python 套件 (pip install -r requirements.txt)。
  2. 確認 simplified_chars.txt 檔案存在於同層目錄。
  3. 將所有要處理的原始資料夾放置在 eval_results 目錄下。
  4. 在終端機中執行以下指令:
    python extract_data.py
  5. 等待程式執行完畢。

📂 輸出檔案結構

執行完畢後,所有產出的檔案都會被存放在 final_classified_output/ 目錄下,包含:

  • [lang]_[mission].json: 分類好的主要資料檔,例如 traditional_od.json
  • classified_data_[lang].json: 按照簡繁體區分的完整資料,例如 classified_data_traditional.json
  • format_error.json: 所有因格式錯誤而被剔除的資料。
  • deduplicated_log.json: 所有因內容近似而被移除的資料紀錄。

同時,腳本執行的詳細過程會記錄在 logs/ 目錄下的 .log 檔案中,方便追蹤與除錯。


💬 需要討論的事項

  • @mentor:目前 SimHash 的 threshold 設為 2,想與您討論這個值的敏感度是否合適。
  • ...

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions