糾錯框架的基本結構
雖然糾錯只是一個看著簡單的任務,但是實際上已經構建成了一個非常完整的系統,根據這個系統兼顧很多事情,舉幾個點:
充分縮小范圍,防止過糾,畢竟糾錯是NLP系統的上游,過糾的代價非常大。
充分挖掘可能錯誤的位置,在詞匯支持的情況,找到可能正確的結果,保證召回率。
各種抽取特征,能通過更加嚴謹的方式在多個候選中找到最優的結果。
然后我們來看看一個比較OK的糾錯系統結構是什么樣的,三大步驟:
錯誤檢測:檢測句子錯誤的部分,后續只對這個部分進行錯誤糾正。
候選召回:根據識別的錯誤進行針對性的修改,這塊依賴候選集。
候選排序:錯誤可能有很多。召回的結果也有很多,那個才是最優解,這步需要通過一定的方式得到最優結果。
錯誤檢測
錯誤檢測是文本進入糾錯體系的一個大門,設立他的目的有這幾個:
縮小糾正范圍,降低后續流程的壓力。
減少過糾,保證準確率,用戶自己輸對了卻改錯了體驗非常差。
換言之,我們需要在錯誤檢測中做的是,找到句子中可能出現錯誤的位置,提取出來任務就完成了,那么,這塊有什么方法呢。
最簡單的一種方法,就是結合詞典去做,這個詞典其實已經有比較通用的,那就是jieba的詞典(idf.txt),對于絕大部分人而言,輸入的東西一般都是TOP的,那么一些未見過的,即未登錄詞,就很可能是錯誤的內容了。但需要注意的是,領域內的詞匯我們需要補充,詞典覆蓋率要足夠的高,這樣識別的準確率才會夠高。
第二個方法也是一個無監督的方法——用語言模型。語言模型能評判一個句子出現的概率,換言之,如果句子出現的頻次足夠低,那這里面就很可能有錯誤的詞匯,再精確到句子中的每個位置,那就是一個局部的n-gram的條件概率了,如果概率比整個句子明顯低,那就說明這個位置或者說這個位置附近可能存在錯誤點,我們可以拿出來。其實這個應該這里幾個方法中門檻最低的一個了,只需要語料,不需要挖掘覆蓋率足夠大的詞典,也不需要標注樣本,直接可以做。
第三個想說的方法就是序列標注的方法。分詞和NER其實都可以抽象為序列標注問題,錯誤檢測也可以,簡單的其實就是整個句子中,有錯誤的標注為1,沒錯誤的標注為0,然后通過CRF之類的方法來進行預測,從而完成抽取。這個能很好的把控準確性,效果還是會比較好的,但問題在于這種標注樣本,可能比常規的ner樣本更難拿到。
pycorrector我前面提到過,就用了上面1、2兩種方法,在開放域里面其實效果不錯,但是在垂域,我們就需要更多的語料甚至是重新構建里面涉及的模型和詞典。
而在我的實踐中,又有如下的經驗,大家可以參考:
錯誤檢測這塊由于只是糾錯系統中的其中一部分,后續還有大量的步驟可以控制,所以我們并不需要對這步做非常高的準確性的要求,抱著“寧可錯殺也不放過”的思路去做,保證真正錯的部分能被拿出來即可,對準確率可以很大程度的放松。
無論是上面哪種方法,檢測錯誤的時候都要注意,檢測出錯誤的位置可能不是真的問題點,而可能識別出來的未知的附近,因此要擴大召回的話,附近的可以都挑出來試試一起處理。
候選召回
在指導錯誤的位置以后,我們就要開始對癥下藥了,那么,什么是可能的藥,我們就要開始找了,這就是候選召回的主要任務,針對錯誤點,我們找可能正確的結果。要找到正確的結果,主要是兩種方式:基于詞典的和基于NLG的。
基于詞典的方式是比較經典而且在現在還是比較常用的方法,說白了我們就要去找一些詞匯,我們叫做“混淆集”,也就是一個簡單的kv對,遇到什么詞,我們就給出一些候選的結果,這個的結果非常簡單,但是挖掘會非常困難,搜索領域常用的方式就是共現query,大部分情況下,用戶會在沒有得到正確結果的時候修正結果重新搜索,所以共現query是一個非常好的挖掘資源。
基于詞典的方式糾錯的量總有上限,但是總有一些難以召回的情況,因此借助一些NLG的方式,可以擴大召回,這個NLG,是一種文本生成的方式,可以根據上下文糾正的句子,給出一些可能的結果。但是這個方案的缺點是非常依賴平行樣本,即一個錯誤、一個正確的樣本,這個獲取往往會比較難。
候選排序
現在對一個我句子,我們手里都有很多候選的結果,這里的候選排序主要有兩個目的:
判斷這么多候選結果中選出最好的幾個。
最好的幾個相比原來的句子要足夠好,才能被糾。
這里,我們需要持續思考的是,這個排序規則改怎么定。
最簡單的方式就是使用語言模型的perplexity,即混淆度,這是用來一個句子他真的是句子的打分,一般而言這個正常無錯的句子ppl就會比較小,有錯的句子是ppl的比較大,可以用這個指標來衡量最佳的糾錯結果是什么。
光一個ppl的評判是不夠的,不僅僅是ppl的相對量,還有絕對量,還有就是pl雖然下降但是還是很高,還有和ppl無關的因素,如拼音的相似度、和原句的相似度等,因此可以先升級為機器學習,把前面提到的指標抽取為特征,通過簡單的機器學習進行計算。
進一步地,同樣可以使用平行樣本,通過深度學習的方式來衡量是否需要糾正。
其他相關
糾錯只是一個系統,我們要在里面添加很多的零件完成各個我們拆解的任務,我們來看看有什么需要做的事情:
語言模型。語言模型在糾錯中起到了至關重要的作用,因此一個好的語言模型非常重要,而影響語言模型效果的很大一塊因素就是數據,尤其是統計語言模型,通過調整數據集的分布,例如使用特定垂域的語料進行訓練,能有效提升最終的效果,但要注意不要把錯誤句子過多的引入到模型中。
混淆集。混淆集用于候選召回,如果正確結果無法被召回,則效果會受到很大影響,因此我們需要通過多渠道挖掘,在github、知乎等網站,加上一些論文提到的數據中收集外部數據,同時通過用戶query,尤其是共現query來獲取一些用戶容易混淆的錯誤。有一篇文章提到了,混淆集是糾錯的上限,正確答案召回不到,好的錯誤檢測和候選排序都沒用。
規則。糾錯系統中需要大量的規則,錯誤檢測階段衡量錯誤的閾值我們要用規則卡,排序階段我們也需要一些提權降權保證最終我們需要的內容能排在前面,例如一些專有名詞的保護,”電池“不能被改為”滇池“,”嬴政“不能被改為”行政“。這些規則看著簡單,但是要想提出這些規則,必須對數據有足夠的了解。
小結
一連幾篇討論了糾錯,對糾錯問題有了比較完整的理解,可以知道一個簡單的問題可以進行細化然后構建出完整的系統。最后我放幾篇比較好的參考文章,大家可以繼續深入閱讀。
平安糾錯:https://zhuanlan.zhihu.com/p/159101860
中文(語音結果)的文本糾錯綜述:https://blog.csdn.net/lipengcn/article/details/82556569?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2
-
框架
+關注
關注
0文章
399瀏覽量
17435 -
糾錯
+關注
關注
0文章
5瀏覽量
13285 -
語言模型
+關注
關注
0文章
508瀏覽量
10245
原文標題:深入討論糾錯系統
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論