維特比演算法之中文分詞

2022-03-15 11:52:28 字數 2722 閱讀 8454

尋找上圖最短路徑

此專案需要的資料:

綜合類中文詞庫.xlsx: 包含了中文詞,當做詞典來用

以變數的方式提供了部分unigram概率word_prob

舉個例子: 給定詞典=[我們 學習 人工 智慧型 人工智慧 未來 是], 另外我們給定unigram概率:p(我們)=0.25, p(學習)=0.15, p(人工)=0.05, p(智慧型)=0.1, p(人工智慧)=0.2, p(未來)=0.1, p(是)=0

獲取中文字典

在變數word_prob沒有出現的的單詞但是出現在詞典裡的,統一把概率設定成為0.00001

import xlrd

file_path = './data/綜合類中文詞庫.xlsx'

workbook = xlrd.open_workbook(file_path)

booksheet = workbook.sheet_by_index(0)

col_values = booksheet.col_values(0)

dic_words = {}

max_len_word = 0

for word in col_values:

dic_words[word] = 0.00001

len_word = len(word)

if len_word > max_len_word:

max_len_word = len_word

word_prob =

for key, value in word_prob.items():

dic_words[key] = value

根據詞典,輸入的句子和 word_prob來建立帶權重的有向圖(directed graph)

#從頭開始遍歷,找到字典中存在的所有候選詞

def create_graph(input_str):

n = len(input_str)

graph = {}

for idx_end in range(1, n + 1):

print('idx_end',idx_end)

temp_list =

max_split = min(idx_end, max_len_word) # 最大切分長度為idx_end,即這次迴圈的結果

for idx_start in range(idx_end - max_split, idx_end): # 就是 0 : idx_end

word = input_str[idx_start:idx_end] # 根據起止索引得到單詞

print('idx_start',idx_start, word)

if word in dic_words:

print(idx_start,word)

graph[idx_end] = temp_list

print(graph)

print('_______________')

return graph

通過加權有向圖,實現維特比演算法

節點的含義:節點代表了它前面的那個字。

邊的含義: -log(概率) 由概率最大,變為該值最小,轉換為求最短距離問題

def word_segment_viterbi(input_str):

graph = create_graph(input_str)

n = len(input_str)

m = [np.inf] * (n + 1) # 長度為 n+1 長度的陣列。初始化無窮大。

m[0] = 0 # 路徑值,第0個節點的值為0,後面計算節點1路徑權值時候,需要加上節點0的值。

last_index = [0] * (n + 1)# 儲存一路轉移的索引

for idx_end in range(1, n + 1): # 兩層for迴圈 idx_end 為 incoming_links,字典的鍵

for idx_start in graph[idx_end]: # idx_start 到 idx 組成了乙個單詞。input_str[idx_start:idx_end] 在字典裡存在。

# 從字典找到這個單詞的概率。

# m[idx_start] 儲存了到這個單詞為止,最短路徑值。

log_prob = round(-1 * np.log(dic_words[input_str[idx_start:idx_end]])) + m[idx_start]

if log_prob < m[idx_end]:# 這次迴圈裡,判斷到idx_end 位置的最短路徑值。

m[idx_end] = log_prob

last_index[idx_end] = idx_start

best_segment =

i = n

while true:

best_segment.insert(0, input_str[last_index[i]:i])

i = last_index[i]

if i == 0:

break

return best_segment

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

維特比演算法原理可以參考以下文章,講解的非常詳細,那麼接下來將講解維特比演算法如何應用到分詞演算法中,並如何用python 實現。如何通俗地講解 viterbi 演算法?www.zhihu.com 一 過程分析 句子 經常有意見分歧 詞典 經常 經 有 有意見 意見 分歧 見 意 見分歧 分 概率 ...

維特比演算法

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

維特比演算法

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