海外實習面試記

去年八月份寫的一篇文章一不小心讓我稍微火了一把,短短時間內在微博達到了上千的轉發量,甚至連像搜狗首席執行官王小川這樣的業界大佬都轉發了那條微博。微博上面的聲音有兩派,一派是支持者,認爲「這個年輕人很有想法」,另一個聲音則對我的想法、行爲提出了質疑,認爲我貶低學術、太過浮躁。我原來在微軟亞洲研究院系統組的老闆對我的想法尤其不滿,甚至對我進行了半公開的點名批評,並告誡其他在微軟亞洲研究院的實習生不得浪費機會。

後來我瞭解到,我寫這篇文章的時候是八月份,正好是個大互聯網公司校園招聘開始的前夕。由於這篇文章裏面公開讚揚了Hulu,而且鼓勵和我一樣的年輕人投身業界,同時表達了對大公司的不滿,被許多人認爲是符合他們的利益的。由於轉發量過大,甚至已經引起了微軟公關部門的注意,以至於向我之前在微軟老闆施壓,要求他立刻「解決問題」。我恍然大悟,只好大呼被人利用了!

(補充:此文發佈後微軟又聯繫到我,認爲以上說法不正確,以下爲解釋)

这个不符合事实哟,我不想再有不必要的误解。实际发生的是负责我们的实习生项目的高校关系部一直致力于保证实习生计划的质量,觉得我们工作没有做好,才找到我们。我们也发现了问题并马上采取措施,加强了对实习生的关注。我不希望大家了解的和事实不符。

轉眼間又過去了一年,已經快到我大三的暑假了,再開學就是大四,眼瞅是要畢業的人了。我快要與在清華的日子告別了,同時我十六年的求學生涯也將接近尾聲。有人說現在感嘆還太早,大四還沒開始,距離畢業還有一年呢!但也有人告訴我,其實大學只有三年,大四和前三年的「過法」不一樣。在我看來,大學每年都不一樣,這一年來我接觸了許多新東西,我和去年的我想法已經有了很大的區別,正所謂是「年年歲歲花相似,歲歲年年人不同」。想想看明年這時候就要畢業了,實習的機會也不多了,所以就寫篇文章記錄一下當時坎坷的經歷吧。

面試準備

有了去年面試美國公司失敗的經歷,我早早就開始了準備。從去年十月份,我就開始瀏覽硅谷各個公司招聘暑期實習生的信息了。由於沒有先驗的知識,根本不知道哪些公司在招實習生,只好像爬蟲一樣查找。在查找的過程中學會了使用LinkedIn和Glassdoor,這兩個網站是非常好的工具,尤其是Glassdoor,還可以看到許多公司的薪酬信息、面試題等。這些信息都是員工匿名披露的,不違反保密規則,甚至還被許多公司的HR鼓勵。

英語

去年面試失敗很大的一個原因可能就是英語。當時我見到外國人根本不知道如何張口,更別說在電話裏面了。我當時的每個面試都是戰戰兢兢,如履薄冰地準備好一切可能問到的的問題的回答,然後唸出來,一旦遇到了沒準備的內容可想而知。

認識到問題以後,該怎麼做就很清楚了,就是練習英語,尤其是口語。但是具體怎麼練呢?這要感謝Gmail廣告。Google在詳細掃描我的郵件和即時通信記錄以後,分析出了我有學習英語的打算,於是就在郵箱界面上不斷給我推送學習英語的廣告。我發現有一種叫做「電話英語」的廣告看起來似乎很有趣,於是就抱着試一試的心態找了幾家電話英語看(請不要諮詢我電話英語相關問題,我不會推薦任何具體的一家)。在購買電話英語服務之前,這些公司都有免費試聽的服務,或者說叫分級測試,於是我就找了好幾家測試了一下自己的分級。電話英語的模式就是一對一和一個英語國家的外教在電話中交談,以此提高英語水平。由於歐美國家勞動力成本較高,加上有時差因素,這些電話英語公司僱傭的外教許多是菲律賓的。菲律賓長期以來是殖民地,平均英語水平在亞太地區是最高的,而且不像印度英語有嚴重口音。許多美國的公司都把電話服務熱線外包給菲律賓。比較各種學習方式後,我不得不承認電話英語是一種價格不貴,而且可以保證學習質量的途徑。經過幾個月的練習,我的口語水平提高了很大一個層次,於是我都敢一個人去美國了。

簡歷

我買了一本《The Google Resume》,仔細研讀了裏面關於寫簡歷和面試的部分。《The Google Resume》可謂是幫了我的大忙,還有這本書作者創辦的網站CareerCup上面以一個工程師出身的HR的視角全面介紹了技術職位面試的細節。依據這本書的建議,我精心寫了一頁簡歷,但是前前後後修改了幾十個版本。

The Google Resume

準備好簡歷以後,我分別在Google、Facebook、Apple、Twitter、Amazon網站上面投了簡歷,其中Google、Facebook、Twitter有學長幫我內推。在經過難熬的等待之後,最終除了Amazon以外,均得到了電話面試的機會。

Google

Google是我接到面試通知的第一家公司,在11月份就開始面試。我收到郵件通知以後,HR問我哪天有時間,然後給我安排電話面試。Google的HR並沒有給我打電話,而是直接安排面試的。由於有時差,所以面試都是在午夜到凌晨之間,所以必須熬夜或者早起了。如果作息不正常,會對自己能力發揮造成很大影響,需要慎重對待。Google給我安排了兩輪連續的面試,每輪一個小時,從北京時間凌晨兩點面試到四點。

由於簽署了保密協議,我不能透露面試的具體題目。題目的類型都是算法題,還有個算概率的數學題。答題的方式是打開一個Google docs頁面,你和面試官共同編輯,同時用電話保持交談。面試官會直接說題目的內容,或者把題目寫在Google docs上,看完以後回答問題。一般來說是先描述算法,然後面試官會繼續追問或者要求證明,最後寫程序。程序直接寫在Google docs上,由於沒有語法高亮和縮進,還是挺不舒服的。不管問題會不會,一定要主動和面試官交流,澄清問題,也許是少了什麼條件或者理解錯誤,最忌諱的就是一句話不說自己一直在想,或者上來就寫代碼。

面試完了以後,大概過了兩個星期,HR發郵件給我說面試結果不錯,給我約了個時間打電話。電話中HR告訴我說我通過了面試,下一步就是進入Google的Host Match流程了。在Google,美國實習生都要有一個Host,大概是經理(Manager)或者導師(Mentor)的職責。每個面試通過的實習生需要等待有Host看中你的簡歷,然後和你聯繫,交流以後決定是否接受你。我一直等到一月份,HR纔告訴我說有了Host願意和我聯繫。和Host電話聊過以後,我對他們做的項目還挺有興趣的,但是我七月份纔放假,和他們的計劃有些衝突,所以就沒有然後了。過了一段時間又有一個Host聯繫我,不過我對他們做的東西實在不感興趣,所以就拒絕了。後來由於HR好像知道我已經在Google北京入職實習了,就沒再用心給我找其他Host,所以最終Host Match失敗。

Apple

得到消息的第二個公司是Apple,我的簡歷經過HR的篩選,被安排了電話面試。同樣是硅谷的公司,面試要在半夜進行,對精力是很大的考驗。Apple公司是出了名的重視設計,就連HR給我發的郵件都和別的公司HR不一樣,一般公司的郵件都挺樸素的,Apple的郵件是有信紙的,默認還被Gmail關閉着,點開以後纔能看到。

面試也是通過電話進行的,寫代碼是通過一個叫collabedit的在線編輯工具,許多公司都喜歡用這個東西面試,包括Twitter和Facebook。面試官先問了我一個算法題,挺簡單的,我回答出來以後繼續追問新的問題,然後讓我證明自己的想法,並寫代碼。寫完以後面試官問我做過的最有意思的一個項目是什麼,我告訴他是Continuation.js,然後向他介紹了一下。最後他問我用過Apple的哪些產品,爲什麼喜歡Apple,我就說我用Mac,爲什麼喜歡我實在沒說出來,因爲我也不是特別喜歡Apple。看來Apple果真是一個要求員工都必須是忠誠的教徒式的公司。

Apple是我自己在網上投遞的一家公司,沒有任何內推,這種情況下面試通過概率挺小的,畢竟你還是一個外國人。面試完一輪以後,就沒有了音信,反覆給HR發郵件問,說正在進行中,可是進行了很久還是沒有結果,所以我知道我是被默拒了。

Twitter

Twitter是我面試過的惟一一家私有公司(未上市),因此決策權全部都在CEO手中。而且未上市的公司資金有限,面試門檻要比面試過的其他大公司高不少。據說Twitter發的每個Offer都是要經過CEO親手簽字的,包括實習生在內。作爲一個實習生,Twitter竟然給我安排了六輪面試,比我之前面試Hulu的輪數還多,可見還是比較嚴格的。

Twitter的每輪面試都是通過Skype進行的,寫代碼也是collabedit。相比與其他幾個公司,Twitter面試的算法挺有難度的,同時也很考察細緻程度。Twitter面試的一個特點是需要寫的代碼量很大,其中一場面試上我一個算法寫了一百行的程序,不僅複雜,還要保證正確性。面試的算法涉及到了回溯搜索、二叉樹操作、動態規劃、緩存替換以及貪心策略和證明。

第一輪面試是我在去美國之前面試,印象中是我期末考試的前一天晚上,當時讓我真的是焦頭爛額不知道該先準備哪個。第二輪面試時間更是巧合,正好是在美國的旅途中,那天我只好躲在Berkeley的旅館中電話面試。我倒是挺想直接去Twitter面試的,但是HR就是沒給我安排,我只好後來自己過去找學長參觀。第三輪是在我回國後,正好是大年初三,這次更悲劇,我的電腦由於被人潑水損壞了,過年又沒人修,我只好一個人跑到五道口的一個網吧裏面,待了一夜。第四五六輪按說應該Onsite面試,但是考慮到我面試的是實習生而且在國外,就改成電話了,這三輪連着面時,時間總共長達四個小時,從凌晨三點到早上七點,十分消耗體力,而且需要保持高度的清醒。

最終我拿到了Twitter的offer。

Facebook

Facebook上市不久,許多老員工拿了一筆錢都紛紛走人了,空出大量的職位,在加上上市融資到不少錢,Facebook一直在急速擴張中,就連實習生職位也很多。和面試Twitter類似,我面試Facebook的時候正好在紐約,於是我只好把寶貴的觀光時間拿出來躲在旅館裏面面試。

Facebook一共面試了兩輪,兩輪之間相隔一個多星期,面試的難度和之前面試Google(美國)差不多。面試涉及的問題主要是動態規劃和二叉樹,感覺這兩個東西是面試最喜歡考到的了。其中有一輪面試中面試官還是一個中國人,聽他說完以後我頓時對我的英語有了信心,最後我和他說了兩句中文,他立刻說「I am not supposed to speak Chinese with you.」,真是無語。Facebook的Offer我也順利拿到了。

Twitter Facebook

值得一提的是Facebook的HR是一個非常靠譜的人,她自始至終一直在幫助我,幫我爭取到了關鍵機會,如果不是她,我很可能此次實習申請就失敗了。我後來在她的LinkedIn簡歷上面看到了傳奇的經歷:她2000年進入華盛頓大學,主修英文文學。在2003年的時候爲了響應國家的召喚,她毅然離開了校園,加入了國家衛士,遠征伊拉克。她在伊拉克和科威特等地擔任戰地記者和編輯,一直到2006年,纔榮歸故里,然後完成學業,開啓了她的事業。

棘手的簽證

最終我拿到的有效的Offer有兩個:Twitter和Facebook。其中Twitter是先拿到的,拿到同時HR給我打電話告訴我薪水、團隊和簽證的信息,並給了我一個期限要求在此前決定。Facebook的Offer是在Twitter後兩個星期內拿到的,HR告訴了我差不多同樣的信息。

聽起來一切都很好,但簽證出現了問題。按照美國法律規定,實習生應該申請J-1簽證,又稱交流訪問學者簽證。這個簽證有一個叫做兩年規定(2-year-rule)的東西,意思是我作爲「交流學者」訪問以後,有回到祖國服務兩年的義務。在這兩年內,我不得申請任何美國的允許移民傾向的簽證,如H-1B或L-1。很顯然這是各國政府爲了防止人才流失和美國博弈的結果。對於那些拿過J-1簽證去美國,然後留學美國,最後留在美國工作的那些人他們是怎麼搞的呢?其實雖然有兩年規定,但是可以找中國大使館申請豁免,然後拿着「不持異議信」就可以免受兩年規則的限制。一般來說申請豁免只要不是國家公派的就差不多都會給,但問題在於是時間很長,而且只給拿超過六個月以上簽證的中國公民辦,像我這種實習完了就回來的是不行的。

這個問題非常棘手,而且只對中國人產生約束,所以許多大公司的HR和法律諮詢部門都不知道。甚至有些公司十分傲慢,你給他們解釋都沒用,因爲他們覺得他們自己是正確的,在他們眼中J-1沒什麼問題,反正可以豁免嘛,殊不知中國大使館有中國特色的規定。只有極少數曾經被這個問題困擾過,有着一手經驗的HR纔會明白其中玄機。好在我相當幸運,我Facebook的HR之前面試過一個中國人,他因爲有J-1在身,而且人在國內,最後窮盡一切辦法還是沒有辦成,雙方損失慘重。於是到我這裏就成了經驗,她小心翼翼地幫我弄清了一切問題。

除了J-1以外,還有一個可以考慮的途徑是H-3簽證,又稱「培訓簽證」。事實上培訓簽證是一個更好的選擇,它沒有任何的後遺症,只是對公司來說稍微貴一些,需要準備的材料陌生一些。我分別向Facebook和Twitter的HR問看能不能幫我辦H-3簽證,得到的答案均是沒辦法,理由是H-3簽證要求培訓者接受的培訓必須是在國內無法接受的,並且目的是爲了回國以後培訓他人。對於Microsoft、Google這樣的跨國公司的來說,辦理H-3簽證是合理的,但Facebook和Twitter在中國根本沒有辦公室,你說你回國培訓誰呢?

於是我陷入了一個窘境:要麼接受J-1簽證和附帶的兩年規則,要麼放棄這次實習機會。其實兩年規則對我來說主要是心理成本,因爲拿了它以後就像一個枷鎖套在我的身上。這個枷鎖只有人在中國大陸待夠兩年以後纔能解除,儘管我畢業就去美國工作並不是我的第一選擇,但少了這個選擇卻是令人沮喪的。人性就是這樣,失去一個東西的痛苦要遠遠大於獲得同一樣東西的喜悅。

正當我在猶豫時,Facebook的HR突然幫我申請到了一個新的機會:可以去英國倫敦的辦公室。英國不存在美國這樣的簽證問題,我可以申請Tier-5臨時工作簽證,只需要Facebook擔保即可。這樣一來一切問題就解決了,因此我接受了這個Offer,並禮貌地拒絕了Twitter。

Google北京

去年十二月我還申請了Google北京的暑期實習生,由於距離較近,直接去Google辦公室進行了面試。我一共面試了三輪,其中前兩輪是連續進行的。第一輪面試我遇到了很難的組合數學題目,由於思路不對,浪費了不少時間,最終沒有答出來。第二輪面試難度也比較大,涉及了C語言字符串處理、動態規劃和貪心算法證明,但是我答得還不錯。過了幾天,HR告訴我說兩位面試官反饋差別較大,於是對我增加了第三輪面試。第三輪面試是一位很資深的工程師,令我驚奇的是他在面試我之前仔細看了我的簡歷以及我網站上列出的我做過的所有項目,並針對我的簡歷進行了提問,包括函數式編程的一些內容,以及JavaScript的CPS變換

過了幾天,HR告訴我通過了面試,但是開始時間是暑假。我聯繫到Google北京輸入法組的楊帆學長,希望可以提前開始實習。Google考慮到我的特殊情況,答應了我的要求,於是我就從今年2月開始在Google北京實習了。

Google i18n

總結

我將在7月1日奔赴英國倫敦,然後開始爲期兩個多月的暑假實習。這次機會對我來說是十分來之不易的,而且最終能夠如願以償是因爲我很幸運。如果沒有Facebook的HR爲我努力爭取到倫敦的機會,我很可能在猶豫中放棄。如果她沒有遇到上一個相同情況的中國人,她也不會爲我爭取這個方法。如果沒有衆多學長指點我、給我幫助,我很可能還在矇昧中。我相信機會是隨機的,但是面對機會的選擇是可以由個人意志決定的。

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

簡易國際音標輸入工具

這是一個簡易的輸入國際音標的小工具,製作這個工具的初衷是爲了方便偶爾要輸入國際音標,又不想花功夫學習複雜的錄入方法的使用者。這個工具像屏幕鍵盤一樣,點一下就可以了,非常方便輕巧。如果需要大量錄入國際音標,推薦使用SIL提供的輸入法,或者潘悟雲先生的雲龍國際音標輸入法。

使用說明

使用前,請確保您的電腦中至少有 Doulos SIL, Charis SIL, IPAPANNEW字體之一,否則某些國際音標符號可能將無法正確顯示。

將ScreenIPA.exe和HookEx.dll放在同一目錄下,運行ScreenIPA.exe。將輸入焦點選取在文本編輯器中,點擊主界面中的按鈕即可輸入。如果無法運行,請確保安裝了.Net Framework,並將壓縮包中的文件放在同一目錄下面。本工具暫不支持Windows 64位系統。

2011年3月 製作

下載地址 ScreenIPA_1.0.0.2

我之所以做這個東西,是因為上學期選了一門音韻學課,課上看見老師用著一個笨拙的輸入工具,效率極其低下。我問老師爲什麼不學習一下國際音標輸入法呢?這樣就可以又快又準地錄入了。但老師卻告訴我說太麻煩了,不想學,而且安裝輸入法太麻煩,換一臺電腦就要重裝,還需要管理員授權。我纔意識到不少人都有這樣的想法,於是便心血來潮,寫了一個小小的輸入工具。由於自認為寫得不怎麼樣,就沒有想著發佈出去,過了幾個月竟然忘了。正好今天有人找我要這個工具,說非常好用,我纔想起來。既然有人欣賞,就無論如何發佈出去吧。恰巧當時正在對.Net感興趣,就用C#寫了這個東西,可能有些老的沒有安裝.Net Framework的Windows XP系統無法使用,在此非常抱歉。

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

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

統計語言模型(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注音模式發布以後,得到了來自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,歡迎有意加入開發者聯繫。