推薦一個神級輸入法——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小狼毫「地球拼音」輸入方案錄入。

Open Chinese Convert 開源簡繁轉換

Open Chinese Convert(OpenCC)是一個中文簡繁轉換開源項目,提供簡繁轉換詞庫和可供程序調用的程序庫(libopencc)。現託管於Google Code

關於簡繁轉換

由於種種歷史問題,漢字系統被割裂爲「簡化字」和「繁體字」,然而「簡化字」並不能完全取代原有的繁體字,一方面是由於古籍、書法、文字學的研究需要,另一方面則是港澳臺日韓越及其他海外地區「簡化字」並不通行。隨着信息技術的發展,這方面的需求不斷突出,因此簡繁轉換便成了一個信息技術界和中文研究界需要共同解決的問題。

精確的簡繁轉換一直以來是一個難題,其原因主要是簡體和繁體互有一對多的現象,而具體用字對應規則需要聯繫上下文分析語義纔能確定。而廣義的「簡繁轉換」,還包括了不同地域習慣用字和用詞差異的轉換(如「软件」「軟體」等),甚至詞和詞之間也有「一對多」的關係,因而使轉換更加複雜。目前現有的簡繁轉換軟件,即使是專業的(收費),也不能完全解決這些問題,在開源界能接近其水平的更是寥寥無幾。因此OpenCC的誕生,就是爲了儘可能地解決這個難題。

一些概念

漢字(據不完全統計)有十萬之眾,「簡化字」非但沒有減少漢字數量,反而使漢字數量更加龐大。雖然日常用到的字祇有數千,且有着複雜的關係。要做好簡繁轉換,必須理解這之中的許多關係與微妙的差別

「異體字」

由於漢字造字年代久遠,且非一人一時之所造,通行時間又爲世界之最,流變眾多,許多字並非祇有一種寫法,如「為爲」「朵朶」「畫畵」「污汚汙」等等。這些字祇是寫法不同,而沒有任何表意的區別,因此被稱爲「異體字」。狹義的異體字是沒有任何表意的區別的一組字,而廣義的異體字還包含了表意範圍有交叉或所屬關係的字以及「通假字」。下文中的異體字全部是狹義的異體字

需要注意的是「通假字」祇是同音假借,本字和被假借字可能意義完全不同,因而不是異體字。而「訛字」和「俗字」(絕大多數)則屬於異體字。例如「繫」字在傳抄的時候,左上角被寫成了「車」,然後以訛傳訛,就產生了訛字「繋」。「俗字」或稱「俗體字」是民間通行的一種變體,許多俗字就是筆畫較爲減省的異體字,也有很多來自訛字。

「繁體字」「簡體字」「簡化字」

嚴格地說,「繁體字」和「簡體字」是異體字關係,「繁體字」是相對「簡體字」而創造的概念。「簡體字」這一名稱,始見於1935年民國教育部總結的一批「古已有之」、「歷代通行」的「筆劃較少的」異體字。這批簡體字主要蒐集自民間話本「述而不作」地整理出,沒有類推造字。

「簡化字」,顧名思義則是人工簡化的字,這個概念的產生與近代「漢字改革」思潮有關,最早見於錢玄同的文中。1964年,中國文字改革委員會出版了《簡化字總表》(不是「簡體字總表」),簡化字開始在中國大陸流行開來。1977年,中央又發佈《第二次漢字簡化方案》,1986年被廢除,史稱「二簡字」。慢慢「簡化字」這一概念就被固定下來,專指中國大陸推行的簡化字

可見「簡體字」並不等於「簡化字」,前者強調異體關係,後者強調簡化關係。而現在這兩個概念趨於混淆,乃至用「簡體字」表達「簡化字」的意義更常見,其主要原因是由於另一個詞彙「簡體中文」的出現。比起中文的混淆,英文解釋更加清楚:「簡化字」的英文翻譯是「simplified Chinese characters」(簡化過的漢字),simplified源自動詞simplify簡化。「簡體字」由於概念不常見,沒有公認的正式翻譯,有一種譯 作「simpler variants of Chinese characters」(較簡單的漢字變體)。

由於「簡體字」和「繁體字」本身存在對立關係,繁體字也就慢慢變成專指港澳臺用字了。事實上港澳臺用字也不盡相同,如「裏」「裡」等,於是又有了「港澳繁體」「臺灣正體」等名字。

已有項目的缺陷

OpenCC的的誕生並不是輪子的重複發明,而是爲了實現一個更好的簡繁轉 換計劃,因爲目前已有的各種項目,或多或少地有着各種缺陷。

Wikipedia

毫無疑問最廣爲人知的簡繁轉換項目莫過於Wikipedia提供的簡繁轉換表。Wikipedia有效地利用了分散的人力,整理出了一個數量不小的表格,其優點在於*詳細地區分了簡繁轉換和地域轉換。但是也有許多不足:

  1. 異體字處理混亂,「一簡對多異」被當作「一簡對多繁」處理。如「为」對應「爲為」。
  2. 一簡對多繁有眾多爭議,處理不統一,時分時不分。如「卷烟」「烟卷」分別用了「煙」和「菸」。
  3. 有大量不成詞的「詞」,祇爲正向最大轉換優化,不兼容別的分詞算法。如「们斗了胆」「們斗了膽」。
  4. 專爲Wikipedia設計,依賴編輯的人工干預。
  5. 一般非地域轉換中「着」被併入「著」,不符合香港、海外等地用字習慣。
使Wikipedia做出改變較難,尤其是在這種民主的管理模式下,多數人(臺灣)可能會毫不顧及少數人(香港)。

cconv

cconv是另一個簡繁轉換的項目,較早開發,有一定的用戶。缺陷很明顯:
  1. 簡繁轉換和地域轉換混同一談。
  2. 完全沒有處理異體字。
  3. 功能雜糅了編碼轉換和簡繁轉換,不易剝離。
  4. 簡繁轉換數據被編譯到庫中,無法修改和擴展(除非重新編譯)。
  5. GPL協議發佈,對開發者限制較大。
  6. 目前長期無人維護。

OpenCC 的特點和方法

OpenCC特點

  • 嚴格區分「一簡對多繁」和「一簡對多異」。
  • 完全兼容異體字,可以實現動態替換。
  • 嚴格審校一簡對多繁詞條,原則爲「能分則不合」。
  • 使用歧義分割+最少分詞算法,儘可能從技術上優化轉換效果。
  • 詞庫和程序庫完全分離,可以自由修改、導入、擴展。
  • 以Apache開源協議發佈,使開發者真正可以自由使用。
  • 已經用於ibus-pinyin的繁體模式輸入,由ibus開發組長期協助維護。
  • 支持 C,C++,Python,PHP等多種語言調用,命令行直接調用,以及圖形界面(開發中)。

解釋

OpenCC有獨立的「一簡對多繁」表、「一繁對多簡」表和異體字表,保證沒有混雜着異體字。而且可以方便地自定義地區習慣使用的異體字,兼容臺灣、香港和海外地區不同的習慣。

簡繁轉換詞庫中數萬詞彙經過校對,最大可能地保證轉換準確性,用字原則爲「能分則不合」。舉例如「臺」「檯」「台」,在臺灣習慣中,有合流爲「台」的現象,但其意義界限明顯,故OpenCC從分,(具體見此列表)。根據不同的習慣,也可以設定爲合流。

簡繁轉換功能的核心算法爲歧義分割+最少分詞,簡單解釋爲首先掃描待轉換字符串,分割成若干個有歧義的區間(即每個區間內可以有多種分詞方案),然後對每個區間的字內構造圖論模型,使用最短路徑算法求出最優分割方案,然後對分詞的結果每部分進行轉換。這種算法不僅準確性高於直接正向掃描轉換,而且速度也很快,測試中每秒可以轉換8.4MB文本(UTF8編碼,內容爲小說,速度僅供參考)。

OpenCC把詞庫和程序庫完全分離,程序庫可以讀取兩種格式的詞庫,一種爲Tab分割的平面文本,一種爲OpenCC專門優化過的數據結構,ocd格式。平面文本數據庫格式方便閱讀和修改,ocd格式是OpenCC構造出的Double Array Trie數據結構,使用其可以大大提供轉換速度。OpenCC還提供了詞庫轉換程序,可以自由在兩種格式之間轉換。

OpenCC程序庫提供了C,C++,Python,PHP等語言的接口,便於在任何環境下使用,此外還提供了命令行直接調用的模式,圖形界面也在開發當中。

詞庫來源

OpenCC的繁體到簡體轉換的詞庫是由單字對應人工校對後生成的,單字對應數據來自Unicode數據庫以及人工的覈對和修改。簡體到繁體的詞庫由大量的繁體語料自動轉換到簡體然後校對而成。

參考資料

歡迎試用和加入

如果感興趣,可以先在綫試用一下, 然後安 裝到你的系統

開源非一人之力,有眾人的支持纔能做得更好。歡迎有意者加入開發,歡迎中文專業者和愛好者加入詞庫審校工作。

如有任何問題或建議,請到 http://code.google.com/p/open-chinese-convert/issues/entry 報告。或者可以直接與BYVoid取得聯繫

ibus-pinyin注音模式新特性

前一段時間ibus-pinyin注音模式發布以後,得到了來自Ubuntu正體中文站Plurk的朋友們熱烈的關注,對此我感到非常榮幸。限於當時開發倉促,很多功能都沒有很好地實現,不過我還是得到了許多寶貴的意見反饋,基於此我公布了「注音模式用戶交互設計方案」,並依據其改善了用戶交互模式。在1.3.9穩定版發布前夕,我先向大家介紹一下ibus-pinyin注音模式的新特性。

本次更新最大的改動是加入了「引導鍵」選詞模式。什麼是「引導鍵」呢?「引導鍵」就是在輸入模式下的空格鍵(或曰「空白鍵」)。在輸入模式下,按下空格鍵,就會進入選詞模式,這時候按鍵響應會優先被處理爲選詞。選詞模式下可以直接按下候選詞標籤對應的按鍵進行選詞,也再次按下空格選擇光標所在位置的候選詞,按上下方向鍵可以移動光標位置。

在輸入模式中,候選詞前面的標籤是灰色的,而且不顯示光標位置。當按下空格鍵、上下方向鍵時,可以進入選詞模式。當然如果你想直接選詞,可以按Alt + 選詞鍵,或者可以使用「輔助選詞鍵」。「輔助選詞鍵」爲F1,F2,...F10,以及數字鍵盤上的數字,使用輔助選詞鍵可以在任何時候選詞。

當進入選詞模式後,候選詞標籤顏色變深,並且選詞光標也出現。此時可以直接按候選詞標籤對應的選詞鍵選詞。

應大家要求,我們還加入了選詞鍵設置的選項。如果你不喜歡用數字鍵選詞,可以設置爲其他的按鍵,這個設計承襲自大名鼎鼎的「新酷音」輸入法。

當然了,「引導鍵」選詞只是可選的,如果你喜歡原來那樣的模式(按空格鍵即時選詞),可以在「偏好設定」中關閉「啟用選詞引導鍵」選項。其他特性如「鍵盤映射」、「模糊音」、「自定義詞組」,都可以在偏好設定中找到。

趕快試用一下新版本吧,如果你是Ubuntu用戶,現在已經可以在ppa源中取得新版本,使用方法如下: sudo add-apt-repository ppa:shawn-p-huang/ppa sudo apt-get update sudo apt-get install ibus-gtk ibus-qt4 ibus-pinyin ibus-pinyin-db-open-phrase

設置一次過後今後一旦有新版本就會自動更新,或者使用apt-get install ibus-pinyin強制更新即可。

歡迎大家提出意見或建議,期待您的反饋。

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来填补吧。