维特比算法 python_维特比算法实现分词
維特比算法原理可以參考以下文章,講解的非常詳細,那么接下來將講解維特比算法如何應用到分詞算法中,并如何用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代碼實現
總結
以上是生活随笔為你收集整理的维特比算法 python_维特比算法实现分词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知乎关注度人数最多的问题排行榜 TOP1
- 下一篇: python是一门跨平台语言_pytho