維特比演算法 python 維特比演算法實現分詞

2021-10-11 22:01:13 字數 1484 閱讀 4057

維特比演算法原理可以參考以下文章,講解的非常詳細,那麼接下來將講解維特比演算法如何應用到分詞演算法中,並如何用python**實現。如何通俗地講解 viterbi 演算法?​www.zhihu.com

一、過程分析

句子:經常有意見分歧

詞典:「「經常」,「經」,「有」,「有意見」,「意見」,「分歧」,「見」,「意」,「見分歧」,「分」」

概率:「0.1,0.05,0.1,0.1,0.2,0.2,0.05,0.05,0.05,0.1」

-log(x):「2.3,3,2.3,2.3,1.6,1.6,3,3,3,2.3」

解決方案:

有的字在列表中沒有概率值,那麼我們就賦予乙個很小很小的概率,比如

。那麼取-log之後呢是乙個很大的數,我們暫且假設為20。

首先構造有向圖:根據詞典和-log(x)畫出有向圖

圖中的每條路徑都可以成為乙個分詞結果,那麼哪個是最優路徑呢?

比較 分詞結果 經常,有,意見,分歧 和 經常,有意見,分歧誰更優

就是比較p(經常,有,意見,分歧)和 p(經常,有意見,分歧)的大小,我們選擇概率值大的分詞結果為最優分詞結果。

對概率值取-log是因為概率值本來就很小,如果相乘的話會下溢位,所以取了乙個log,負數是因為演算法中解決最小值問題更為方便,所以取負號:-logp(經常,有,意見,分歧)和 -logp(經常,有意見,分歧)那麼就選擇結果值最小的為最優分詞結果

-logp(經常,有,意見,分歧)= -(logp(經常) + logp(有) + logp(意見) + logp(分歧))

那麼就轉化為乙個數值相加的問題了,就是路徑上值之和最小的路徑為最優路徑。

那麼轉化為尋找最短路徑問題,有很多演算法可以解決這個問題,那麼在這個地方我們用維特比演算法可以很方便的計算出來。

我們計算從1到8的最短路徑,那麼首先假定乙個函式:

f(8): 從節點1到8的最短路徑的值

f(7): 從節點1到7的最短路徑的值

往下依次相同的定義

f(8) = f(7) + 20

= f(6) + 1.6

= f(5) + 3

以上3個路徑中選擇乙個最小的作為從1到8的最優路徑

f(7)= f(6) + 2.3

f(6) = f(5) + 2

= f(4)+1.6

= f(3) + 2.3

從上面3個路徑中選擇最小的作為從1到6的最優路徑

如果用遞迴演算法計算的話,有的節點會重複計算很多次,所以可以用動態規劃演算法來實現。

我們維護兩個個陣列:

乙個陣列中每個節點裡面存放從節點1到當前節點的最短路徑值

另乙個陣列中每個節點存放到當前節點的最短路徑值的直接前驅節點

由圖可以找到從1到8的最短路徑:

到達8的最短路徑是從6過來的

到達6的最短路徑是從3過來的

到達3的最短路徑是從1過來的

節點:1,3,6,8

所以最終的分詞結果是:[經常,有意見,分歧]

二、python**實現

Viterbi Algorithm(維特比)演算法

csdn部落格 皮乾東 知乎 htrying 微博 htring的微博 viterbi algorithm演算法 維特比演算法是乙個特殊但應用最廣的動態規劃演算法。利用動態規劃,可以解決任何乙個圖中的最短路徑問題。而維特比演算法是針對乙個特殊的圖 籬笆網了 lattice 的有向圖最短路徑問題而提出...

維特比演算法

維特比演算法在機器學習中非常重要,在求解隱馬爾科夫和條件隨機場的 問題中均用到了維特比演算法。實際上,維特比演算法不僅是很多自然語言處理的解碼演算法,也是現代數字通訊中使用最頻繁的演算法。以乙個簡單的隱馬爾科夫模型為例,n 為觀測符號,y y1,y2,y n 為隱狀態序列,要求的 問題為 y 1,y...

維特比演算法

維特比演算法主要用來解決籬笆網路,老實講我第一次聽到這個名字是發懵的,網路我是知道的,說白了就是圖 迪傑特斯拉演算法 但是,籬笆網路是值下面這種一列一列的圖,只會前面連線到後面,而且不會跳層連線,可以說是一種非常特殊且友好的圖了 正常的圖能逼死強迫症 x max xx x x x xma x x 這...