詞性標註維特比演算法實現

2022-09-01 19:57:12 字數 2046 閱讀 9886

基於前幾篇文章對維特比演算法的說明,此文對維特比演算法進行實現,並基於維特比演算法實現給定語句的詞性標註。關於\(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...