推薦一個神級輸入法——Rime

用了那麼多年的輸入法,一直沒有一個讓我滿意的。早年我是從 Windows 95 自帶的「全拼輸入法」開始使用的,印象最深刻的就是一次只能打一個字,還有完全不搭邊的聯想。後來 Windows 98 以後改用「智能 ABC」,相比全拼真是質的飛躍。現在輸入法中的看似平常的功能,如聲母簡拼、用戶詞庫、以詞定字、模糊音等等幾乎都發軔於「智能 ABC」。後來接觸到網絡以後,我學會了使用「拼音加加」和「紫光拼音」,這兩者除了詞庫大了不少以外與「智能 ABC」相比並沒有什麼飛躍。直到「搜狗拼音」的誕生,我纔對輸入法有了更深的理解。搜狗拼音應該是第一個把自然語言處理算法應用到輸入法中的產品,通過大規模的統計語言模型實現了「智能組句」功能,爾後被「Google 拼音」和「QQ 拼音」複製,不過都在同一水平。

我是一個對輸入法有特殊要求的人,因爲我要輸入繁體字。早期的拼音輸入法沒有一個支持繁體中文的,最早是「微軟拼音」率先支持了繁體,但它亂用異體字,真的是把「回」的四種寫法在不同詞中用全了。搜狗拼音和Google 拼音後來也支持了繁體,不過簡直太爛了,幾乎是基於字的轉換,完全不考慮簡繁一對多的情況。雖然現在支持了一些,但還是錯漏百出,用起來極其不舒服。我嘗試過使用註音輸入法,好處在於沒錯誤,而且支持聲調,但是太不靈活了,不支持簡拼和打長詞,因此我開發了 ibus-bopomofo 註音輸入法,試圖把拼音輸入法的一些好特性移植過去。另一個問題是臺灣的註音輸入法打出的字都是「臺灣正體」,最大問題是「着」「著」不分工,而且使用了「為」「裡」「台」等俗字。後來我乾脆轉到了形碼的陣營,先後學習了鄭碼、五筆和倉頡輸入法。可是當我習慣音碼以後,再轉到形碼絕非一日之功,雖然我一直練習,可打字速度還是達不到拼音的三分之一。難道普天之下就沒有一個能準確打出繁體的拼音輸入法嗎?

Rime

一直以來,這個答案是否定的,畢竟開發輸入法本來就是一件費力不討好的事,況且有這種需求的人又不多,有誰會去開發呢?一切還得靠自己。可惜我書到用時方恨少,讓我開發一個這麼複雜的輸入法可幹不了。直到不久前佛振的Rime終於誕生,我的願望纔成了現實。

Rime全名是「中州韻輸入法引擎」,它不僅僅是一個輸入法,而是一個輸入法算法框架。Rime的基礎架構十分精良,一套算法支持了拼音、雙拼、註音、五筆、倉頡等所有音碼和形碼輸入法,遠比基於碼表的各種「輸入法生成器」優秀許多。Rime默認提供了兩個拼音輸入法「朙月拼音」和「地球拼音」,兩者都可以輸入準確的繁體和簡體,而且「地球拼音」還支持聲調輸入。Rime還支持了許多種方言拼音,如吳語、粵語,甚至中古漢語。

更超出我預料的是,Rime還是跨平臺的!Rime針對Windows、Linux、Mac三大平臺提供了不同的發行版,核心算法不變,還能和系統完美融合,真乃絕妙。佛振還給Rime的發行版起了好聽的名字,Windows發行版叫做「小狼毫」,Mac發行版叫做「鼠鬚管」,Linux發行版叫做「中州韻」。

廢話少說,讓我們用截圖說話:

「幹」「干」「乾」涇渭分明。

「饑」和「飢」都不會錯哦。

「出」「齣」分工正確。

「才」「纔」不一樣。

帶聲調的「地球拼音」。

註音符號輸入法。

支持七萬Unicode漢字的倉頡,還帶提示。

粵語拼音。

吳語拼音。

簡化字也是可以用的(由 OpenCC 強力驅動)。

「臺灣正體」模式,滿足臺灣人的用字需求。

用完以後我真是對Rime佩服得五體投地了,真可謂神級輸入法!更多的簡繁一對多問題,歡迎大家嘗試這個表 https://github.com/BYVoid/OpenCC/blob/master/data/scheme/st_multi.txt

Rime 下載地址 http://code.google.com/p/rimeime/wiki/Downloads

順便給 360 殺毒使用者提個醒,由於該輸入法作者沒給 360 交保護費,被 360 殺毒某些版本列入「未知木馬」(還未知就叫木馬,恐嚇用戶啊),請使用者冷暖自知。

關於作者佛振

大概在兩年前,我開發 OpenCC 和 ibus-pinyin 的時候認識了 rime 的作者佛振。他是我認識的第一位輸入法開發專家,也是最令我佩服的一位。我曾經在 Ubuntu 10.10 Release Party 上與他有過一面之緣,當時爲之手寫註音符號的能力所震驚,至今自愧弗如。作者佛振不僅編程能力高超,而且對中文有很深厚的造詣,這樣的一個人開發了若干年的輸入法,豈有不好用之理?兩年以來,他始終以不變的熱情投入到開源輸入法開發的工作當中,纔發明出了這麼好用的一個輸入法。誠心向佛振致敬!

註:本文通過rime小狼毫「地球拼音」輸入方案錄入。

基於統計語言模型的拼音輸入法

這是我離散數學課的大作業,用圖論算法解決某個複雜的問題,我選的題目是基於統計語言模型的拼音輸入法。通俗地講,就是實現一個支持智能組句的拼音輸入法。注意是智能組句,不是智能組詞,組詞其實就是查詞典,哪怕是人也是這麼做的,只不是這部詞典在大腦中而已,否則就是“造詞”了。而電腦組句的方法就和人有很大區別了,因為讓電腦理解一個句子的結構是極端困難的,尤其是作為分析語的中文,所以說這裡面蘊含著許多難題。說到這裡我想到了關於人工智能的討論,心理學家和工程科學家在對人工智能的認識上有著根本的分歧,即工程科學家認為人工智能就是實際效果顯得有類似人類的智能,而心理學家則把具有模仿認為思考、推理和行為的能力作為人工智能的判斷標準。在不同的認知基礎上人工智能的研究朝著不同的方向發展,事實情況是基於效果的人工智能的水平不斷在進步,而基於模仿的人工智能難有突破。作為一個拼音輸入法,實際效果比所謂智能的理解更為重要(況且作為表達思想和意志的工具,許多人並不希望自己輸入的所有內容被電腦“理解”),而統計語言模型就是一個被廣為應用的手段。

統計語言模型(Statistical Language Model)是聽起來像是個很深奧的東西,其實說出來並不複雜,簡而言之就是一個經過整理的大量語料的統計數據。這個數據有什麼用呢?用處非常大,像機器翻譯、語音識別、中文分詞、信息檢索乃至數據挖掘,都可能要用到統計語言模型,把它用到輸入法上面其實是最直接的使用。舉個簡單的例子來說,“wo shi zhong guo ren”這個音節序列中,“wo shi”可能對應了“我是”、“臥室”、“我市”、“臥式”等詞,而“zhong guo ren”則可能是“中國人”或者“種果人”,最佳的組句方案是什麼呢?這就要用到統計語言模型了,我們在這一大堆統計數據中,分別找到詞頻最大的單詞,如“我是”和“中國人”,句子就可以組合出來了。聽起來是不是很自然的想法呢?找出詞頻最大的詞組合到一起,就成了句子。事實上就是這樣,不少輸入法都以這種方式實現,而且效果也不差。例如早期的拼音加加、紫光拼音,Linux平臺下ibus-pinyin。追溯一下,使用這種方法的鼻祖應該是智能ABC輸入法吧,在當年這可是改變了中國人輸入習慣的一個劃時代產品。然而統計語言模型的應用遠遠不止於此,例如我們收集到的統計語言模型中,從單詞的詞頻上來說,“臥室”可能會比“我是”更高一些,但顯然“我是中國人”比“臥室中國人”更好,所以單看每個單詞的詞頻有時候不一定是最好的,這怎麼辦呢?我們可以不但考慮單詞的詞頻,也考慮兩個詞組合在一起的頻率,這樣的話“我是中國人”肯定是最好的結果了。甚至我們可以統計每三個詞、四個詞、乃至多元組的頻率,則必定會有更好的效果,於是N-gram模型應運而生。如果沒記錯的話,微軟拼音應該是最早做這種嘗試的輸入法了,只可惜微軟拼音的輸入模式偏偏那麼怪異,再加上推廣手段不力,一直默默無聞,反而是搜狗拼音在2006年異軍突起,迅速佔據了桌面市場。目前像搜狗、Google、QQ拼音等輸入法都採用了2-gram或者3-gram語言模型,在Linux和mac平臺下,開源的SunPinyin也是基於3-gram的。

統計語言模型說到底依賴於大量語料的統計,詞彙是數以十萬計的,兩個詞組合起來數據量就達到了百億,三元組則更是天文數字,何處找如此大的規模的語料來進行統計呢?想必一般人是沒有辦法,只有做搜索引擎的商業巨擘才有實力來做。但是時間和空間畢竟有限,不可能把輸入法做成如此一個龐然大物,桌面用戶是消受不起的,因此實際上在使用統計語言模型時,是需要對不少情況進行數學計算擬合出一個近似結果的,這便是從有窮模擬無窮的量化思想的體現。另一個方面,不少公司開始熱衷於做雲輸入法,用一臺超級計算機來計算龐大的數據,只需給出用戶結果,這樣就不必考慮用戶終端的計算能力了。

說了這麼多,談談我的設計吧。我用了盡可能簡單的建模方法實現了一個基於2-gram的拼音輸入法,為了突出圖論(畢竟是圖論課),我還設計了具有歧義的拼音字串的多重解析(如“翻案”和“發難”,對應fanan)。在我的設計中,我大量參考了SunPinyin,也得到了來自SunPinyin作者孫勇的不少幫助。我的程序的全部源碼和數據在slm_based_pinyin_ime.7z,源碼以Apache License 2.0發佈,數據來自open-gram項目。因為和SunPinyin使用了同樣的詞庫和語言模型,所以在測試中不少組句結果會與SunPinyin很接近,有心人可以試試比較一下。此外程序的圖標是ibus-pinyin的。寫完以後我發現我求k優最長路徑的算法寫得不好,在k比較大的時候會很慢,其實可以做到線性複雜度的。下面是一個演示文稿。

演示文稿

SLMPIME

ibus-pinyin注音模式預覽

經過一個多星期的開發,終於基於ibus-pinyin的引擎做出了注音模式,馬上就要發布了,現在先放出預覽現在已經發佈。

(什麼是注音呢?注音全名注音符號,又叫注音字母,是一套漢語的標音符號,例如ㄅㄆㄇㄈㄉㄊㄋㄌ。可別把它當作日文假名,其實注音的每個字母都是有來由的。注音符號制定於北洋政府時期,一直作為教學所用。中國大陸1958年以後停用了注音而改用漢語拼音,臺灣則沿用注音至今。)

為什麼要做一個這樣的注音輸入法呢?因為據我所知,現有的各種注音輸入法的水平要遠遠落後於各種拼音輸入法,例如大名鼎鼎的新酷音輸入法、微軟新注音,都只停留在組詞的階段,甚至不少時候需要自己來翻好幾頁選字,更不用說智能組句,簡拼等功能了。一直以來我想製作一款優秀的注音輸入法,以改善臺灣同胞的打字體驗,亦可復興優秀的注音符號系統。恰好ibus-pinyin是Linux平臺下的一個非常優秀的輸入法,且開發者很活躍,願意進行各種嘗試,故我就加入了ibus-pinyin小組,開始了ibus-pinyin注音模式的開發。幸運的是,ibus-pinyin的代碼很明晰,而且其作者Peng Huang大牛非常熱心地對我進行了指導和幫助,因而我們纔只用了一個多星期就做出了注音輸入法。

ibus-pinyin注音模式儘量參考了其他注音輸入法,但又沒有完全拘泥於其模式,而是結合了拼音輸入法的常用交互邏輯。輸入注音時,候選詞列表即時更新,第一個候選詞為智能組句的結果,後面依次是組詞、單字。按空格可以選擇高亮區域的候選詞,按上下鍵可以移動高亮區域,按過上下鍵或選詞時進入選詞模式,此時可以直接按數字鍵選詞,同時小鍵盤數字鍵或Shift + 數字鍵可以在任何時候直接選詞。下圖是輸入時的截圖:

除此之外,ibus-pinyin注音模式還支持了簡拼和混拼,就是在組詞時只用輸入字的聲母,效果如下:

想要輸入標點符號也很容易,只要按`鍵(數字鍵1左邊),即可進入符號模式,再按一個字符即可開始選各種符號。這種方式是模仿了微軟新注音。效果如下圖:

當然,限於開發進度,ibus-pinyin注音模式還遠遠沒有達到盡善盡美的地步,當前版本還有一些問題亟待解決。主要問題如下:

  1. 暫時不支持聲調。因為限於數據庫的格式(缺乏聲調信息),我們還無法做出基於聲調模式的選字選詞,不過這已經列入開發日程,近期版本就會支持。
  2. 繁體模式下有重複字的情況,這個問題將會在近期整理詞庫後解決。
  3. 目前僅支持標準注音鍵盤,下個版本將會加入其他注音鍵盤方案選項。

Q&A

Q:如何安裝本輸入法?

A:由於Ubuntu的官方源不能及時更新到最新版本,我们推薦使用ppa源。使用方法為在終端下輸入 sudo add-apt-repository ppa:shawn-p-huang/ppa sudo apt-get update sudo apt-get install ibus-gtk ibus-qt ibus-pinyin ibus-pinyin-db-open-phrase

接下来,在頂部菜單 系統 - 管理 - 語言支援 ,把“鍵盤輸入法系統”設置為ibus,然後註銷重新登入。

Q:如何切換出本輸入法?

A:點擊輸入漢字的區域,在系統托盤中點擊鍵盤圖標,選擇“漢語 - Bopomofo”,或者使用ctrl + space。如果列表中沒有Bopomofo,右鍵點擊托盤中的鍵盤圖標,選擇 偏好設定 ,在輸入法標籤中點擊 選擇輸入法 - 漢語 - Bopomofo,然後點擊加入。

Q:如何選擇候選字詞?

A:輸入過程中,候選詞列表會即時更新,按下空格鍵即可選取高亮區域的字詞,按上下鍵可以移動高亮區域。選詞過程中也可以直接按數字鍵選詞,使用Shift + 數字鍵可以在任何時候直接選詞。

Q:如何進行中英文模式切換?

A:點擊輸入法狀態條上的中/英按鈕,或者按Shift鍵即可切換中英文模式。

Q:如何在中文模式下輸入標點符號?

A:按`(數字鍵1左邊的按鍵)以後,進入符號模式,接下來按不同的按鍵可以顯示不同的符號列表。

請大家繼續關注,我們熱切地希望得到任何反饋,包括問題報告、建議、用戶習慣意見等。 目前開發者:BYVoid, Peng Huang,歡迎有意加入開發者聯繫。

有幸加入ibus-pinyin的开发

最近结识了中文Linux下最常见的输入法iBus的作者Peng Huang,并有幸加入了ibus-pinyin输入法的开发工作。开发输入法本身就是一个不常见的工作,因此很难找到相关资料,而开发一个优秀的拼音输入法更是难上加难。在此深切地膜拜Peng Huang,能与这样的牛人合作并从中得到指点,真是莫大的荣幸。

不少传言说iBus是Python写的,效率不行,实际上这是一个谣传。ibus的确曾经是python写的,但是现在已经用C++重写,效率得到很大的提高,而且兼容性要远远强于Scim。iBus全名为intelligent input bus,顾名思义它是一个输入法平台,也可以理解为是一个已经写好的与系统交互的库,各种输入法运行在iBus上。输入法只是调用了iBus,调用iBus可以让其作者专心地编写输入法功能的代码,而不是把过多的精力浪费在与系统交互上,也增加输入法的可移植性。而ibus-pinyin正是iBus作者Peng Huang写的一个运行在iBus上的拼音输入法。

花了不短的时间才大致看明白了ibus-pinyin的源码,发现大致的逻辑是:捕获用户输入的字符串-将字符串解析为拼音-查询词库将拼音解析为词汇-用词汇智能组句-显示候选词-输出文本。其中第一步和最后一步都很简单,因为已经被iBus提供了良好的接口,因此重点在于拼音解析词汇解析智能组句上。由于开发力量过小(开发人员加上我才3个人),这些功能的实现还很简单。像拼音解析遇到了歧义(如xian,fangan)还都只是指定一种(出现概率较大)解析方式,没有实现高度的智能化。

我所关注的部分是为ibus-pinyin实现声调模式,注音模式,和精确简繁转换这些功能。声调模式需要一个字库,这个已经从Unicode获得,而词库目前是不带声调的,要实现带声调需要较大人力。注音模式主要是推广到繁体用户那里,因为据我了解到的注音输入法智能组句功能都很弱,如果有这样强的输入法一定会受欢迎的。精确的简繁转换主要是实现输出地道的繁体,这就要解决大量的简繁一对多词汇了,具体实现也很复杂,只能逐步做。

截至今日(2010.5.12)ibus-pinyin的最新版本是1.3.5,下一版本发布之前两位开发者精力主要集中在开发输入法Lua插件支持和用户词库同步上。Lua插件就是让输入法支持自己开发的外接程序,让用户更灵活定制。用户词库同步是目前较为成熟的输入法都具备的功能,就是实现用户可以将自己的词库上传到服务器上,便于用户保存输入习惯,另一方面也方便我们统计和更新词库。但是作为开源软件,服务器费用是个问题,目前可以考虑用免费的Google App,将来也许可以得到像Google这类大公司的赞助吧。我很看好ibus-pinyin的发展,因为首先它是开源的,而且容易实现跨平台。目前没有好用的能够跨平台的输入法,而这个市场正好可以由ibus-pinyin来填补吧。