您好,登錄后才能下訂單哦!
眾所周知,中文輸入法是一個歷史悠久的問題,但也實在是個繁瑣的活,不知道這是不是網上很少有人分享中文拼音輸入法的原因,接著這次NLP Project的機會,我覺得實現一發中文拼音輸入法,看看水有多深,結果發現還挺深的,但是基本效果還是能出來的,而且看別的組都做得挺好的,這次就分 享一下我們做的結果吧。 (注:此文假設讀者已經具備一些隱馬爾可夫模型的知識)
實現一個中文拼音輸入法。
經過分析,分為以下幾個模塊來對中文拼音輸入法進行實現:
在中文拼音輸入法中,我們需要完成拼音序列到漢字序列的轉換,比如輸入“nihao”,輸入法會給出我們想輸入的字“你好”,到這里我們就可以問出幾個問題:
也許我們還能問出更多的問題,中文拼音輸入法就是這樣,總有可以繼續摳下去的細節。
那么我們如何解決上面的問題?我們的方案如下:
這 里我們暫時采用最長匹配的方式,也就是說,如果用戶輸入的首個串是拼音或者是某個合法拼音的前綴,那么我們會繼續向后發現,等待用戶輸入,直到用戶輸完后 發現這個字符(假設是第n個)與原來n-1個不是合法的拼音也不是合法的拼音的前綴,那么此時將前面n-1串切分成拼音,這就完成了一個拼音的發現,比如 說輸入”xiant”(想輸xiantian),則我們會掃描這個串,一直到”xian”,到”xiant”的時候發現既不是合法拼音的前綴也不是合法拼 音,那么從t前面劃分開,得到”xian’t”,同樣的道理發現后續的拼音。
在實時任務中,用戶即使沒有輸完我們仍應該顯示東西,那么我們先切分 拼音,最多只會有最后一個是不完整的拼音前綴,那么我們將完整的和不完整的分開處理。假設是”xian’t”的情況,我們將”xian”放入 viterbi算法中,通過HMM得出概率最大的一個輸出串,然后將最后的”t”在訓練過的Trie樹中搜索出所有以”t”為前綴的字,以及他們出現的頻 率,取頻率最高的若干個,作為viterbi算法的下一個狀態的可能集合,然后得到他們的拼音,與前面n-1個拼音組合起來跑Viterbi算法,得到最 可能的一個中文串,由于這些頻率最高的字的拼音(即我們可能的觀測值)可能不相同,我們只能將相同音的字作為一次viterbi算法運行的下一狀態,這樣 viterbi跑的次數就是這些字里面不同音的個數,但是由于總數固定,異音越多,每個音對應的越少,所以總時間是沒有差別的。
具體Trie樹會在后面講解。
上 面其實已經初步解釋了如何實時反饋,實時反饋我們要做的就是用戶每輸一個字母,我們就能夠顯示出用戶可能想要打的字,那么,以一個字母開頭的拼音有很多, 每個拼音對應的字也可能有很多,也即結果有很多,但是我們又不能漏掉,所以只能考慮所有的字,比較選出概率最大的若干個字,這時候我們可以采用Trie樹 來解決。Trie樹就是前綴樹,說白了就是將拼音的字母按順序順著根插入到樹中,每個葉子節點就是一個拼音,這個拼音就是順著根一路走下來取的字母的順序 組合,這樣我們就可以找出以任意字符串為前綴的所有拼音,方法就是dfs遍歷每一個以其為前綴的子樹的葉子節點,這時候我們葉子節點存的其實是一個字 典,key為這個拼音對應的可能的字,value為這個字出現的頻率,以作為比較。
這里我們使用隱馬爾可夫模型,將用戶想輸入的中文字作為隱狀態,用戶輸入的拼音為顯狀態,通過最大似然估計即頻率估計出HMM的三個矩陣的值,最后通過viterbi算法找出概率最大的若干個中文字串顯示出來。
由于考慮到實現高度容錯的復雜性,我們假設用戶會輸入正確的拼音,在想分割的時候會自行添加分隔符”‘“,由于大部分輸入法用戶絕大部分時間都會輸入正確的拼音,所以,這樣一個假設既簡化了實現的過程,又沒有損失太大的用戶體驗。
由于訓練HMM模型的需要,我們從搜狗實驗室找到了SogouQ用戶查詢數據集,預處理成合法的句子之后大約有360M,且為了避免查詢句太短,我們也增加了將近30M的搜狐新聞數據作為訓練語料,這里面包含了很多的長句子。
通過這兩個語料的訓練,我們得到了長句和短句皆可表現較好效果的HMM模型。并且我們還可以繼續拓展語料,以增加我們HMM模型的準確性,這是后話,不提。
輸入比較迅速,絕大多數輸入能在1秒以內顯示。輸入過的句子再輸入和退格操作都是毫秒級別的。
在項目Project目錄下,運行
$ python gui.py
即可。
由上面我們可以看到其實可以做的工作還很多,比如
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。