# 功能:計算每一步的最優路徑
#輸入:
# sentence:我是來到北京清華大學
# dag:
# route:{}
defcalc
(self, sentence, dag, route)
: n =
len(sentence)
route[n]=(
0,0)
logtotal = log(self.total)
for idx in
xrange
(n -1,
-1,-
1): route[idx]
=max
((log(self.freq.get(sentence[idx:x +1]
)or1)
-logtotal + route[x +1]
[0], x)
for x in dag[idx]
)# route最後儲存每一步最優路徑結果形式:
class
tire
:def
__init__
(self)
: self.dic=
definsert
(self,word)
: root=self.dic
for char in word:
if char not
in root:
root[char]
= root = root[char]
else
: root=root[char]
root[
'val']=
1def
search
(self,word)
: root=self.dic
for char in word:
if char not
in root:
return
false
else
: root=root[char]
if root[
'val']==
1:return
true
else
:return
false
defstart
(self,word)
: root=self.dic
for char in word:
if char not
in root:
return
false
else
: root=root[char]
return
true
import numpy as np
class
viterbi
:def
my_compute
(self,obs,states,start_p,trans_p,emit_p)
: len_obs=
len(obs)
# 3 len_states=
len(states)
# 2 matrix_p=np.zeros(
(len_states,len_obs)
)# 2*3
path = np.zeros(
(len_states, len_obs)
)# 2*3
for i in
range
(len_states)
:# 計算初始觀測值概率
start_obs_p=start_p[i]
* emit_p[i]
[obs[0]
] matrix_p[i][0
]=start_obs_p
path[i][0
]=ifor i in
range(1
,len_obs)
:# 觀測值長度
for j in
range
(len_states)
:# 當前列狀態
for k in
range
(len_states)
:# 前一列狀態概率
prob_k_j=matrix_p[k]
[i-1
]*trans_p[k]
[j]*emit_p[j]
[i]#print(prob_k_j)
if prob_k_j>matrix_p[j]
[i]:
matrix_p[j]
[i]=prob_k_j
path[j]
[i-1]=k
#print(matrix_p)
for m in
range
(len_states)
: path[m][-
1]=m print
(path)
print
(matrix_p)
max_prob=
0 best_path=
0for n in
range
(len_states)
:if matrix_p[n][-
1]>max_prob:
best_path=n
max_prob=matrix_p[n][-
1]return path[best_path]
deftest
(self)
:# 隱狀態
hidden_state =
['sunny'
,'rainy'
]# 觀測序列
obsevition =
['walk'
,'shop'
,'clean'
] state_s =[0
,1] obser =[0
,1,2
]# 初始狀態,測試集中,0.6概率觀測序列以sunny開始
start_probability =
[0.6
,0.4
] transititon_probability = np.array([[
0.7,
0.3],[
0.4,
0.6]])
# 發射概率,0.4:sunny在0.4概率下為shop
emission_probability = np.array([[
0.6,
0.3,
0.1],[
0.1,
0.3,
0.6]])
result = self.compute(obser, state_s, start_probability, transititon_probability, emission_probability)
print
('######'
) result=self.my_compute(obser, state_s, start_probability, transititon_probability, emission_probability)
for k in
range
(len
(result)):
print
(hidden_state[
int(result[k])]
)x=viterbi(
)x.test(
)
jieba分詞原始碼分析
jieba是乙個開源的中文分詞庫。posseg 自定義詞典 init.py jieba分詞的入口 compat.py dict.txt 總的詞庫,記錄乙個詞 詞頻和詞性 test 測試demo encoding utf 8 import jieba seg list jieba.cut 我來到北京清...
jieba分詞原始碼解讀四
在上一節中我們考察了結巴分詞對於未登入詞的分詞方法,它使用了hmm模型和用來解碼hmm的維特比演算法。較之基於語料庫打分的初步分詞結果,例句 喬治馬丁寫冰與火之歌拖了好久 分詞情況變成了這樣 喬治 馬丁 寫冰 與 火之歌 拖 了 好久 比原來有改進,但改進幅度可以忽略不計。下一步我們就要除錯 了,目...
原始碼閱讀 Glide原始碼閱讀之with方法(一)
前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...