中文文本糾錯

Chinese Text Correction

適用於針對輸入文本(對話),特別是語音識別同音異字等進行改錯

Call for Partner or POC (Proof of Concept) Contact: TonTon ( at ) TWMAN.ORG

本文由 Ian Wang 撰寫初稿後再進行編修,且持續更新中

pycorrector

  • 使用jieba進行斷詞後,再基於kenlm進行錯別字判斷的簡易文本糾錯方法

    • 優點

      • 方便安裝與使用

      • 速度快

      • 基礎錯字處理上有一定效果

    • 缺點

      • 準確率不佳

      • 無法經過重新訓練以符合情境

      • 在專有名詞或是斷詞錯誤情況下容易出錯

    • Source Code: https://github.com/shibing624/pycorrector

Bert

  • 效果範例

    • 我因該不會在來了 => 我应該不會再來了

    • 爸爸去樓尚買電視 => 爸爸去樓上买電視

    • 昨天正想高訴你 => 昨天正想告訴你

  • 優點

    • 效果較佳,在不考慮簡體情形下糾錯正確。(簡體情況在後續實驗改良)

    • 糾錯後更改為簡體字的部分,可用技巧性的轉回繁體解決。

    • 簡繁效果相近,但簡體環境效果仍然稍微略好。

  • 缺點

    • BERT 模型較大,預測速度相對較慢。

    • 即使輸出可為繁體,但計算過程仍有簡體字存在,可能遭受質疑。

    • 錯誤檢測模型大,且因為該統計模型為基於簡體,需帶一些簡體文本檔案。

Electra

  • 效果範例

    • 我因該不會在來了 => 我因該不會在來了

    • 爸爸去樓尚買電視 => 爸爸去樓上買電視

    • 昨天正想高訴你 => 昨天正想高訴你

  • 優點

    • 檢測與糾正同一模型可達成,可能也正是繁體效果較差的原因。

    • 模型最小,預測速度最快。

  • 缺點

    • 簡體與繁體的預測效果差距較大。

    • 即使輸出可為繁體,但計算過程仍有簡體字存在,可能遭受質疑。

    • 要做重新訓練還需再花時間研究架構與作法,之前不曾做過 Electra 的相關訓練與研究。


Deep Learning

  • RNN + Attention (by Stanford University, 2016) (Tensorflow)

    • 英文版本在CoNLL 2014比賽中排名第一

    • 論文網址:https://arxiv.org/pdf/1603.09727.pdf

  • Seq2Seq + Attention (Keras)

    • 模型容易收斂,但容易過overfitting

    • 針對長文本較為有效,較不符合豹小密等機器人使用情況

    • 無參加比賽或論文等輔助數據,但有留言說使用後效果不如預期

  • ConvSeq2Seq (by 北京語言大學, 2018) (Pytorch)

  • BERT:現有提供已透過中文文本糾錯數據fine-tune的BERT模型

    • https://pan.baidu.com/s/1QCRe5fXSinXSY1lfm7BaQg (pass: m4mg)

    • Fine-tune data

      • 人名日報2014版數據 (101MB)

      • CGED三年比賽數據 (2.8MB)

      • 部分中文維基百科數據 (50MB)

    • 訓練過程

      • 使用3張P40 GPU訓練3個世代,總時長超過24小時;成本不划算

    • 改良方向:將pre-trained BERT用實際應用場景數據進行Fine-tune後,使用蒸餾法進行模型上的縮減;或是先使用蒸餾法產出一個比較小的模型後再用我們的數據進行fine-tune,如此一來模型會變得更小且具有更快的推論速度,更適合應用在實時性的機器人服務場景上

    • 方法總結:

      • 目前已有許多可用套件與模型,但皆與實際使用情況有少許出入,必須取得實際應用場景數據並針對其進行調整,才能達到較好結果

      • 資料明確不足情況下,相對套件仍然確實有著較高分數

      • 套件無法處理專有名詞,ex. 麥當勞、海底撈,模型可藉由數據習得

      • 模型可解決糾錯前後長度不一的 case,ex. 肯肯肯肯德基 -> 肯德基,套件則限一個字換一個字

      • 套件用一般字詞情況做修正,模型則是依據訓練數據,刻意使用諧音的場合套件容易發生錯誤

      • 模型可因應不同訓練數據適應不同使用場景,套件則為單一改法

      • 模型有著改善空間,套件則無