關於Faspell的使用經驗分享

2021-10-08 13:04:26 字數 2100 閱讀 8871

從技術的原理來說,錯別字顯然是乙個經驗型的技術,輸入的一句話怎麼排?每個字出現的概率概率高低?都是依靠訓練樣本給出足夠的場景資料得出的。從這方面來講,lstm+crf的經典組合必然是首先考慮的。但是又考慮到bert的mlm任務是如此的符合錯別字檢測糾錯場景,因此也關注到基於bert的ctc(chinese text correction)演算法。

最終選擇bert體系演算法的原因主要有兩者:

bert的預訓練模型模型太強了,這個就不用多說了,個人如果有裝備訓練乙個同資料量的lstm,我覺得還不如考慮去買套房。

bert不論從演算法本身來說,還是預訓練時的任務,都更符合我需要的場景。

另外,現在有很多第三方的開源糾錯庫,其實如果是垂直領域的文字材料糾錯,我還是非常建議選用可以fine-tune的演算法。

言歸正傳,接下來詳細介紹下faspell的部分。官方給出的faspell我閱讀後並沒有感受到非常具體的資訊,但是覺得愛奇藝給出的這樣乙個糾錯思路是比較試用大部分垂直場景的,我後續也針對我的工作對此做了一些**上的優化和改動,**可以參考:

我簡化了整個專案的入口部分,並且只選用了拼音作為我的糾錯方向,因為我的測試場景是基於輸入的,所以放棄了筆畫的比較,從faspell_wh.py順著看下去基本就能看明白原理了。

faspell整體上說是分成的兩部分,乙個是encoder部分,乙個是decoder部分,decoder也就是**種提到的csd,其原理其實不複雜,encoder部分基本就是bert,先利用bert對輸入的句子中每個字進行**,**出每個位置topn的潛在文字。接下來,decoder部分從筆畫相似性和拼音相似性兩個維度綜合對topn中的文字進行rank,從而給出模型inference出的正確結果。

通過上述的的內容,大家不難看出,faspell的重點部分其實還是前面的bert**部分,當然你要是感興趣,換成xlnet、gpt都是可以的。作者預設的預訓練模型是google官方提供的110m那款的漢字預訓練模型:

這個模型可以解決日常常用語的大部分錯別字糾錯的情況,但是,如果說你要在垂直領域內尤其是具備多種專有表述方式的場景,一定要fine-tune。這裡fine-tune時有乙個非常重要的點,也是faspell作者在訓練時指出的,就是fine-tune時bert訓練資料需要人工的對其每個字均進行mask,而不是任由bert那隨機產生的15%機率來mask,作者目的在於強化模型對該垂直領域具備更加強的擬合度,產生這些訓練資料的**在bertmodified目錄下,先由createdata.py生成資料集,再由create_tf_record.py來建立用於訓練的tfrecord檔案。本人準備了一套約10000條的原始fine-tune資料集,對每個字進行mask後,生成了約100000條資料集,最終對1000條隨機生成的近似音錯別字語句進行測試,垂直領域下,可以做到召回率94%,正確率90%。

當然如果你實在懶得弄,我覺得只要你資料量不小,直接基於你的垂直領域資料集個fine-tune也可以,也不是一定要把每個字都mask起來,畢竟bert自身的15%mask概率也不算低了。

當然,上述的成績僅僅依靠上面的bert fine-tune技巧是肯定不行的,接下來講講csd的部分。這塊內容實際上的功能就是一種相似性的計算,一句話中的某個字,bert給出了5個**結果,那麼這6個**結果如果第乙個**結果與本字相同,那麼則認為本字不是錯別字。但是如果第乙個**結果與本字不同,則要在拼音和筆畫兩個方向上找出最相似的那麼字作為最後**出的改正字。在原文中,作者在這部分提出乙個訓練的概念,這個訓練並不是指神經網路的那種訓練,而是根據訓練集找到兩個權重,分別是筆畫的相似性權重和拼音的相似性權重,每個**字使用:筆畫權重*筆畫相似度+拼音權重*拼音相似度,來得出每個**字的整體置信度。

而本人所在場景,都是年輕人使用且通過手機輸入的場景,五筆的可能性實在是太低,所以我對上述過程進行了簡單的針對性優化。首先,bert給出5個**結果,首先判斷這5個**結果中有沒有任意乙個字與原字是相同的,只要存在乙個**結果相同,那麼這個字則判斷不是錯別字。若5個**結果均與原字步相同,那麼則分別計算拼音相似度,拼音相似度最高的認為是**出的修正結果。

筆畫:/blob/master/data/ids.txt

拼音:/blob/master/data/char_meta.txt

最後再強調下,我給出的git**裡沒有我fine-tune後的模型,因為是公司的財產,是不能上傳的,但是這套錯別字的糾正思路原則上講是比較清晰的,雖不複雜但是效果不錯。

關於 WinScp 的一點使用經驗

在嵌入式平台下 是,使用ssh登陸,可以使用winscp提供的圖形介面,支援拖拽,滑鼠直接開啟,甚是好用。使用winscp 登陸的方式有,scp和sftp兩種,之前乙隻用scp,但後來出現了如下錯誤,登陸無法載入目錄 這種錯誤乙隻沒有解決。後來就是用了sftp。這需要把sftp server檔案 s...

關於雲客網使用經驗分享

在雲客網上如何接單?註冊需要哪些條件?這些都是近期經常收到優化師的提問,在此,我就全面的為大家介紹下關於雲客網使用經驗分享。雲客網是乙個專門為優化師打造的平台。雲客網,是我喜歡的配色簡潔輕快地頁面風格。註冊為使用者的過程和一般註冊相差無幾,但值得一提的是他要求實名認證,大家要準備好一張自己與身份證有...

關於log日誌級別的使用經驗

軟體中總免不了要使用諸如 log4net,log4j,tracer 等東東來寫日誌,不管用什麼,這些東東大多是大同小異的,一般都提供了這樣5個日誌級別 debug info warn error fatal 乙個等級比乙個高,但是在具體開發中,關於應該如何選擇適應的等級,卻沒有找到好的文章進行說明。...