核心概念#
亞洲語言及非羅馬拼音式語言的輸入一直是個難題。中文輸入法在過去 25 年經歷了從自然音節編碼、到偏旁拆字、再回歸自然音節輸入的螺旋式發展。輸入法的效率取決於漢字編碼的平均長度和尋找按鍵的時間,兩者需同時優化。
1. 輸入法與編碼#
- 漢字編碼分為兩部分:拼音編碼(對應語音)和消除歧義性的編碼(一音多字問題)
- 全拼輸入法與漢語拼音標準一致,容易學習;雙拼輸入法將每個聲母和韻母壓縮為一鍵,但帶來三個問題:
- 增加了編碼上的歧義性(26 鍵要映射 50 多個聲母韻母)
- 拆分聲母韻母的過程會讓思維變慢
- 前後鼻音、捲舌音等容錯性不好
- 早期的各種編碼輸入法(如五筆)追求減少擊鍵次數,卻忽視了尋找按鍵的時間和中斷思維的問題
- 認知科學證明:使用複雜編碼輸入法的人在脫稿打字時,速度只有看稿打字的 1/2 到 1/4
最終用戶選擇了全拼輸入法,因為它不需要專門學習、輸入自然不中斷思維、編碼較長反而有資訊冗餘量和容錯性。拼音輸入法的主要工作就是解決一音多字的歧義性。
2. 輸入一個漢字需要敲多少個鍵——談談香農第一定理#
- GB2312 字符集有 6700 多個常用漢字,用 26 個字母編碼:
- 不考慮頻率分布:兩個字母組合只能編碼 676 個,三個字母需要敲 2.1 次鍵
- 以詞為單位統計(詞的資訊熵約 8 比特):每個漢字平均約 1.7 次鍵
- 考慮上下文相關性(基於統計語言模型,資訊熵降到約 6 比特):每個漢字只需 1.3 次鍵
- 香農第一定理:對於一個資訊,任何編碼的長度都不小於它的資訊熵。因此漢字資訊熵就是輸入法平均編碼長度的理論下限
- 漢語全拼的平均長度為 2.98,只要利用上下文解決一音多字問題,每分鐘輸入 100 個字完全可能
3. 拼音轉漢字的算法#
- 拼音轉漢字本質上是一個通信問題:將拼音串轉換為漢字串
- 每個拼音對應多個候選漢字,構成一張網格圖(Lattice)
- 目標是在給定拼音條件下找到最優的句子:$w_1, w_2, \ldots, w_N = \underset{w \in W}{\text{ArgMax}} , P(w_1, w_2, \ldots, w_N | y_1, y_2, \ldots, y_N)$
- 利用馬爾可夫假設簡化後:$\approx \underset{w \in W}{\text{ArgMax}} \prod_{i=1}^{N} P(w_i|w_{i-1}) \cdot P(y_i|w_i)$
- 取對數後,尋找最大概率的問題轉化為尋找最短路徑的問題,可用動態規劃(Viterbi 演算法)求解
- 這與衛星導航中尋找兩地最短距離的數學模型完全相同
4. 延伸閱讀:個性化的語言模型#
- 不同人因文化背景、用詞習慣不同,應有各自的個性化語言模型
- 訓練個性化模型的步驟:
- 將文本按主題分成多個類別 $C_1, C_2, \ldots, C_{1000}$
- 對每個類找到其 TF-IDF 特徵向量
- 統計某個人輸入的文本,得到其特徵向量 $Y$
- 計算 $Y$ 和各類特徵向量的余弦距離
- 選擇前 $K$ 個最近的類對應文本,訓練用戶特定語言模型 $M_1$
- 將個性化模型 $M_1$ 與通用模型 $M_0$ 做線性插值:$P’(w_i|w_{i-1}) = \lambda \cdot P_0(w_i|w_{i-1}) + (1-\lambda) \cdot P_1(w_i|w_{i-1})$
- 線性插值的模型比最大熵模型效果略差,但能得到大約 80% 的收益,Google 拼音輸入法就是這麼實現的
本章小結#
漢字的輸入過程本身就是人和計算機的通信,好的輸入法會自覺或不自覺地遵循通信的數學模型。要做出最有效的輸入法,應當自覺使用資訊論做指導。