前面在作天然語言處理時涉及到一些詞性標註的工做,通常會使用隱馬爾科夫模型(HMM)來實現詞性標註,而HMM模型的解碼實現算法通常就會使用Viterbi算法。html
HMM模型有多種應用,這裏說的是其中一個常見應用,即根據觀察序列找到最可能的隱含狀態序列。最樸素的想法就是直接窮舉全部可能的隱含狀態序列,並計算出每一個組合成的狀態序列的機率,機率最大的那個組合序列便是最可能的隱含狀態序列。舉個水藻和天氣的例子,窮舉出全部可能的隱含狀態序列的機率,以下,
P(dry,damp,soggy | sunny,sunny,sunny), P(dry,damp,soggy | sunny,sunny,cloudy), P(dry,damp,soggy | sunny,sunny,rainy), . . . . P(dry,damp,soggy | rainy,rainy,rainy),最大值對應的序列即爲最可能的隱含狀態序列。窮舉的路徑一共有3的t次方條,能夠看到隨着序列還有狀態數的增長,計算量是很是大的。算法
上面的窮舉法須要的計算量很大,爲減小複雜度引入Viterbi算法,Viterbi算法要解決的解碼問題就是多步且每步多重選擇的最優選擇的問題。根據下圖就能很清晰看到Viterbi的核心思想,隨着時刻增長,每一個節點都保存了前一時刻全部節點到該節點的最優值的子路徑,如圖中紅色箭頭,當前時刻的某一節點可能的路徑爲上一時刻全部節點到該節點的路徑,但咱們只保留其中一條最優路徑。依次計算完全部步後,最後經過回溯的方法獲得整個過程的最優路徑。.net
下面用一個例子說明整個過程,假設有3中狀態,序列爲t個時刻,p(a1)表示a1節點的值,p(b1)表示b1節點的值,同理其餘的節點也同樣。對於不一樣時刻,狀態之間的轉換機率是不變的,因此p(aa)表示從a狀態轉移到a狀態的機率,無論是從1時刻到2時刻,仍是從2時刻到3時刻,都是相同的。同理還有p(ab)、p(ac)、p(ba)...。設計
t+1時刻節點值的計算公式爲3d
咱們計算t=2時刻的p(a)的值,它可能從a1到a二、b1到a2或c1到a2,假如a1到a2這條路徑計算出來的p(a)最大,那麼就保留該路徑。同理分別計算p(b)和p(c)的最大值,保留b1到b2的路徑,b1到c2的路徑。接着計算t=3時刻的p(a)、p(b)和p(c),最後到達t時刻,計算該時刻最大的p(a)、p(b)和p(c),選擇出它們最大的值的節點,再根據保留的上一時刻的路徑依次往前回溯,就獲得最優的序列。好比ct是最大的節點,那就是cdn
========廣告時間========htm
鄙人的新書《Tomcat內核設計剖析》已經在京東銷售了,有須要的朋友能夠到 item.jd.com/12185360.ht… 進行預約。感謝各位朋友。blog
=========================get
歡迎關注: