星期一, 十月 29, 2007

Google输入法建议

Google输入法,相信大部分喜欢Google产品的人都不会错过这款优秀的基于互联网的输入法。它最主要的特色也许就是它的词库是基于Google庞大的互联网数据库而生成的(其中包括用户的搜索记录,网页数据等等)。
但是,Google的输入法对于Google而言,其重要性与微软拼音对于微软而言是完全不一样的。通过Google输入法,可以更好地研究中文用户的输入习惯,从而改进Google中文搜索的分词技术;而且,还可以将输入与搜索直接绑定。毕竟,输入法对于中文用户而言,是每天必不可少的工具。但是在使用过程中,我却碰到了一些问题:

1. 词库的同步。 Google拼音默认的处理机制是:如果本地计算机不存在任何用户词库,第一次词库的生成要么就是直接从服务器同步,要么就是在用户第一次输入文字的时候建立。这种机制存在弊端:如果我A机器上有将近50KB的词库文件,然后我用用户ABC的账户登录,将A机器上的词库文件同步到服务器上的ABC账户中(假设第一次同步数据)。然后,在B机器上,如果有20KB的词库文件,我想要将其同步到服务器上的ABC帐户中,将其与之前A机器上所同步的数据进行merge,这是很实际的需求。但实际上,当你这么做了以后,服务器上将只存在20KB的B机器上的数据,A机器上的数据将会被直接冲掉!Google的做法实际上非常简单,仅仅是在本地不存在词库文件的时候,同步服务器的词库到本地;否则,就同步本地的词库到服务器。
我大概思索了一下解决方案,以下是我的设计思路:Google的词库文件对于每个词汇,都会记录它的使用次数。对于本地和服务器都存在的词汇,如何进行次数的合并是一个最关键的问题(对于那些只存在于服务器或者需要同步的本地一方的单词,我们可以直接将次数相加)。这个问题很类似于很多CVS工具附带的本地文件和服务器文件的merge功能,但是为了避免在Googl的服务器端备份太多的不同版本的词库,我打算为本地词库文件采用一种新的设计。这种设计仅仅为每个单词增加了一个field,姑且叫作diff,这个field记录单词上次与服务器同步之后在本地该再次使用所增加的次数。本地词库与服务器更新的步骤如下:将本地每个单词的diff值同步到服务器,与服务器上的相应单词的次数进行相加,最终得到的和就是该单词在服务器端和本地所使用的次数和。最后,同步服务器的最新内容到本地,并且将本地词库中同步完的每个单词的diff值清零。

2. 本地不同用户的词库。Google拼音目前貌似本地只有一个用户词库文件,不管哪个Google Account登录同步,都是与本地同一个用户词库文件同步。其实,用户自己的输入词库是很隐私的内容,不应该所有的用户都共享本地同一个词库文件。

3. 与搜索的集成。还是需要直接点击输入框上的某个按钮,为什么不支持搜索表达式语法呢?

4. 词库的网络管理。用户可以直接去网络上搜索其他人所共享的最新词库,将其加到自己的词库中,然后根据使用情况给其做rating;也可以将自己的词库进行分类,根据不同的使用环境,进行切换(垂直输入法:-))。呵呵,以上就是所谓的利用群体的智慧打造一款无敌的输入法。我想Google应该会考虑利用服务器端所备份的用户词库,但最好是在用户愿意公开自己词库的前提下。

5. 将Google中文输入法定位成一个平台:整合全世界中文词库的平台。在此基础上,提供相关的词库API,供第三方用户进行开发,这样子,Google的输入法可以迅速渗透到各种平台。用户可以和方便的将各种词库导入到Google的中文输入法词库。越多的输入法开发人员使用Google的中文词库API,Google就越从中受益。互联网时代,越开放的平台越容易成功!

BTW,写这个文章的时候,Google拼音(1.0.23.40)已经解决了本地词库文件冲掉服务端词库文件的问题。通过查看导出词库文件的格式,发现也没啥变化。我猜其做法有可能是本地和服务器同步时,将同步下来的文件备份一份,作为将来再次同步的时候做diff用。本地新增加的词频,将会更新到上次同步后的另外一个词库文件(与备份的词库文件内容完全一致)。当再次与服务器同步时,则会将本地最新的词库文件与上次同步时所备份的词库文件进行diff,将增加的词频到同步到服务器,然后再同步到本地。不过,这也导致了另外一个问题:我怎么将我服务器上的词库清零呢?如果永远备份在服务器,而用户只能不断地用本地新词库去与之同步,而对其没有完全的掌控权,其结果将是非常可怕的。