iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
佛心分享-IT 人自學之術

學習 LLM系列 第 10

Day 10 準備中文資料集 (1)

  • 分享至 

  • xImage
  •  

**為什麼要準備 : **
在專門領域或特定任務上需要專屬的中文資料集,英文資料相對多,中文資料很多時候需要自己準備
流程

  1. 收集資料(reviews、客服對話、知識庫、文件)
  2. 設計 label 與資料格式(情感:binary/ternary/score;FAQ:Q–A pairs or retrievable docs)
  3. 清理 & 正規化(中文特殊處理)
  4. 標註(tools、規範、品質控制)
  5. 切分 train/val/test(stratified)與平衡處理
  6. 轉成 Hugging Face / SQuAD / JSONL 格式
  7. Tokenize / chunk / 存 embeddings(RAG 或檢索)
  8. 評估(accuracy, F1, recall@k, EM/F1)
  9. 資料擴增、隱私移除

一、資料來源與收集情感分析:

  • 電商評論(商品評論、App 評論)、社群貼文、客服回饋、問卷自由回答。注意版權與隱私(不得外洩含個資的原文)
  • FAQ / Knowledge base:公司客服 FAQ、產品說明、wiki、使用手冊、客服對話紀錄(可抽問答對)
  • 建議:儘量保留原始來源 metadata(日期、來源、產品 id 等),未來可用於分析或過濾
    二、設計資料格式與 Label Schema(標籤結構,為網頁內容提供標準化的結構和語法)
  1. 情感分析 (CSV)

    • 常見欄位 : id、text、laber
    • binary: label ∈ {0,1}(0=negative,1=positive)
    • ternary: {negative,neutral,positive}
    • 範例 :
      id,text,label 1,"這台手機很棒,電池很耐用",1 2,"介面亂七八糟,功能有 bug",0 3,"還可以,不過價格稍高",2
  2. FAQ

    • 檢索型 (RAG) documents:每一段文件作為一個 document[JSONL)(每行包含一個獨立的JSON 物件的文字檔案格式)]
      {"id":"doc_001","title":"退貨政策","text":"本商店的退貨政策是...","meta":{"source":"helpcenter","category":"shipping"}}
    • QA pairs(SQuAD-like(用於機器閱讀理解的資料集) 或 JSONL)
      • SQuAD 範例(JSON)
      {
        "version":"1.0",
        "data":[
          {
            "title":"退貨政策",
            "paragraphs":[
              {
                "context":"我們的退貨政策是 ...",
                "qas":[
                          {"id":"q1","question":"如何申請退貨?","answers":[{"text":"填寫退貨表單","answer_start":12}],"is_impossible":false}
                ]
              }
            ]
          }
        ]
      }
      
      • FAQ pair CSV/JSONL
        id,question,answer,topic q1,"如何退款?","請聯絡客服並提供訂單編號。","payment"
        三、中文清理與正規化
        步驟 :
  3. 去除 HTML / 標籤、URLs、Email

  4. 全形/半形轉換、數字單位規一化(1000→1000/一千視情況)

  5. 簡繁轉換(決定統一為繁體或簡體)→ 可用 OpenCC

  6. 去除或保留 emoji(依任務;情感分析可保留)

  7. 移除多餘空白、重複句(deduplicate)

  8. 控制最小與最大長度(太短或太長可過濾或 chunk)

import re
# pip install opencc-python-reimplemented  # 若要簡繁轉換
from opencc import OpenCC
cc = OpenCC('t2s')  # 繁轉簡,改成 's2t' 可簡轉繁

def clean_text(text, to_simplified=False):
    if not isinstance(text, str):
        return ""
    # 去 HTML
    text = re.sub(r"<[^>]+>", " ", text)
    # 去 URL
    text = re.sub(r"http\S+|www\.\S+", " ", text)
    # 去 Email
    text = re.sub(r"\S+@\S+", " ", text)
    # 簡繁轉換(視你需求)
    if to_simplified:
        text = cc.convert(text)
    # 移除多餘空白
    text = re.sub(r"\s+", " ", text).strip()
    return text

四、標註流程與工具

  • 工具 : Doccano(開源,支援分類/NER/QA)、Label Studio、Google Sheets(簡單)
  • 步驟 :
    • 先寫好 Annotation Guideline(範例 + 邊界情況)
    • 標註三十筆作 pilot,檢查不同標註者間的一致性(Inter-Annotator Agreement,計算 Kappa)
    • 若一致性低,調整規範再進行大批標註
    • 做 adjudication
  • 品質控制:用 gold data(已知答案)抽查標註者表現;定期回顧
    五、train/val/test 切分與平衡
  • 常用比例:train:val:test = 80:10:10 或 70:15:15
  • 對分類任務要做 stratified sampling(分層抽樣)(保留每個 label 的比例)
  • 若 label 不平衡(例如正面 90% vs 負面 10%)
    • 權重化 loss(class_weight)
    • 下採樣多數類或上採樣少數類(SMOTE 不常用於文字)
    • 收集更多少數類資料
  • Stratified split 範例
from sklearn.model_selection import train_test_split
import pandas as pd

df = pd.read_csv("sentiment.csv")  # id,text,label
train_val, test = train_test_split(df, test_size=0.1, stratify=df["label"], random_state=42)
train, val = train_test_split(train_val, test_size=0.1111, stratify=train_val["label"], random_state=42)  # -> 0.8/0.1/0.1

上一篇
Day 9 微調與提示的練習
下一篇
Day 11 準備中文資料集 (2)
系列文
學習 LLM11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言