✍️ 文本糾錯 (Text Correction)
ASR 同音字修正 · pycorrector → MacBERT · 商場機器人 · ~100 天踩坑
作者:TonTon Huang Ph.D.|投入時間:2019/11/20–2020/02/29(~100 天)|更新:2026-07-28
文本糾錯(Text Correction)要解決的是文字中的各種錯誤:拼音/注音打字的同音異字、ASR 語音轉文字的同音誤識、手誤造成的形近字混淆,以及語法/語意層面的錯誤。
這個專案的起源是商場服務機器人:機器人回答客戶問題時,螢幕上顯示的文字有時因 ASR 誤識而出現「頻果」(應為「蘋果」)、「剛果」(應為「剛好」)等錯誤,嚴重影響使用者體驗,因此需要在文字顯示前做一層糾錯。
#文本糾錯
#MacBERT
#pycorrector
#ASR後處理
#同音字
錯誤類型
中文文本的四大錯誤類型
🔊 ASR 同音誤識
「蘋果」→「頻果」
「剛好」→「剛果」
語音轉文字最常見
⌨️ 拼音/注音同音字
「再見」→「在見」
「繼續」→「機續」
注音輸入法的選字錯誤
✏️ 形近字混淆
「已」vs「己」vs「巳」
「太」vs「大」
手寫或視覺相似字
📝 語法/語意錯誤
詞序錯誤、多餘虛詞
「我很的喜歡你」
最難自動修正
💡 糾錯工具的分工:不同工具擅長不同類型的錯誤。pycorrector 擅長同音字;MacBERT 能處理多字元上下文;語法錯誤(如詞序)目前最好的選擇反而是 LLM。
文本糾錯:傳統方法 vs LLM
文本糾錯是 NLP 任務中傳統方法和 LLM 各有所長的典型例子:
✅ 傳統方法(MacBERT/pycorrector)更適合的場景:
• ASR 即時後處理:每秒需處理多筆語音輸出,API 延遲不可接受
• 同音字替換:規則清晰,BERT 的 MLM 能力天然擅長
• 資料不外傳:商業對話內容、醫療語音轉文字
• 高頻低成本:每天處理萬筆以上,Token 費用不划算
💡 LLM 更適合的場景:
• 語法/語意錯誤:句子結構混亂、外國人寫的中文
• 長文修改:作文、報告、郵件等整段修正,需要全文理解
• 風格統一:把多人協作文件的用詞統一化
• 低頻高質量:不在乎費用,追求最高品質的修正
⚠️ LLM 不適合的場景:讓 LLM 糾正 ASR 輸出時,它很可能「創意」地改寫整句話的意思(不只改錯字),反而更危險。糾錯任務對「最小修改原則」要求高,LLM 傾向過度修改。
技術演進
pycorrector → ConvSeq2Seq → MacBERT
pycorrector
規則+語言模型
→
ConvSeq2Seq
CNN Encoder-Decoder
→
BERT MLM
遮罩語言模型
→
MacBERT
中文最佳化
🔧 pycorrector(起步工具)
整合 Kenlm 語言模型 + 同音/形近字詞典的規則糾錯工具。優點:開箱即用,不需要訓練數據;缺點:缺乏上下文理解,容易過度糾錯(把正確的詞改錯)。適合做初步實驗和基線對比。
🔄 ConvSeq2Seq(序列到序列)
CNN-based Encoder-Decoder
把糾錯當成翻譯問題:錯誤句子 → 正確句子。CNN 並行計算比 RNN 快,但對長句和多處同時出錯的情況效果不穩定。主要問題是:模型可能「創意翻譯」,改動超出必要範圍。
🧪 BERT MLM(Masked Language Model)
利用 BERT 預訓練的核心能力
BERT 的預訓練任務就是「遮罩語言模型」——給定上下文預測被遮罩的詞。文本糾錯可以直接利用這個能力:把疑似錯誤的字遮罩,讓 BERT 根據上下文預測最可能的正確字。缺點是需要先判斷「哪個字是錯的」。
🏆 MacBERT(2020,哈工大)
MacBERT(MLM as correction BERT)專為中文文本糾錯設計,預訓練時把相似詞(同音/形近詞)作為遮罩替換,讓模型天然學會修正這類錯誤。相比標準 BERT,MacBERT 在中文糾錯任務上 F1 提升 3–5%,是目前中文文本糾錯的最佳 BERT 基底模型。
效果展示
ASR 同音字糾錯效果示例
ASR 輸出:「請問頻果手機在幾樓?」
糾錯後:「請問蘋果手機在幾樓?」
ASR 輸出:「這裡有剛果可以試用的商圈嗎?」
糾錯後:「這裡有剛好可以試用的商品嗎?」
ASR 輸出:「我想找腳彩店」
糾錯後:「我想找角彩(彩妝)店」
⚠️ 糾錯的邊界:「我不喜歡你」如果 ASR 誤識為「我步喜歡你」,糾錯應把「步」改回「不」。但如果誤識為「我不習慣你」,這在語法上完全正確,糾錯模型很難判斷這是 ASR 錯誤還是說話者的本意。糾錯的上限是人類也無法確定的模糊地帶。
踩坑記錄
~100 天的血與淚
⚠️ 數據標注是最大瓶頸:糾錯任務需要「錯誤句子–正確句子」配對數據,公開數據集幾乎都是簡體中文。台灣場景需要大量人工聆聽 ASR 輸出、找出錯誤、標注正確版本。這件事非常耗時,卻是提升效果的關鍵。
⚠️ Jieba 斷詞的坑(繁中版也逃不掉):糾錯的第一步通常要斷詞,但 Jieba 繁中版對新詞(品牌名、店名)斷詞效果差,導致糾錯邊界判斷錯誤。後來加入自定義詞典,效果明顯改善。pkuseg 也試過,整體感覺不如 Jieba 繁中版。
⚠️ 過度糾錯(Over-correction):把「一個比一個強」糾正成「一個比一個牆」——模型過度敏感,把正確的字改錯。需要設定「最小信心閾值」,低於閾值的不糾正。
⚠️ 不同工具的糾錯目標不一致:pycorrector 能處理疊字錯誤(「喜喜歡歡」→「喜歡」),MacBERT 擅長單字替換,ConvSeq2Seq 能處理連續錯 3 個字但不可控。選工具前必須先分析你的場景以哪種錯誤類型為主。
✅ 最終成功的關鍵:用拼音相似度輔助判斷候選糾正詞(「頻果」→「蘋果」的拼音相似);結合 NER(先識別出品牌名,品牌名不進行糾錯);最後用 MacBERT MLM 重排序候選字。這個 pipeline 才讓效果達到預期。
🤗
立即體驗線上 DEMO
輸入含有同音字或常見 ASR 錯誤的中文文本,即時查看糾錯效果。
前往 HuggingFace Space →