輸入法開發(fā)——實戰(zhàn)<二>檢詞算法
輸入法出詞的算法看似復(fù)雜,微軟選擇的算法是相對低開銷且高效的一種。
通過行為分析,步驟大致分為三步:
一、完全匹配
二、詞頻建議
三、補全出詞
前兩步是必須有的,第三個只有五筆有。
通過一個小工具 WubiLex 可以導(dǎo)出五筆的 Lex 詞庫文件(目前的windows無法直接查看該文件)
一個詞的組成有四個部分:編碼、詞、權(quán)重、順序
一個詞可能的多個編碼,但權(quán)重不變
一個權(quán)重只能有一個
一個順序只能有一個
如:
a????????????工?19829????1
aaa????????工?19829????3
aaaa? ????工?19829????12
多個碼可以很好的解決簡碼檢索的問題,根據(jù)編碼匹配程度給出結(jié)果。拼音的算法也是相似的。不同的只有句拼,這個需要一定的機(jī)器學(xué)習(xí)能力。
權(quán)重用來表示詞頻,順序作為算法的提示、補充。
主體上的算法是:1、匹配用戶詞庫;2、匹配主詞庫(使用鏈表的話無需太在意順序,但小心重復(fù))
匹配用戶詞庫是非常簡單的,就是完全匹配。智能學(xué)習(xí)就是在這個詞庫中添加詞條。
匹配主詞庫就有點難度了:
1、完全匹配
這一步是相對簡單的,編碼相同就可以。然后根據(jù)權(quán)重排序。
2、詞頻建議
這一步是難點
先取碼,從編碼的第一條開始遍歷
例:碼:a
從 a--- 第一個開始,到 azzz(安全最大) 或 ayyy(五筆實際)?最后一個結(jié)束
在?a--- 編碼中找到權(quán)重最小的作為第一個,記權(quán)重作 c(提前備表)
然后在下一編碼中
取出順序最小的,如果其權(quán)重小于 c?跳轉(zhuǎn)至下一編碼,
否則,輸出 其中權(quán)重大于 c 的權(quán)重最小的一個詞,將新的權(quán)重寫入?c 進(jìn)入下一編碼 重復(fù)此步
步驟大致如此(未去除重復(fù))一個詞是不能在候選中出現(xiàn)再次的,需要剔除重復(fù)的候選。
碼:ab
在?ab-- 編碼中找到權(quán)重最小的
從?ab--?第一個開始,到?abzz(安全最大)?或 abyy(五筆實際)?最后一個結(jié)束
其它步驟是相同的, 但是開銷是相對小很多的。
完成了以上步驟,還有補全一步,這一步是可選的
如果,編碼中字母相同,將其補為4個相同字母組成的編碼
a -> aaaa, b -> bbbb
最后,要按 匹配 > 權(quán)重 的方法排序候選
再插入用戶詞匯,如果它們存在。
五筆中 z 鍵作用不盡相同,各各實現(xiàn)均有所差異。但是注意,z 是第一個字母時,盡量不要提供有候選參與的功能。
實際的輸入法不能每次都從文件中讀取詞庫,當(dāng)然不是不行,而是開銷過大。
詞庫應(yīng)當(dāng)由維護(hù)輸入法的進(jìn)程建立通道供輸入法動態(tài)獲取。