相信我-你也能設計出一款輸入法

今天各種漢字輸入法已經很成熟了,隨便挑出一種主要的輸入法比十幾年前最好的輸入法都要快、要準。現在拋開具體的輸入法,從理論上分析一下,輸入漢字到底能有多快。

相信我-你也能設計出一款輸入法

瘋狂輸入ing

我們假定常用的漢字在二級國標裡面,一共有 6700個作用的漢字。如果不考慮漢字頻率的分佈,用鍵盤上的 26 個字母對漢字編碼,兩個字母的組合只能對 676 個漢字編碼,對 6700 個漢字編碼需要用三個字母的組合,即編碼長度為三。當然,聰明的讀者馬上發現了我們可以對常見的字用較短的編碼對不常見的字用較長的編碼,這樣平均起來每個漢字的編碼長度可以縮短。我們假定每一個漢字的頻率是p1, p2, p3, ..., p6700它們編碼的長度是L1, L2, L3, ..., L6700那麼,平均編碼長度是p1×L1 + p2×L2 + ... + p6700×L6700。

香農第一定理指出:這個編碼的長度的最小值是漢字的信息熵,也就是說任何輸入方面不可能突破信息熵給定的極限。當然,香農第一定理是針對所有編碼的,不但是漢字輸入編碼的。這裡需要指出的是,如果我們將輸入法的字庫從二級國標擴展到更大的字庫 GBK,由於後面不常見的字頻率較短,平均編碼長度比針對國標的大不了多少。讓我們回憶一下漢字的信息熵,H = -p1 * log p1 - ... - p6700 log p6700。我們如果對每一個字進行統計,而且不考慮上下文相關性,大致可以估算出它的值在十比特以內,當然這取決於用什麼語料庫來做估計。如果我們假定輸入法只能用 26 個字母輸入,那麼每個字母可以代表 log26=4.7 比特的信息,也就是說,輸入一個漢字平均需要敲 10/4.7= 2.1 次鍵。

聰明的讀者也許已經發現,如果我們把漢字組成詞,再以詞為單位統計信息熵,那麼,每個漢字的平均信息熵將會減少。這樣,平均輸入一個字可以少敲零點幾次鍵盤。不考慮詞的上下文相關性,以詞為單位統計,漢字的信息熵大約是8比特作用,也就是說,以詞為單位輸入一個漢字平均只需要敲 8/4.7=1.7 次鍵。這就是現在所有輸入法都是基於詞輸入的內在原因。當然,如果我們再考慮上下文的相關性,對漢語建立一個基於詞的統計語言模型,我們可以將每個漢字的信息熵降到 6 比特作用,這時,輸入一個漢字只要敲 6/4.7=1.3 次鍵。如果一種輸入能做到這一點,那麼漢字的輸入已經比英文快的多了。

但是,事實上沒有一種輸入接近這個效率。這裡面主要有兩個原因。首先,要接近信息論給的這個極限,就要對漢字的詞組根據其詞頻進行特殊編碼。事實上像五筆碼這類的輸入方法就是這麼做到,只不過它們第一沒有對詞組統一編碼,第二沒有有效的語言模型。這種編碼方法理論上講有效,實際上不實用。原因有兩個,第一,很難學;第二,從認知科學的角度上講,人一心無二用,人們在沒有稿子邊想邊寫的情況下不太可能在回憶每個詞複雜的編碼的同時又不中斷思維。我們過去在研究語言識別時做過很多用戶測試,發現使用各種複雜編碼輸入法的人在脫稿打字時的速度只有他在看稿打字時的一半到四分之一。因此,雖然每個字平均敲鍵次數少,但是打鍵盤的速度也慢了很多,總的並不快。這也就是為什麼基於拼音的簡單輸入法佔統治地位的原因。事實上,漢語全拼的平均長度為 2.98,只要基於拼音的輸入法能利用上下文徹底解決一音多字的問題,平均每個漢字輸入的敲鍵次數應該在三次左右,每分鐘輸入 100 個字完全有可能達到。

另外一個不容易達到信息論極限的輸入速度的原因在於,這個理論值是根據一個很多的語言模型計算出來的。在產品中,我們不可能佔有用戶太多的內存空間,因此各種輸入方法提供給用戶的是一個壓縮的很厲害的語言模型,而有的輸入方法為了減小內存佔用,根本沒有語言模型。拼音輸入法的好壞關鍵在準確而有效的語言模型。

另一方面,由於現有輸入方法離信息論給的極限還有很大的差距,漢語輸入方法可提升的空間很大,會有越來越好用的輸入方法不斷湧現。

內容來自吳軍所著的數學之美,有刪減。


分享到:


相關文章: