在 HuggingFaceFW/finepdfs 裡找繁體中文:繁體中文資料的淬鍊之路
整理資料集的日常系列

有時候在逛 HuggingFace 的時候,總會不小心挖到一些有趣的專案,像是 HuggingFaceFW/finepdfs,這是一個大規模從 Web 上蒐集公開 PDF 的資料集。
看到這種規模的資料(數億筆等級),腦中第一個浮現的問題其實很直覺:
這裡面到底有多少「真正的繁體中文」?
第一個難關:如何區分繁體與簡體中文?

HuggingFaceFW/finepdfs 的語言分類採用 ISO 639 Code Tables 標準,其中,中文(Mandarin)會被歸類為 cmn,但這個問題來了,在 ISO 標準下,繁體中文與簡體中文都屬於 cmn 類別,也就是單靠這個分類是無法區分繁體與簡體中文,如果我們今天的目地是要建立一個「道地繁體中文」訓練語料,那麼這個分類並不是我們可以直接應用,勢必要再透過其它的後處理方式取出繁體中文語料。
後處理:真正的工程才剛開始
於是你就會發現,真正困難的從來不是抓資料,而是刪資料。
當語言標記只能告訴你它是 cmn,卻無法分辨繁簡時,你就必須進入後處理階段。這個階段其實更像是一場工程設計,而不是單純的清洗流程,你會需要建立一套 rule-based 的篩選邏輯,利用繁簡差異字做初步過濾,排除明顯屬於簡體語境的文本,以下附上一個最小化版本的過濾管線,你可以視需求擴充:
# PSEUDO CODE — Traditional Chinese filtering pipeline
# Goal: from `cmn` bucket -> high-purity Traditional Chinese corpus
# Strategy: layered elimination (detection, not conversion)
for doc in finepdfs.where(lang == "cmn"):
# ----------------------------
# Layer 0 — Basic sanity check
# ----------------------------
# Example filters:
# - empty text
# - extremely short content
# - abnormal symbol density
# - encoding anomalies
if doc.text is None or len(doc.text) < MIN_CHARS:
drop(doc, reason="too_short_or_empty")
continue
# -----------------------------------------
# Layer 1 — Script-level (character signal)
# -----------------------------------------
# Example traditional indicator chars:
# ["臺", "體", "價", "應", "發", "學", "術", "聯", "網"]
#
# Example simplified indicator chars:
# ["台", "体", "价", "应", "发", "学", "术", "联", "网"]
#
# Measure ratio difference rather than binary match.
trad_ratio = ratio_of_chars(doc.text, TRAD_FEATURE_CHARS)
simp_ratio = ratio_of_chars(doc.text, SIMP_FEATURE_CHARS)
# Strong simplified signal → early drop
if simp_ratio > SIMP_THRESHOLD and trad_ratio < TRAD_THRESHOLD:
drop(doc, reason="script_indicates_simplified")
continue
# ---------------------------------------
# Layer 2 — Lexical-level (word usage)
# ---------------------------------------
# Example simplified lexicon:
# ["信息", "软件", "数据", "网络", "点击", "登录", "账号", "用户"]
#
# Example traditional lexicon:
# ["資訊", "軟體", "資料", "網路", "點擊", "登入", "帳號", "使用者"]
#
# Region-specific signals:
# PRC terms: ["国务院", "人民法院", "市场监管总局"]
# Taiwan terms: ["行政院", "司法院", "衛福部"]
simp_lex_score = hit_rate(doc.text, SIMP_LEXICON)
trad_lex_score = hit_rate(doc.text, TRAD_LEXICON)
if simp_lex_score > trad_lex_score + LEX_MARGIN:
drop(doc, reason="lexical_pattern_simplified_context")
continue
# ------------------------------------------
# Layer 3 — Semantic validation (LLM assist)
# ------------------------------------------
# Evaluation examples:
# - idiomatic Traditional Chinese fluency
# - mixed-script unnatural blending detection
# - region-consistent terminology
# - grammatical coherence
tc_fluency = judge(doc.text, rubric="traditional_fluency")
coherence = judge(doc.text, rubric="coherence")
if tc_fluency < MIN_TC_FLUENCY:
drop(doc, reason="low_traditional_fluency")
continue
if coherence < MIN_COHERENCE:
drop(doc, reason="low_coherence")
continue
# ---------------------
# Final decision
# ---------------------
keep(doc)這時候有人會問:「那直接用 LLM-as-Judge 不就好了嗎?」
LLM 確實可以成為一個很好的輔助工具。它能幫忙判斷語感、語境是否符合繁體中文習慣,甚至協助分類內容是否具備教育價值。但如果把它當成唯一過濾機制,就會開始出現問題,模型或多或少會有幻覺,會過度自信,也會受到 prompt 設計影響,它比較適合扮演第二層語意檢查者,而不是第一線裁判。資料過濾如果完全依賴生成式模型,本質上其實是在用不穩定的系統去決定資料品質。
進階一點,有人會提議:「那就把簡體全部轉成繁體不就好了?」這時候 OpenCC 常常會被搬出來。它確實是一個很優秀的工具,在字形轉換層面幾乎是標準配備。但字形轉換從來不等於語境轉換。許多詞彙差異、法規語境、教育體系用語,甚至是文化背景,並不是單純轉字就能解決的問題,請見我們在 iThome 採訪時提出的觀察:
此外,(訓練家)陳旻詣提醒,對岸模型的語法風險與資料污染問題亦不容忽視。不少教師被迫使用對岸模型產出簡體資料,再透過 OpenCC 轉為繁體,導致大量錯譯,如「濃郁」變「濃鬱」、「虱目魚」誤為「蝨目魚」。唯有強化本地資料的語境一致性與品質,才能從根本上抵禦語料偏差,建立臺灣自主語料優勢。
2025 年有一句常見謎因是:「你可以不吃,但你一定要請你朋友吃。」轉換工具可以用,但不能把它當作終點。真正的本土化語料,必須來自語境層面的篩選,而不是字形層面的替換。
規模的代價:從 4.7 億到 836 萬

當這一輪輪過濾完成之後,cmn資料量從原本 476,178,356 筆,縮減到 8,367,316 筆。這意味著只留下約 1.75% 的內容。也就是說,超過九成的資料被判定不符合目標標準。
這個比例其實揭露了一件很現實的事情:大規模爬蟲資料,和可直接訓練的高品質資料,幾乎是兩個不同的概念。規模帶來的是可能性,但品質來自於選擇與犧牲,請讀者試著想想:你花費了大量的時間成本和算力費用,因為沒有檢查資料集的品質,最終你得到是一個繁簡混雜的中文模型,這一點都不划算。
萃取教科書等級的文本語料
更有趣的是,即便縮減到八百多萬筆,在人工抽樣檢視後,仍然可以看到許多問題。部分 PDF 並不具備教育內涵,有些內容重複性高,有些夾雜廣告或版權邊界模糊的語料。這讓人開始意識到,資料清洗其實不是「刪到一個數量」就結束,而是必須回到最初的問題:我們到底想讓模型學到什麼?
如果目標是教育場景,那麼下一步就應該思考如何定義「教育價值」。是知識密度?是結構完整性?還是可被引用的專業程度?資料工程的下一階段,或許不再只是語言過濾,而是內容分級與價值判斷。
至於該如何建立有效率的教育價值文本的篩選機制,我們曾經在過往文章有分享過:
這樣的手法除了我們這樣用之外,HuggingFaceFW 系列出品的具有教育價值資料集(也就是後綴有 -edu 命名)也是採用如此的方法,讀者也不彷可以自行試看看。
作者:Liang-Hsun Huang