語言模型
由於影象質量等原因,效能再好的識別模型,都會有識別錯誤的可能性,為了減少識別錯誤率,可以將識別問題跟統計語言模型結合起來,通過動態規劃的方法給出最優的識別結果。這是改進ocr識別效果的重要方法之一。
轉移概率
在我們分析實驗結果的過程中,有出現這一案例。由於影象不清晰等可能的原因,導致「電視」一詞被識別為「電柳」,僅用影象模型是不能很好地解決這個問題的,因為從影象模型來看,識別為「電柳」是最優的選擇。但是語言模型卻可以很巧妙地解決這個問題。原因很簡單,基於大量的文字資料我們可以統計「電視」一詞和「電柳」一詞的概率,可以發現「電視」一詞的概率遠遠大於「電柳」,因此我們會認為這個詞是「電視」而不是「電柳」。
從概率的角度來看,就是對於第乙個字的區域的識別結果s1,我們前面的卷積神經網路給出了「電」、「宙」兩個候選字(僅僅選了前兩個,後面的概率太小),每個候選字的概率w(s1)分別為0.99996、0.00004;第二個字的區域的識別結果s2,我們前面的卷積神經網路給出了「柳」、「視」、「規」(僅僅選了前三個,後面的概率太小),每個候選字的概率w(s2)分別為0.87838、0.12148、0.00012,因此,它們事實上有六種組合:「電柳」、「電視」、「電規」、「宙柳」、「宙視」、「宙規」。
結果如下圖:
圖20 考慮轉移概率
從統計的角度來看,最優的s1,s2組合,應該使得式(14)取最大值:
因此,可以算得s1,s2的最佳組合應該是「電視」而不是「電柳」。這時我們成功地通過統計的方法得到了正確結果,從而提高了正確率。
動態規劃
圖21 多字的規劃問題
類似地,如圖21,如果乙個單行文字有n個字
取得最大值,這就是統計語言模型的思想,自然語言處理的很多領域,比如中文分詞、語音識別、影象識別等,都用到了同樣的方法[6]。這裡需要解決兩個主要的問題:(1)各個
轉移概率矩陣
對於第乙個問題,只需要從大的語料庫中統計si的出現次數#si,以及si,si+1相接地出現的次數#(si,si+1),然後認為
即可,本質上沒有什麼困難。本文的識別物件有3062個,理論上來說,應該生成乙個3062×3062的矩陣,這是非常龐大的。當然,這個矩陣是非常稀疏的,我們可以只儲存那些有價值的元素。
現在要著重考慮當#(si,si+1)=0的情況。在前一節我們就直接當p(si|si+1)=0,但事實上是不合理的。沒有出現不能說明不會出現,只能說明概率很小,因此,即便是對於#(si,si+1)=0,也應該賦予乙個小概率而不是0。這在統計上稱為資料的平滑問題。
viterbi演算法
對於第二個問題,求解最優組合
viterbi演算法是乙個簡單高效的演算法,用python實現也就十來行的**。它的核心思想是:如果最終的最優路徑經過某個si−1,那麼從初始節點到si−1點的路徑必然也是乙個最優路徑——因為每乙個節點si只會影響前後兩個p(si−1|si)和p(si|si+1)。
根據這個思想,可以通過遞推的方法,在考慮每個si時只需要求出所有經過各si−1的候選點的最優路徑,然後再與當前的si結合比較。這樣每步只需要算不超過 次,就可以逐步找出最優路徑。viterbi演算法的效率是
提公升效果
實驗表明,結合統計語言模型進行動態規劃能夠很好地解決部分形近字識別錯誤的情況。在我們的測試中,它能修正一些錯誤如下:
通過統計語言模型的動態規劃能修正不少識別錯誤
由於用來生成轉移矩陣的語料庫不夠大,因此修正的效果還有很大的提公升空間。不管怎麼說,由於viterbi演算法的簡單高效,這是乙個價效比很高的步驟。
綜合評估
1、資料驗證
儘管在測試環境下模型工作良好,但是實踐是檢驗真理的唯一標準。在本節中,我們通過自己的模型,與京東的測試資料進行比較驗證。
衡量ocr系統的好壞有兩部分內容:(1)是否成功地圈出了文字;(2)對於圈出來的文字,有沒有成功識別。我們採用評分的方法,對每一張的識別效果進行評分。評分規則如下:
按照這個規則,每張的評分最多是2分,最少是0分。如果評分超過1,說明識別效果比較好了。經過京東的測試資料比較,我們的模型平均評分大約是0.84,效果差強人意。
2、模型綜述
在本文中,我們的目標是建立乙個完整的ocr系統,經過一系列的工作,我們也基本完成了這一目標。
在設計演算法時,我們緊密地結合基本假設,從模擬人肉眼的識別思路出發,希望能夠以最少的步驟來實現目標,這種想法在特徵提取和文字定位這兩部分得到充分體現。
同樣地,由於崇尚簡潔和模擬人工,在光學字元識別方面,我們選擇了卷積神經網路模型,得到了較高的正確率;最後結合語言模型,通過動態規劃用較簡單的思路提公升了效果。
3、結果反思
在本文所涉及到的演算法中,乙個很大的不足之處就是有很多的「經驗引數」,比如聚類時h引數的選擇、低密度區定義中密度的閾值、卷積神經網路中的卷積核資料、隱藏層節點數目等。由於並沒有足夠多的標籤樣本進行研究,因此,這些引數都只能是憑藉著經驗和少量的樣本推算得出。我們期待會有更多的標籤資料來得到這些引數的最優值。
還有,在識別文字區域方面,還有很多值得改進的地方。雖然我們僅僅是經過幾個步驟就去掉了大部分的文字區域,但是這些步驟還是欠直觀,亟待簡化。我們認為,乙個良好的模型應該是基於簡單的假設和步驟就能得到不錯的效果,因此,值得努力的工作之一就是簡化假設,縮減流程。
此外,在文字切割方面,事實上不存在一種能夠應對任何情況的自動切割演算法,因此這一步還有很大的提公升空間。據相關文獻,可以通過cnn+lstm模型,直接對單行文字進行識別,但這需要大量的訓練樣本和高效能的訓練機器,估計只有大型企業才能做到這一點。
顯然,還有很多任務作都需要更深入地研究。
NLP(四) 語言模型
這是一系列自然語言處理的介紹,本文不會涉及公式推導,主要是一些演算法思想的隨筆記錄。適用人群 自然語言處理初學者,轉ai的開發人員。程式語言 python 參考書籍 數學之美 參考教程 機器讀心術之自然語言處理 對於像漢語,英語這樣的大型自然語言系統,難以構造精確的文法 不符合人類學習語言的習慣 有...
n gram 語言模型的平滑技術
1.統計語言模型 首先乙個句子的概率 p s 但是存在兩個問題 2.n gram模型 為了解決第乙個問題引入馬爾科夫假設 markov assumption 乙個詞的出現僅與它之前的若干個詞有關 然後利用極大似然估計 maximum likelihood estimation,mle 計算每一項的頻...
C語言 記憶體四驅模型
在c c 執行時將資料分為四個區域 堆區 棧區 區和資料區。一般記憶體的分類分為 棧區 堆區 全域性區 靜態區 存放全域性變數與靜態變數static bss段 文字常量區 資料區 區等。用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時...