尋找上圖最短路徑
此專案需要的資料:
綜合類中文詞庫.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 這...