基於前幾篇文章對維特比演算法的說明,此文對維特比演算法進行實現,並基於維特比演算法實現給定語句的詞性標註。關於\(pi,a,b\)的說明參考文章詞性標註語料預處理實戰,維特比相關演算法說明參考詞性標註維特比演算法介紹
def log(v):
if v == 0:
return np.log(v+0.000001)
return np.log(v)
def vertibe(x, pi, a, b):
""":param x:輸入的待**詞性的文字,例如 "i like nlp"
:param pi:初始的詞性概率
:param a:給定詞性,每個單詞的概率
:param b:詞性之間的狀態轉移概率
:return:
"""# 處理輸入的文字數,獲取輸入文字在上文處理的id號
x = [word2id[word] for word in x.split(" ")]
# 獲取輸入文字分詞後的長度
t = len(x)
# dp[i][j] 標識第i個詞的詞性為第j個詞性
dp = np.zeros((t, n))
ptr = np.array([[0 for x in range(n)] for y in range(t)])
# 計算第乙個詞在給定詞性的概率
for j in range(n):
dp[0][j] = log(pi[j]) + log(a[j][x[0]])
for i in range(1, t): # 迴圈每乙個單詞
for j in range(n): # 每個詞性
dp[i][j] = -99999999 # 設定乙個很小的分值,作為後續計算每次的計算比較值
for k in range(n): # 迴圈每個詞性,計算從上乙個詞性到當前詞性的值
score = dp[i-1][k] + log(b[k][j]) + log(a[j][x[i]])
if score > dp[i][j]:
dp[i][j] = score
ptr[i][j] = k # 記錄得分最高的值是從上一層的那個節點過來的
# 把最好的詞性標註序列列印出來
best_seq = [0]*t
# step 1 找出對應於最後乙個詞的詞性
best_seq[t-1] = np.argmax(dp[t-1])
# step 2 通過迴圈,從後到前依次求出每個單詞的詞性
for i in range(t-2, -1, -1):
best_seq[i] = ptr[i+1][best_seq[i+1]]
# 列印**的詞性序列
for i in range(len(best_seq)):
print(id2tag[best_seq[i]])
x = "newsweek , trying to keep pace with rival time magazine , announced new advertising rates for 1990"
vertibe(x, pi, a, b)
執行結果如下
nnp
,vbg
tovb
nnin
jjnnnn,
vbdjj
nnnns
incd
該測試語料是從訓練語料中提取的,我們看下訓練語料的標註,如下所示
newsweek/nnp
,/,trying/vbg
to/to
keep/vb
pace/nn
with/in
rival/jj
time/nnp
magazine/nn
,/,announced/vbd
new/jj
advertising/nn
rates/nns
for/in
1990/cd
前面是詞,後面是該詞的詞性,從對比看,詞性標註的**結果相對準確。 維特比演算法 python 維特比演算法實現分詞
維特比演算法原理可以參考以下文章,講解的非常詳細,那麼接下來將講解維特比演算法如何應用到分詞演算法中,並如何用python 實現。如何通俗地講解 viterbi 演算法?www.zhihu.com 一 過程分析 句子 經常有意見分歧 詞典 經常 經 有 有意見 意見 分歧 見 意 見分歧 分 概率 ...
維特比演算法C 實現
維特比演算法用來解決hmm的 問題 解碼decoding 即已知模型hmm和觀測序列o o1,o2,on 求對給定觀測序列條件概率p i o 的最大狀態序列i i1,i2,in 維特比演算法實際用動態規劃的思想來求解hmm模型 問題。由動態規劃原理,最優路徑具有這樣特性 如果最優路徑在時刻t通過結點...
維特比演算法
維特比演算法在機器學習中非常重要,在求解隱馬爾科夫和條件隨機場的 問題中均用到了維特比演算法。實際上,維特比演算法不僅是很多自然語言處理的解碼演算法,也是現代數字通訊中使用最頻繁的演算法。以乙個簡單的隱馬爾科夫模型為例,n 為觀測符號,y y1,y2,y n 為隱狀態序列,要求的 問題為 y 1,y...