← 文章列表

注音輸入法為什麼分不清「在」和「再」?

不是詞庫不夠大,是排序的依據從頭到尾都跟意思無關。這篇說明注音引擎怎麼挑字、為什麼同音字是它的死角,以及 ZingIME 2.0 用一個本機小模型怎麼補。

你打「想清楚再回答我」,出來的是「想清楚在回答我」。

退回去,把游標移到那個字,叫出候選,選第二個。一句話寫完,中間插了三個動作。

這件事每天發生好幾次,而且永遠是同樣那幾個字:在/再、的/得、紀錄/記錄、反應/反映。你甚至已經學會在打之前就先預期它會選錯哪一個。

詞庫再大也解決不了

直覺的想法是詞庫不夠好。但「在」和「再」都是最常用的字,任何一套詞庫裡都有,加詞也加不了 —— 你要加什麼進去?

問題在排序的依據

注音引擎收到你打的一串讀音之後,會在所有可能的斷詞方式裡找一條「整體最可能」的路徑,每個候選詞的分數來自它在語料裡出現的頻率。這個做法比逐字挑聰明得多,它抓得到「現在」「再見」「回答」這種固定搭配,因為那些本身就是詞,統計上綁在一起。

但「想清楚再回答我」裡的那個「再」,跟前面的「想清楚」不是一個詞,中間也沒有固定搭配把它們綁住。決定該用哪個字的是語意:這句話在講一個先後順序。而頻率統計看不到語意,它只看得到誰比較常出現。

那把統計拉長一點呢

會想到的下一步是:既然兩個字之間隔了一個詞,那把統計的範圍拉長,記錄三個詞、四個詞的組合不就好了?

拉不動。原因有兩個,而且都不是資料量能解決的。

距離。「鑰匙在你的口袋裡」的判斷依據是「鑰匙」,「想清楚再回答我」的依據是「想清楚」,兩者跟目標字的距離不一樣。要涵蓋這種距離,統計得記到四連詞、五連詞。

稀疏。而 n 每加一,可能的組合數就乘上整個詞彙量。中文的詞彙量夠大,拉到四連詞的時候,語料裡絕大多數組合的出現次數是零或一。次數是一的統計沒有意義,次數是零的更糟 —— 它只代表這個組合沒被看過,不代表它不對。你的句子只要跟語料裡的任何一句稍微不一樣,就掉進零的那一區。

n-gram 的本質是記憶,它只知道看過的東西。語言模型的本質是把這些統計壓縮進參數裡,代價是要跑一個模型,換來的是沒看過的句子它也能判斷。

所以這不是詞庫的問題,是方法的問題。同一組同音字,在不同句子裡該選誰完全相反:

這句該用這個這句該用那個
鑰匙你的口袋裡想清楚回答我
這是他自製的木桌大學追求學術自治
他對藥物的反應很大這個結果反映了現實
刷新大會紀錄記錄會議重點

沒有任何一個固定的排序能同時滿足左右兩邊。這是頻率模型的天花板,不是它做得不夠好。

讓另一個東西重讀整句

ZingIME 2.0 起內建一個小型語言模型。你打字的時候,它會重讀你正在組的整句話,然後在同音候選之間重新選一次。

換句話說,注音引擎照舊負責「這串讀音可以組成哪些字詞」,模型只負責「這句話裡該用哪一個」。兩件事分開,各做各擅長的。

而且模型不是每一題都插手。要不要送給它,看的是詞庫自己有多確定:當前兩名同音候選的分數差距很小,代表頻率統計對這一題根本沒有意見,才交給模型;差距大的(像「的」跟它的同音字差了五個數量級)連問都不問。

換句話說,不是拿模型取代原本的引擎,是讓原本的引擎自己指出哪幾題它沒把握。絕大多數的字它本來就選對了。

修正是默默發生的。你會看到組字區裡那個字自己換掉,不需要按任何鍵,也不需要先把句子送出去再回頭改。

它不會做的事

這點比它會做什麼更重要。

模型只在你已經打出來的同音候選之間做選擇。它不會改寫你的句子、不會調整語氣、不會補上你沒打的字,也不會因為覺得你這樣寫比較好而動你的用詞。

你打的每一個字都還是你打的。它做的事情跟你自己叫出候選視窗選第二個,是同一種操作,只是它幫你選了。

為什麼要等整句打完

ZingIME 預設整句維持組字狀態,到句號、問號、驚嘆號或按 Enter 才送出。這個設計跟選字修正是同一件事的兩面。

模型要判斷該用「在」還是「再」,得看得到那句話。如果每打幾個字就送出去,它看到的永遠只有零碎的片段,能判斷的東西就少了。

代價是句子越長,每一輪要重讀的字越多,反應會跟著變慢(150 字大約比短句多一倍時間)。所以最順的節奏是逐句結尾打句號或按 Enter,而不是整段打完才送。

代價講清楚

這件事不是免費的。

模型跑在你的電腦上,開啟時常駐約 400 MB 記憶體。安裝檔也因此從 23 MB 變成 285 MB,因為模型是隨程式一起裝的,裝好就能用、不必另外下載。

而且它只能在 Apple 晶片上跑,所以 ZingIME 2.0 起不再支援 Intel Mac。這是砍掉一整個平台的決定,我想了很久,最後判斷選字這件事值得。還在用 Intel Mac 的話請留在 1.1.6,序號一樣有效。

如果你的 Mac 記憶體吃緊,或者你就是偏好原本的候選順序,偏好設定 → 選字行為可以關掉它,記憶體會立刻釋放。

你打的內容不會離開這台電腦

模型是隨 app 裝在你電腦裡的(約 265 MB),由一個叫 ZingIME-reranker 的背景程式載入,你在活動監視器看得到它。它只跟本機的 ZingIME 溝通,不對外連線。

選字這種事要送到伺服器才做得到的話,代價是把你打的每一句話都交出去。那個交換我不想做。

目前涵蓋哪些

模型針對台灣中文的慣用寫法微調,目前涵蓋這些組:在/再、的/得/地、自製/自治、已/以、每/美、戴/帶、紀錄/記錄、反應/反映、即時/及時、權利/權力、度過/渡過、包含/包涵、公事/公式、意義/異議、終止/中止、不只/不止、加/家、越/月。

這個清單會繼續長。如果你有一組每天都被選錯、但不在上面的,寫信告訴我。

最後

同音字選錯是注音輸入法用了幾十年都還在的問題,因為它不是靠把詞庫做大就能解決的那種問題。

要解決它,得讓某個東西真的讀懂那句話在講什麼。現在這件事可以在你自己的電腦上完成,不必送到任何地方去。