隱馬爾科夫模型git
隱馬爾可夫模型 (Hidden Markov Model) 是一種統計模型,用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中肯定該過程的隱含參數,而後利用這些參數來做進一步的分析。github
拼音輸入法中可觀察的參數就是拼音,隱含的參數就是對應的漢字。算法
那麼咱們要解決的就是隱馬爾可夫的第二個問題:由觀察序列求最優的隱藏序列sql
只須要HMM的三個要素(π,A,B)數據庫
參考別人github代碼:優化
https://github.com/LiuRoy/Pinyin_Demospa
代碼解析以下:3d
一、模型生成sqlite
代碼見train/main.py文件,裏面的initstarting,initemission,init_transition分別對應於生成隱馬爾科夫模型中的初始機率矩陣,發射機率矩陣,轉移機率矩陣,並把生成的結果寫入sqlite文件中。blog
訓練用到的數據集是結巴分詞裏的詞庫,由於沒有訓練長句子,最後運行的結果也證實只能適用於短句輸入。
二、初始機率矩陣(π)
統計初始化機率矩陣,就是找出全部出如今詞首的漢字,並統計它們出如今詞首的次數,最後根據上述數據算出這些漢字出如今詞首的機率,沒統計的漢字就認爲出如今詞首的機率是0,不寫入數據庫。有一點注意的是爲了防止機率計算的時候由於越算越小致使計算機沒法比較,全部的機率都進行了天然對數運算。統計的結果以下:
三、轉移機率矩陣(A)
此處用到的是最簡單的一階隱馬爾科夫模型,即認爲在一個句子裏,每一個漢字的出現只和它前面的的一個漢字有關,雖然簡單粗暴,但已經能夠知足大部分狀況。統計的過程就是找出字典中每一個漢字後面出現的漢字集合,並統計機率。由於這個機率矩陣很是的大,逐條數據寫入數據庫過慢,後續能夠優化爲批量寫入,提升訓練效率。結果以下:
上圖展現的一後面出現機率最高的十個字,也挺符合平常習慣。
四、發射機率矩陣(B)
通俗點就是統計每一個漢字對應的拼音以及在平常狀況下的使用機率,已暴舉例,它有兩個讀音:bao和pu,難點就是找bao和pu出現的機率。此處統計用到了pypinyin模塊,把字典中的短語轉換爲拼音後進行機率統計,可是某些地方讀音也不徹底正確,最後運行的輸入法會出現和拼音不匹配的結果。統計結果以下:
五、viterbi算法實現:
代碼建input_method/viterbi.py文件,此處會找到最多十個局部最優解,注意是十個局部最優解而不是十個全局最優解,可是這十個解中最優的那個是全局最優解,代碼以下:
六、結果展現
運行input_method/viterbi.py文件,簡單的展現一下運行結果:
問題統計:
別人訓練好的 hmm 拼音輸入法代碼:
本博客摘抄以下博客: