文本糾錯,是天然語言處理領域檢測一段文字是否存在錯別字、以及將錯別字糾正過來的技術,通常用於文本預處理階段,同時能顯著緩解智能客服等場景下語音識別(ASR)不許確的問題。html
本文將經過如下幾個章節簡要介紹文本糾錯相關知識。python
1. 文本糾錯示例與難點
2. 文本糾錯經常使用技術
3. 如何將 BERT 應用於文本糾錯
4. 文本糾錯最優模型:Soft-Masked BERT(2020-ACL)
5. 立立刻手的糾錯工具推薦
一.文本糾錯示例與難點
生活中常見的文本錯誤能夠分爲(1)字形類似引發的錯誤(2)拼音類似引發的錯誤 兩大類;如:「咳數」->「咳嗽」;「哈蜜」->「哈密」。錯別字每每來自於以下的「類似字典」。git
類似發音中文字典 類似字形中文字典其餘錯誤還包括方言、口語化、重複輸入致使的錯誤,在ASR中較爲常見。github
現有的NLP技術已經能解決多數文本拼寫錯誤。剩餘的糾錯難點主要在於,部分文本拼寫錯誤須要常識背景(world-knowledge)才能識別。例如:算法
Wrong: "我想去埃及金子塔旅遊。"
Right: "我想去埃及金字塔旅遊。"
將其中的「金子塔」糾正爲「金字塔」須要必定的背景知識。網絡
同時,一些錯誤須要模型像人同樣具有必定的推理和分析能力才能識破。例如:架構
Wrong: "他的求勝欲很強,爲了越獄在挖洞。"
Right: "他的求生欲很強,爲了越獄在挖洞。"
「求勝欲」和「求生欲」在天然語言中都是正確的,可是結合上下文語境來分析,顯而後者更爲合適。函數
最後,文本糾錯技術對於誤判率有嚴格的要求,通常要求低於0.5%。若是糾錯方法的誤判率很高(將正確的詞「糾正」成錯誤的),會對系統和用戶體驗有不好的負面效果。工具
二.文本糾錯經常使用技術
錯別字糾正已經有不少年的研究歷史。經常使用的方法能夠概括爲錯別字詞典、編輯距離、語言模型等。學習
構建錯別字詞典人工成本較高,適用於錯別字有限的部分垂直領域;編輯距離採用相似字符串模糊匹配的方法,經過對照正確樣本能夠糾正部分常見錯別字和語病,可是通用性不足。
因此,現階段學術界和工業界研究的重點通常都是基於語言模型的糾錯技術。2018年以前,語言模型的方法能夠分爲傳統的n-gram LM和DNN LM,能夠以字或詞爲糾錯粒度。其中「字粒度」的語義信息相對較弱,所以誤判率會高於「詞粒度」的糾錯;「詞粒度」則較依賴於分詞模型的準確率。
爲了下降誤判率,每每在模型的輸出層加入CRF層校對,經過學習轉移機率和全局最優路徑避免不合理的錯別字輸出。
2018年以後,預訓練語言模型開始流行,研究人員很快把BERT類的模型遷移到了文本糾錯中,並取得了新的最優效果。
3、將BERT應用於文本糾錯
BERT示意圖BERT與以往深度學習模型的主要區別在於:預訓練階段使用了「掩碼語言模型」MLM和「判斷s1是否爲s2下一句」NSP兩個任務,特徵抽取使用12層雙向Transformer,更大的訓練語料和機器「More Money,More Power」。其中,MLM任務使得模型並不知道輸入位置的詞彙是否爲正確的詞彙(10%機率),這就迫使模型更多地依賴於上下文信息去預測詞彙,賦予了模型必定的糾錯能力。
一種簡單的使用方式爲,依次將文本s中的每個字c作mask掩碼,依賴c的上下文來預測c位置最合適的字(假設詞表大小爲20000,至關於在句子中的每個位置作了一個「20000分類」)。設置一個容錯閾值k=5,若是原先的字c出如今預測結果的top5中,就認爲該位置不是錯別字,不然是錯別字。
BERT文本糾錯Baseline固然這種方法過於粗暴,極可能形成高誤判率。做爲優化,咱們能夠採用預訓練的方式對BERT進行微調,顯著改進糾錯效果。糾錯的領域最好和微調領域相同(若是須要在新聞類文章中糾錯,可使用「人民日報語料」對模型微調)。
4、文本糾錯最優模型:Soft-Masked BERT
爲了彌補baseline方法的不足,最大限度發揮BERT功效,復旦大學的研究人員在2020 ACL上發表了最新論文:
「Spelling Error Correction with Soft-Masked BERT」。 arxiv.org論文首次提出了Soft-Masked BERT模型,主要創新點在於:
(1)將文本糾錯劃分爲檢測網絡(Detection)和糾正網絡(Correction)兩部分,糾正網絡的輸入來自於檢測網絡輸出。
(2)以檢測網絡的輸出做爲權重,將 masking-embedding以「soft方式」添加到各個字符特徵上,即「Soft-Masked」。
論文簡要分析
具體來看,模型Input是字粒度的word-embedding,可使用BERT-Embedding層的輸出或者word2vec。檢測網絡由Bi-GRU組成,充分學習輸入的上下文信息,輸出是每一個位置 i 可能爲錯別字的機率 p(i),值越大表示該位置出錯的可能性越大。
檢測網絡 與 Soft Masking
Soft Masking 部分,將每一個位置的特徵以 的機率乘上 masking 字符的特徵 ,以 的機率乘上原始的輸入特徵,最後兩部分相加做爲每個字符的特徵,輸入到糾正網絡中。原文描述:
糾正網絡
糾正網絡部分,是一個基於BERT的序列多分類標記模型。檢測網絡輸出的特徵做爲BERT 12層Transformer模塊的輸入,最後一層的輸出 + Input部分的Embedding特徵 (殘差鏈接)做爲每一個字符最終的特徵表示。
最後,將每一個字特徵過一層 Softmax 分類器,從候選詞表中輸出機率最大的字符認爲是每一個位置的正確字符。
整個網絡的訓練端到端進行,損失函數由檢測網絡和糾正網絡加權構成。
損失函數實驗結果
做者在「SIGHAN」和「NEWs Title」兩份數據集上作了對比實驗。其中「SIGHAN」是2013年開源的中文文本糾錯數據集,規模在1000條左右。「NEWs Title」是從今日頭條新聞標題中自動構建的糾錯數據集(根據文章開頭展現的類似字形、類似拼音字典),有500萬條語料。
Soft-Masked BERT 在兩份數據集上幾乎都取得了最好結果。同時咱們發現,Finetune對於原始BERT的表現具備巨大的促進做用。
論文代碼做者暫未開源,可是論文的模型和思路應該是很是清晰易懂的,實現起來不會太難。這兒先立個flag,有時間本身來實現一下。
5、立立刻手的糾錯工具推薦
筆者簡單調研發現,文本糾錯網上已經有很多的開源工具包供你們使用了。其中最知名的應該是 pycorrector
pycorrector github.com支持kenlm、rnn_crf、seq2seq、BERT等各類模型。結合具體領域的微調和少許規則修正,應該能夠知足大部分場景中的文本糾錯需求了。
使用測試Demo中筆者使用了經人民日報語料微調過的BERT模型,經過pycorrect加載來作基於MLM的文本糾錯。識別結果還算能夠,甚至「金字塔」這種須要常識的錯別字都糾正出來了。
固然pycorrect還支持各類語言模型和DNN模型,留給你們自行把玩 : )
此外,筆者還找到一個京東客服機器人語料作的糾錯模型:
基於京東客服機器人語料作的中文糾錯模型 github.com主要解決同音字自動糾錯問題,好比:
對京東新人度大打折扣 --> 對京東信任度大打折扣
我想買哥蘋果手機 --> 我想買個蘋果手機
不過倉庫上一次更新在5年前,年代久遠估計效果有限。
以上是筆者近期調研文本糾錯後的一些思考,恰好上週在實驗室組會中作了分享,就順便寫了這篇文章。若是你們發現有好的糾錯方法或論文,歡迎留言分享一塊兒交流哈