云中的搜狗,云下的输入法

ibus-sogoupycc前不久,搜狗官方公布了云输入法,简单的说就是把所有的拼音转换成汉字的工作都交给搜狗服务器来做,按照搜狗官方的说法,服务器的词库和速度都是个人计算机不能比的,当然效果会很不错,错字会比较少。实际使用感觉也十分好,让我想到了第一次用微软拼音输入法的时候,那种能够整句输入并且结果不错的兴奋的感觉 :-)

官方给出的云输入法是基于web页面的,只能在浏览器中使用,目前只支持全拼,在浏览器中一旦转移到其它页面,就需要重新加载一次输入法,用起来成本很高。检查后发现官方的云输入法客户端其实就是向服务器发送了明文的全拼字符串,然后服务器会返回一段js脚本,包含了候选结果,往往第一个结果就是所需的,确实识别结果不错。Linux下的各种拼音输入法都没有Windows平台下的好用,既然搜狗云输入法是这样简单的AJAX请求,那么能不能包装一下它,让它在其他的地方也能用呢? :roll:

之前对ibus的示例代码有印象,觉得在ibus上面开发输入法比较简单,而且ibus这个平台看起来很可靠的样子,于是就开始动手了,这次从一开始就决定用C来写,写到中间的时候发现真的是自找麻烦 :-( ,许多数据结构如果用C++的话就容易多了,也免去了考虑内存泄漏等各种问题。

我用输入法的话,肯定是用双拼的了,于是就先去找双拼的代码,关于双拼,其实我以前已经写过几份了,在目前的本本上能找到的版本就是有一次修改sun-pinyin让它支持双拼的时候,那时的代码是为了达到目的而不择手段的,使用if else硬编码了所有的双拼组合,不仅看起来惨不忍睹,时间复杂度想来也不好。这次改用C语言的OO写法写了双拼的一个类,使用动态构造的简单的trie大幅提高查询速度。这里还用了char **[]这样的数据类型,写完后用pluskid上次在小课堂上介绍的valgrind检查内存发现没有泄漏,比较高兴 :-)

但是并不是所有地方都是这样顺利的,输入法的最麻烦的地方是对用户按键事件的处理,确实有很多很多情况,稍不注意就会出问题,确实在这个地方调试了不少时间,而且在这里改代码,改正一个问题的时候很容易产生新的问题 :-? 。为了让用户在服务器没有返回结果的时候还能继续输入,我使用了多线程去从服务器获取结果,为了数据完整,我在所有写操作的地方都简单地使用了锁,第一次写这样的多线程程序,死锁了几次,后来熟悉起来就没有再犯错误 :-) 当我写的差不多的时候,升级到了ibus 1.2版本,这个版本和我开发使用的1.1版本接口不一样,似乎改动的地方文档不全的样子,我只好又改成了1.2版本使用的代码,不过由此也产生了各种问题,可能到现在都还存在。

虽然自己发现目前的程序还会在某些时候不知道为什么而垮掉,而且似乎还有各种已知和未知的小问题 :oops: 但我觉得基本功能已经不错,可以拿出去分享一下了,就放在了这里,也许能够交几个朋友或者是收到比较不错的建议呢 :-P

目前的情况在上面的项目主页有介绍,程序的主要特点就是多线程,用户输入无阻塞,以及支持双拼(到底有多少人用双拼啊,可怜的孤独的我… -.- ),没有选词功能,始终采用服务器返回的第一个结果,这样其实在鼓励用户不要去选词,少按空格确认输入的拼音,因为标点符号就附带有这样的效果(和微软拼音一样),用户可以流畅而义无反顾地输入整句的拼音,不因为实际出现的汉字而打扰思考 :-) 如果网络流畅的话,实际体验是很不错的:

网络比较流畅的情况下输入法的表现

网络比较流畅的情况

在网络条件不好的地方,应该也是不错的吧,我模拟的网络延迟比较大的情况,大概会是这样的情况:

网络延迟明显的情况下输入法的表现

网络延迟明显(模拟)的情况

如果搜狗官方可以持续做这个项目并且不把接口改得没法看懂的话,这个项目还可以继续做下去,继续做的话有两个功能可以加上:第一个是输入一个字的话就不经由服务器了,这时候给出本地的符合要求的所有汉字列表,这样可以解决生僻字输入问题,也对个别汉字纠错提供方便。第二个是缓存一些比较短的词语,再次输入的时候可以使用缓存的数据(不过用云输入的话基本都是整句输入,不会缓存到许多数据的吧 8-O )

这篇日志的前面500字就是用ibus-sogoupycc在无线网上写的,除了个别时候出现网络错误之外,确实是几乎没有错字(5个左右吧),后面由于网络条件太差改用普通的拼音输入法了,明显感觉到正确识别率低了许多许多 :-|

总之,现在的情况还是多谢搜狗官方啊,希望这项服越做越好,可以一直用下去  :-P

18 thoughts on “云中的搜狗,云下的输入法

  1. 我刚怂恿我一装了Linux的同事尝试下,结果看到还要自己编译,他就没下载了。
    不能选词不太好吧,很多人名、地名、缩写、自造词都不能识别出来的啊。
    PS:双拼啊真不知道是什么东西= =从来没有试过

  2. @hzqtc : -.- 编译安装一下也就是几秒钟的时间,不需要configure 下个版本优先考虑提供短词组本地选词的功能吧.
    关于双拼是什么,我在这里有简要介绍.

  3. @Stingrey : 我以前用微软拼音输入法的时候,一直是整句输入的 -.-
    也没有按空格的习惯,用逗号或者是句号之后,前面输入的就被确认了. 就是如果遇到有错字的时候,需要用方向键移动到错误的地方,修改很麻烦.

    ps:上面都是搜狗云输入法整句输入的结果,现在还没有错字吧 :-P

  4. 赞一个!另外Ubuntu 9.10下make install失败,因为install是在/usr/bin下,修改Makefile后安装成功。同事也试用了一下,不能选词还是不实用啊……

  5. @liancheng : 唔,关于选词的问题,下个版本吧(不知道何年何月了) -.-
    全角的符号倒是很好办,可以很快解决~
    INSTALL = install -c
    Makefile只改动了这一个地方就可以了吗?

  6. 从来都不习惯整句输入,喜欢设置三个候选词,可以一眼扫到候选词,然后用空格和左右 shift 来选词,嗯,最初体验到输入起来让人赏心悦目的应该是紫光拼音,对微软拼音则是一直都不喜欢的。

  7. @quark : 嗯,左右 shift 键选词和左 Ctrl 键切换中英文(并且要在映射过后也能工作)这个几乎是我对输入法的硬性要求…… -,-bb 多次为此去折腾输入法的代码。。。想想我也真是个老顽固了……

  8. 安装了js、wget,编译后安装。输入时只有下划线,空格后什么都没有输入。

  9. @wulun :
    你试试看在终端运行 /usr/share/ibus-sogoupycc/sgccget.sh wanwandeyueliang,会有结果吗?

    另外如果有问题的话,最好在Google Code的Issues页而不是这里提出来

  10. 我表示顶起来,因为我也用双拼,已经6年多了!双拼简直就是速记,快速输入界的大佬!

Leave a Reply to Stingrey Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>