原始碼閱讀之jieba分詞

2021-10-19 19:33:44 字數 3886 閱讀 6641

# 功能:計算每一步的最優路徑

#輸入:

# 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...