📂 文本分類 (Text Classification)

HAN → BiLSTM+Attention → BERT · 12 類電話場景 · 告別 16GB Embedding

作者TonTon Huang Ph.D.投入時間:2019/11/10–2019/12/10|更新:2026-07-28

文本分類可能是 NLP 任務裡最適合傳統算法(BERT 微調)的場景:任務定義清晰、類別固定、推論結果 100% 可控、CPU 即時部署。相較之下,呼叫 GPT-4o 做文本分類費用是 BERT 的 100 倍以上,且對固定分類任務毫無增益。

這個專案的應用場景是「電話助理 APP」:程式幫你接聽陌生電話並與對方對話,辨識通話內容後分類為 12 種類型(如推銷、詐騙、外送等),再決定如何應對。

91.3%
Accuracy
83.5%
F1-score
0.1s
CPU 推論/筆
12
分類類別數
0.3856
Loss
954 MB
記憶體消耗

為什麼文本分類最適合傳統模型?

💡 核心論點:文本分類是「有監督、封閉域」任務。類別固定,BERT 只需學會邊界,泛化能力要求低。LLM 的優勢(開放域理解、多步推理)在此任務中完全用不到,卻要付出 100 倍的 Token 費用。
比較維度 BERT 微調 推薦 LLM API (GPT-4o) 不必要
每千筆費用<$0.01(自架 CPU)$5–20(取決於文本長度)
推論延遲CPU ~0.1s,GPU ~0.01s0.5–3s(API round trip)
輸出可控性100% 固定輸出類別需解析自然語言,偶有格式漂移
批量處理支援 batch_size=32+,高效受 rate limit 限制,並發有上限
資料隱私完全私有化,資料不離境文本傳送第三方伺服器
新類別擴展需重新標注 + 微調改 prompt 即可(但固定分類不需要)
✅ 唯一考慮 LLM 的情境:當你只有 10–50 筆樣本需要快速驗證新分類類別時,LLM few-shot 是最快的 POC 方式。一旦驗證可行、數據積累到 1,000 筆以上,立刻遷移回 BERT 微調。

HAN → BiLSTM+Attention → BERT

HAN
文檔層級注意力
BiLSTM+Attention
句子層級雙向 LSTM
bert-base-chinese
Transformer Embedding
CPU 生產部署
0.1s/筆

第一階段 — HAN(Hierarchical Attention Networks):能同時對詞層級與句子層級做注意力,天生適合長文本分類。但最大痛點是依賴騰訊 Tencent_AILab_ChineseEmbedding_20190926.txt,這個 Embedding 檔近 16GB,每次啟動服務都要花幾分鐘載入,RAM 直接吃掉大半。

第二階段 — BiLSTM+Attention:搭配 BERT Embedding 取代騰訊詞向量,API 上線時不再需要載入龐大詞典。雙向 LSTM 捕捉序列前後文;Attention 機制讓模型聚焦關鍵詞。MacBook Pro CPU 平均 0.1s/筆,記憶體消耗 ~954MB,適合中等規模部署。

第三階段 — bert-base-chinese 直接微調:Hugging Face Transformers 普及後,直接微調 BERT 接 Linear 分類頭,訓練更簡單且往往 F1 更高。缺點是 BERT embedding 維度大(768),在某些場景需要降維或蒸餾。

12 類電話助理分類場景

電話助理 APP 需要在對話進行中即時判斷來電類型,以決定是否代接、如何回應,甚至是否直接掛斷。以下是實際訓練的 12 個分類類別:

商業談判
課程銷售
債務追討
房地產
外送包裹
金融理財
獵頭招聘
保險推銷
貸款借款
餐飲外送
一般閒聊
電信騷擾
✅ 數據標注策略:初期靠人工聆聽錄音手動標注(非常耗時),後期結合關鍵詞規則做半自動標注,再人工校驗。高品質標注數據對最終 F1 的影響遠大於換模型架構。

BiLSTM + BERT Embedding 架構詳解

輸入層:使用 bert-base-chinese(768 維)作為 Embedding 層,替代 Tencent 16GB 詞向量。BERT 能更有效處理同詞異義(如「蘋果」手機 vs 水果)。

BiLSTM 層:雙向 LSTM 分別從左到右、右到左掃描序列,hidden state 拼接為 1536 維,充分捕捉上下文依賴。

Attention 層:對每個時間步的 hidden state 學習權重分佈,加權求和得到固定長度的句向量。讓模型關注「貸款、利率、借錢」等關鍵詞而非無關的語氣詞。

輸出層:Linear(1536, 12) + Softmax,輸出 12 類的機率分佈。

⚠️ BERT Embedding 的注意事項:BERT 輸出不可控,同一個詞在不同語境下 embedding 不同(這是特性而非 bug)。但這意味著無法用傳統「詞向量相似度」方法做調試,需改用可解釋性工具(如 LIME / SHAP)分析分類決策依據。
⚠️ 記憶體優化要點:BERT 模型本體 ~400MB,BiLSTM + 分類頭 ~50MB,加上資料緩存總計 ~954MB。生產環境建議開 model.eval() + torch.no_grad() + 關閉 gradient checkpoint,可節省約 30% 記憶體。

LLM 時代,文本分類傳統方法仍健在

隨著 GPT-4、Gemini 2.0 等 LLM 問世,「文本分類是否還需要自己訓練模型?」是一個常見問題。答案取決於場景規模:

✅ 傳統 BERT 仍然是首選的場景:
• 日均 10 萬筆以上請求(LLM API 費用高昂)
• 類別固定(不超過 50 類),不需要理解細微語意差異
• 延遲要求 <500ms(LLM API 偶有 2–5s 的 cold start)
• 資料不能外傳(醫療、金融、法律場景)
💡 2026 最佳實踐:SetFit(2022 年 Hugging Face 提出)
使用 Contrastive Learning 只需 8–64 筆樣本即可讓 BERT 類模型達到 GPT-3.5 的 few-shot 分類水準。如果你的標注數據不足,SetFit 是比 LLM few-shot 更省錢、更穩定的選擇。
✅ 考慮 LLM 的場景:
• 標注數據 <100 筆,需要快速驗證 POC
• 類別定義模糊(如「有沒有投訴情緒」)需要語意理解
• 分類結果需要附帶解釋(LLM 可生成解釋文字)

文本分類實戰選型建議

✅ 起手式:bert-base-chinese + Linear:直接微調最簡單,2023 年以後已取代 BiLSTM 成為標準做法。繁體中文可改用 bert-base-chinese(有繁簡混合語料)或 hfl/chinese-macbert-base(效果更好)。
✅ 資源有限:DistilBERT-Chinese:模型大小 bert-base-chinese 的 40%,速度快 60%,F1 只損失 1–3%。適合邊緣裝置或超低延遲要求。
✅ 超多類別(>100 類):層次化分類:先分大類(粗分),再在各大類內分細類(細分),可避免單層 Softmax 在類別過多時的效能下降問題。
⚠️ 常見失敗原因:類別不平衡(某類樣本數量是其他類的 10 倍)是 F1 偏低最常見的原因。解法:weighted cross-entropy loss 或 focal loss + 過採樣。
📂

探索更多 NLP 任務