知物由學 | “找茬”不如交給AI演算法,細說文字糾錯的多種實現途徑

網易易盾發表於2021-12-28

顧名思義,文字糾錯就是將文字中有錯誤的地方進行糾正,錯誤型別包含錯別字、缺失字、冗餘字、詞語搭配錯誤和語法錯誤等。目前也有一些開源的文字糾錯工具,比如pycorrector等,雖然這些工具可以滿足一部分場景中的文字糾錯需求,但其效果距離真正應用還有較大的差距,所以十分有必要自行上手構建一個文字糾錯系統。


近年來,錯別字連篇的法律檔案、寫錯國家機構的新聞報導、國名有誤的釋出會現場,無不成為網友熱議的物件。為何低階錯誤無人發現?為何專業人士竟在文字上遭遇“滑鐵盧”?一連串的質疑也說明,文字糾錯是內容安全的首當其衝的一面。

 

在避免文字錯誤上,人工智慧或許比人類更具優勢,它能夠記住大量的資料,且不會被糟心事影響情緒,不僅能基於客觀現實執行任務,還能夠比人類更好地評估和權衡相關因素,比人類更快、更準確地識別。


圖片


一套優質的“文字糾錯”系統,自動對輸入文字進行糾錯提示,並給予修改建議,讓政府機構工作人員、媒體人、文字撰稿人、編輯、律師等職業從繁雜的文字“找茬”任務中脫離出來,快速找到一時疏忽與認知錯位導致的字詞錯誤,有效降低內容風險。本文將介紹文字糾錯的相關知識,提供文字糾錯的幾種技術落地方式。

 

01 用詞庫對文字進行糾錯


文字糾錯系統透過一個內建詞庫對文字進行糾錯,這是最簡單粗暴的方式。詞庫在文字糾錯中可以處理一些常見詞語的錯誤,如一些常見的人名、地名或者常用詞。比如“秦時皇”可以被糾正為“秦始皇”;“鼓浪與”可以被糾正為“鼓浪嶼”;“洛因繽紛”可以被糾正為“落英繽紛”。

 

同時,詞庫可以對業務方反饋的badcase進行快速的修正,這在演算法側是不太現實的。填平一個badcase的坑,達到後續自動發現糾正的效果,演算法側往往需要重新花1~2周去重新訓練一個模型。詞庫雖然行動快速,但是也難免過於“橫衝直撞”。詞庫糾錯缺乏了上下文資訊的利用,其所能達到的效果是遠遠不夠的,所以詞庫糾錯是文字糾錯中必要但不充分的一個環節。

 

02 BERT模式的文字糾錯


自從BERT在2018年出現後,NLP領域的各大榜單基本上都被BERT模型和它的各種變種模型(RoBERTaERNIENEZHAXLNetBART)所佔據。即使是到現在,NLP領域的各項工作都被BERT模型這種大規模資料無監督預訓練+小規模資料有監督微調這種模式所影響。那麼文字糾錯是否可以用BERT模型來做呢?先來看一下原始的BERT模型任務。


這裡由於在實際使用中我們去掉了NSP任務,所以在輸入端沒有加上Segment Embedding。


圖片


於是,我們可以很方便的將原始BERT模型的MLM任務改進為糾錯任務。在訓練/微調階段,我們可以將15%的token隨機替換成錯誤的字,然後讓模型將正確的字還原出來,這和BERT模型的訓練任務是一致的。當然這裡我們也可以引入wwm、ERNIE或者spanBERT裡的詞邊界資訊來提升模型的效果,這裡不再展開。)


圖片


在測試階段,直接把原文輸入給模型,讓模型預測每個位置的正確token,看預測token跟原始token是否一致就可以知道每個位置的token是否有錯,以及正確的token是什麼。


但是,可以看到,上面我們只處理了錯字這種輸入和輸出等長的情況,在文字糾錯中還存在少字、多字等輸入和輸出長度不相等的情況(如“哈濱是黑龍江的省會”需要被更改為“哈爾濱是黑龍江的省會”),而原始的BERT模型對於這種情況是無法處理的。


針對上述的情況,可以有如下兩種解決方案。這裡我們只討論少字的情況,因為多字情況其實仍然可以視為一個錯字替換的問題(將原始token替換為空)。

 

方案一:預測缺失字數

 

在將文字輸入到BERT模型之前,我們可以先用一個前置模型去預測缺失字的個數,將缺失的地方用特殊字元[MASK]進行填充,然後再使用BERT語言模型生成修正候選結果,最後透過比較多個候選修正句子的困惑度來確定缺失修正結果。如下圖所示:


圖片


方案二:透過序列標註來進行文字的糾錯


我們可以將文字糾錯問題轉化為標籤序列標註問題(具體可以檢視Google在2019年開源的LASERTAGGER模型),然後再根據標籤所對應的編輯操作,將輸入文字修改後得到正確的輸出文字。具體地,在文字糾錯任務中我們可以設計4類標籤,分別為KEEP、DELETE、DELETE|x、KEEP|x,其中KEEP表示當前文字無需修改,DELETE表示當前文字需要刪除、DELETE|x表示當前文字需要被替換為token x、KEEP|x表示需要在當前文字前插入token x。藉助於這種方式,我們就可以自然地對各種不同型別的錯誤進行修正。


圖片


 

03 基於生成的文字糾錯


儘管用BERT模型進行文字糾錯已經可以取得不錯的效果,但是僅透過BERT模型來進行文字糾錯仍存在一些缺陷。在BERT模型中,每個輸出的token之間是相互獨立的,也就是說上一個step中輸出的錯誤糾正並不會影響到當前step的錯誤糾正,那麼就會導致如下圖的問題:


圖片


在句子“冰是液體”中,儘管位置θ的token“冰”已經被糾正為“水”,但是該糾正資訊並沒有傳遞到位置2的token中,所以模型在預測2位置的輸出時仍然會將“液”糾正為“固”,這就導致了錯誤。


為解決上訴問題,可以引入生成模型來進行文字糾錯。在生成模型中,輸出是從左向右逐個生成的,左邊的輸出資訊可以傳遞到右邊的輸出中,因此可以解決上述的缺陷。採用生成模型進行文字糾錯也有兩種方案:


方案一:GPT式的生成


這種方式的實現過程也比較簡單,只需要在原有的BERT模型後面在嵌入一層或多層Transformer Decoder就可以了。等價於NMT任務,需要將有錯的文字翻譯為沒有錯的文字。

 

方案二:UniLM式的生成

 

這種生成方式使用的仍然是BERT模型的架構,不需要對模型進行改變。但在預訓練階段需要透過控制AttentionMask來讓模型學習如何進行生成。如下圖: 


圖片

UniLM文字校對過程如下圖:


圖片


04 模型結果的修正


接下來,我們需要修正模型建議的結果,因為我們不能保證文字糾錯模型的輸出都是正確的,當模型出現誤判的時候,我們需要放棄對應修改,這對提升糾錯模型的準確率很有幫助。


字音、字形相似度的限制

 

考慮到中文的輸入基本上都是拼音或者五筆,因此錯誤內容在字音或者字形上基本上都是相似的。基於此,我們可以透過字音、字形對修改結果進行限制。

 

方法一:將字音、字形作為特徵輸入到模型中。阿里在ACL2020提出了SPELLGCN,透過圖神經網路,將字音、字形特徵引入模型,其主要作用就是限制每個字的輸出空間,錯誤字的糾正結果更應該被預測為其音近字或者形近字。


方法二:在模型外對輸出結果進行字音字形的限制。該方法具體可參考FASPELL,該方法結合模型輸出結果,再綜合考慮字音、字形相似度來選出最終的修正結果。


圖片


句子困惑度的限制


通常,我們可以困惑度來評價一個語言模型的好壞,比如一個句子困惑度的計算可以表示為:

圖片


在這裡,我們還可以訓練一個模型來對修正的句子計算困惑度,當發現修改之後句子的分數反而降低了,我們就可以放棄本次修改。


文字糾錯的展望


文字糾錯是目前MLP領域難度較高的的一項工作,如何覆蓋各種不同的錯誤型別,如何應對不同場景下的文字差異,是一項很有挑戰性的工作。同時,文字糾錯技術有著廣泛的應用場景,值得我們長期投入時間和精力進行研究與打磨。


相關文章