为了帮助开发者在谷歌拼音输入法的基本输入功能基础上,开发和定义更丰富的扩展输入功能,谷歌拼音输入法提供了以Lua脚本编程语言为基础的输入法扩展API。利用输入法扩展API,开发者可以编写自定义的输入功能,并将脚本分享给谷歌拼音输入法的用户安装、使用。
一段简单的Lua脚本程序就可以构成一个最基本的输入法扩展模块。下面是“Hello,World!”程序示例:
function HelloWorld() return "Hello,World!"endime.register_command("hw", "HelloWorld", "test")
这一段代码由一个自定义的Lua函数和一行ime.register_command函数调用组成。自定义的Lua函数HelloWorld()简单地返回一个Lua字符串"Hello,World!",这表明该输入法扩展函数被调用后,显示给最终用户的候选项为"Hello,World!"。ime.register_command函数调用将自定义的输入法扩展函数注册到谷歌拼音输入法中。其中,第一个参数"hw"表示该扩展功能在i扩展模式中对应的命令名是"hw",第二个参数表示该扩展功能对应的入口函数(自定义的Lua函数)是"HelloWorld",第三个参数是显示在i扩展模式命令列表内的简短说明文字。
使用任何文本编辑器输入上述程序后,以helloworld.lua为文件名保存到安装有谷歌拼音输入法的计算机中。然后,打开谷歌拼音输入法选项设置窗口,在"扩展"页面中,点击"安装扩展包"按钮,选择保存在计算机内的helloworld.lua。安装后,打开记事本程序,切换到谷歌拼音输入法,键入"ihw",谷歌拼音输入法的候选项窗口中将出现唯一候选项"Hello,World!"。
事实上,谷歌拼音输入法提供的输入法扩展API可以用来开发各种不同的输入体验,例如,根据用户输入的参数返回相应的信息内容,查表输入特定的文字信息,完成自定义的甚至包含随机变量的计算并以不同形式返回结果,将用户刚刚输入的文字内容转换为另一种表现形式,等等。谷歌拼音输入法提供的i模式的缺省功能,包括时间和日期格式转换,查星座,掷骰子,打印字符等,都是一些最简单的示例。
本指南的后续内容详细介绍了开发输入法扩展所需要的各种知识。我们也鼓励开发者直接参考已有的示例程序,例如i扩展模式的缺省功能是由安装在以下位置的Lua脚本程序实现的:
XP: C:\Documents and Settings\All Users\Application Data\Google\Google Pinyin 2\Extensions\base.luaVista / Windows 7: C:\ProgramData\Google\Google Pinyin 2\Extensions\base.lua
i扩展模式是由安装在用户计算机中的脚本程序定义的多个命令组成的。在谷歌拼音输入法中,用户先键入“i”,再根据提示键入(或选择)两字母长的某个命令,即可实现特定功能。开发者利用扩展API开发的脚本程序在谷歌拼音输入法中注册相关命令并提供命令的实现代码。
在Lua脚本中,向谷歌拼音输入法注册一个命令的基本语法是:
ime.register_command(command_name, lua_function_name, description, leading, help)
ime是提供给Lua脚本试用的,与输入法内核交互的专用模块。register_command是向谷歌拼音输入法注册新的i扩展模式命令所试用的函数。函数的各参数含义如下:
lua_function_name给出的命令入口函数可以接收一个或零个参数,例如:
function my_entry_function() -- 做某些处理并返回结果end
当入口函数接收一个参数时,输入法会把用户在i扩展模式中i+双字母命令名输完后继续输入的所有内容作为一个字符串参数,传给入口函数。例如,用户先后键入“ihw123”,则,用户激活的扩展命令名是“hw”,输入法调用该命令对应入口函数时,以字符串方式传入参数“123”。入口函数可以对参数进行运算处理,并返回对应的结果。例如:
function my_entry_function(argument) -- 将参数argument转换为数字,计算并返回其平方根...end
注册扩展命令时传入的提示信息description会在用户看到i扩展模式的命令列表时显示,以提示用户该命令的功能。这个字符串应当尽量简短(不超过10个字符)。如下图中的“掷骰子”,“打印字符”等,都是description:
注册扩展命令时传入的提示信息help会在用户选中了某特定命令后,显示在输入法候选窗口的右上角。这个字符串可以比description略长,但一般也不要超过50个字符。例如,下图中用户选择了打印字符命令“zf”后,显示出来的“请输入字母或数字序列,例如hello”就是help的内容:
一个命令对应的入口函数可以返回一个或多个候选字符串。返回的参数类型可以是Lua字符串类型,也可以是Lua数字类型,还可以是Lua布尔类型。但这些返回值返回输入法内核后,都会被转换成字符串显示给最终用户,以便用户选择输入。
要返回唯一的候选字符串,只要直接使用return语句返回字符串、数字或布尔值即可,例如:
function TestString(argument) -- 做某些处理 return "a string"endfunction TestNumber(argument) -- 做某些处理 return 1234.56789endfunction TestBoolean(argument) -- 做某些处理 return trueendfunction TestAnotherBoolean(argument) -- 做某些处理 return 3 > 2end
要返回两个或更多结果,只要返回一个Lua的列表对象即可,例如:
function TestTable(argument) return {"abc", "def", "ghi", 123, true}end
列表中的每个元素可以是Lua字符串,数字或布尔值,但不能嵌套列表。列表中的每个元素将对应于输入法显示给用户的候选项列表中的一个候选项。上面这个函数返回的列表在输入法中的显示如下图所示:
除了单行字符串结果外,命令的入口函数还可以返回一个或多个包含换行符的多行结果。换行符在Lua程序的字符串常量中用"\n"表示。例如下面的函数:
function TestMultilines(argument) return "line 1" .. "\n" .. "line 2" .. "\n" .. "line 3"end
多行结果在输入法的候选窗口中被显示为“<字符画>”,当用户选择输入该候选项后,多行文本被插入到用户当前文档中,如下图:
当用户刚输入完i扩展模式的命令名称,尚未输入命令参数时,入口函数将被调用,此时传给入口函数的参数为空字符串。这时,入口函数可以通过返回一个提示信息表,来提示用户有几种预定义的候选参数,并在输入法的候选窗口中,允许用户直接选择某个预定义参数。例如:
function TestMetatables(argument) if #argument == 0 then -- 如果没有参数,则返回提示信息表,以便用户直接选择预定义的参数"num"或"chs" return { { suggest = "num", help = "数字123" }, { suggest = "chs", help = "中文一二三" }, } elseif argument == "num" then -- 如果参数是"num"(可能是用户键入的,也可能是用户根据提示信息表直接选择的),则返回数字结果 return 123 elseif argument == "chs" then -- 如果参数是"chs"(可能是用户键入的,也可能是用户根据提示信息表直接选择的),则返回中文结果 return "一二三" endend
返回的提示信息表必须符合上述格式,即,表中的每个元素都是一个子表,每个子表内有两个元素:键名suggset的元素表示要提示用户输入的一个候选参数,键名help的元素表示对该参数的简短说明文字(不要超过10个字符)。上述入口函数在用户没有输入参数时,输入法显示的提示窗口如下图:
这时,用户可以试用上下键,翻页键和鼠标选择自己要输入的参数,也可以直接用键盘输入。
在开发者编写的Lua脚本中,代码除了可以调用Lua本身提供的各模块功能(是标准Lua运行环境所提供功能的一个子集),还可以使用ime模块访问输入法的相关信息,以实现与输入法有关的特定功能。
例如,可以使用ime模块的get_last_commit()函数获得用户上一次键入的字符串,并根据字符串的内容进行相应的计算,返回特定结果。比如,用户键入了“你好”,然后使用i扩展模式中的某个功能,该功能看到“你好”后,自动返回“hello”。实现这一简单逻辑的代码如下:
function TestConvertHello() if ime.get_last_commit() == "你好" then return "hello" else return "not found" endend
更详细的信息请参见API参考一节中有关ime模块的部分。
Lua入口函数接收无法处理的参数,或者发生其他内部错误时,可以简单地不返回任何参数,或者使用Lua语言内置的error()函数向输入法报告错误信息,例如:
function TestIgnoreError(argument) if #argument > 5 then return end return 123endfunction TestReportError(argument) if #argument > 5 then error("argument length > 5") end return 123end
使用error()函数报告的错误信息不会在输入法用户界面中显示,但可以使用控制台工具测试脚本程序并查看错误信息。参见下面的开发与调试一节。
输入法扩展脚本程序可以使用任何源代码/文本编辑器创建。在将输入法扩展包安装到谷歌拼音输入法之前,可以使用控制台工具测试扩展程序,以确保程序功能正确。请从以下链接下载用于开发调试谷歌拼音输入法扩展脚本的控制台工具:
下载控制台工具 (GooglePinyinApiConsole.exe)
在命令行运行控制台工具GooglePinyinApiConsole.exe时,需要给出的命令行参数是一个或多个待测试的脚本文件路径,控制台工具会加载所有指定的输入法扩展脚本,并启动一个交互式界面,供开发者测试执行扩展模式命令。例如:
GooglePinyinApiConsole.exe ext1.lua ext2.lua ext3.lua
在控制台工具的交互式界面中,键入"help",可以查看帮助信息:
i - 列出所有已注册的扩展命令i[COMMAND] - 无参数执行某命令i[COMMAND][ARGUMENT] - 有参数执行某命令quit - 退出控制台工具help - 显示帮助信息
当脚本加载或执行过程中发生错误时,控制台工具会打印显示错误信息。错误信息包括发生错误的脚本文件名,错误行号,错误内容等。
控制台工具并不是真实的输入法运行环境,因此,一些和输入法特定功能相关的接口,例如,ime.get_last_commit(),在控制台运行的脚本中无法得到实时的输入法相关信息,这时,此类函数的返回值是简单的固定字符串,如“测试”。
下图显示了使用控制台工具测试缺省输入法扩展包中各命令功能的情形:
目前,谷歌拼音输入法扩展API只提供了Lua一种开发语言。Lua是一种体积小巧却功能强大的动态脚本编程语言,广泛用于网络游戏等应用的插件或扩展功能的开发。对于一个有JavaScript语言、VBScript语言或者Python语言开发经验的开发者来说,学习Lua语言并不困难。请参考以下网址获得关于Lua语言的各种信息:
Shared by pluskid
555 ,感觉还是 unsupervised learning 啊
计算机学科对顶级国际会议很重视。最近不断有人问,为什么这几年来自中国的top conference paper 越来越多?问话的基本上都是海外客,既有国人也有老外。
这个问题似乎我是有一定发言权的,在一定程度上可以说我是“全程参与者”,经历了顶级会议来自中国的文章“罕见”到“有几篇”到“有一些”到“很多”的历程。
现在不少国内的年轻人在顶级会议发表论文,例如我组里的学生。有些年轻人发了几篇文章就开始“一览众山小”了,经常可以看到年轻人拿自己的publication记录去和老院士们比较。我一直告诫学生,别以为你们这个年纪的人比前辈们厉害,人类进化速度还没这么快。老院士们(除去极少数“混进去的”)是他们那个年龄段的学人中万里挑一甚至更牛的人物,你们不要说万里挑一,有没有达到自己这代人中的top 1%?人永远只能和自己的同龄人比较。以前国内可能要聪明绝顶的人物才能在顶级国际期刊会议发表文章,现在可能资质中上的年轻人就可以办得到。你们看起来取得更大的“绝对成绩”,只不过因为你们拥有的条件是他们不可比拟的。
可以说,2005年是一个分界点。2005年之前,计算机科学各个领域中,来自中国内地的顶级会议论文是少之又少,绝大多数会议上都是光头或者零星几篇。2005年之后的情况可以用“巨变”来形容。拿IJCAI/AAAI为例,曾有人统计过,从1969年到1998年的30年间,中国内地的录用论文加起来不超过10篇,可以说光头是正常的,不光头倒是不正常的了。1999-2005年和以前情况类似,但是2005年以后就截然不同了,中国内地每次都有10来篇甚至更多。
黄仁宇先生名著《万历十五年》告诉大家,虽然是崇祯吊死在煤山上,但其实明亡于万历。我有一个理论来解释2005年之后国内计算机界在顶级会议的爆发,核心思想是说2002年的时候这就已经是注定的了。姑且称之为“2002理论”吧。这个理论往外一摆,友人们都恍有所悟。其实雏形早在微软研究院2006年的计算机教育高峰会(Microsoft Faculty Summit)的特邀报告里我就已经说了,只不过当时大家还没感知到这个“爆发”,所以我是从“缺什么”的角度来说的。有心人自可深思,如果“缺”的这些“不缺”了,结果会如何。讲完下来Niklaus Wirth就跟我说,看来中国计算机有希望了。图灵奖得主果然不一般,听出了言外之意。
说穿了,这个理论大致就是认为,2002年后入学的学生(至少对国内较强的计算机学科的学生来说)在起点上不再输给国外的同龄人。这些学生到2005年后该出东西了,这就必然会导致“爆发”。
为什么是2002年呢?说几个比较明显的原因:
1) 文献丰富
今日的年轻人已经难以想象,十年前国内的研究环境是怎么样的,更不用说二、三十年前。
说个故事吧。98年我念研究生的时候,正是求知欲旺盛的时候,逮着什么读什么一点不累。问题是所能拿到的最新的国际文献是1995年出版的IEEE Transactions。95年的Trans,文章的工作大概是93年或者之前做的。也就是说,能看到的最新的东西是别人五年前做的。这五年里别人在干什么?只有靠猜了。
年轻人可能要问了,不能找最新的会议论文集看吗?那年头,就连这IEEE Trans都是盗版来的,是上海某公司影印之后再卖给各大高校。国家对科技投入很有限,系里有钱买盗印的国际期刊就相当不错了。最新国际会议文集,想都不要想。
那,纸版的没有,不能到网上去找吗?要知道,CERNET是1997年才开始建的,整个教育科研网的出口带宽只有25M,何况再往下分到各地区中心、各高校。别说出国了,telnet上BBS聊天都只能看着一个个字往外蹦。连国外网站?简直做梦。到了1999年,全国互联网的国际出口带宽才只有143M。再考虑当时高昂的网络费用,难得有实验室可以让学生连网上国外网站。通过网络访问国外的科研资源(例如作者主页上的论文),大抵是2003年以后的事情。
再说个故事,99年因为拿了首届微软学者奖,我到微软做了两个月的intern。在微软平生第一次接触ACM和IEEE的数字图书馆,当时就被震撼了,居然能看到这么多文献!回学校就没这个机会了。于是平时偷偷地下载,到了周末和周昆两个人跑到中关村去买光盘。记得我们俩鬼鬼祟祟的,被小贩当成买黄盘的了。买了盘回到希格玛偷偷用光盘机刻了带走。
国内各大名校订阅国外的数字图书馆大概是2000年以后开始的,到2003年左右比较齐全了。再加上网络越来越快、越来越便宜,直接可以访问作者主页下载文章了。为了便于访问,我还曾经维护了一个国外researcher的主页列表,大概有好几百人的主页信息。再后来因为一Google就有,那个列表就不再用了。
总之,对2002年以后入学的学生来说,文献的获取不再是一个瓶颈,至少对国内水平相对较高的单位来说,在这方面基本上和国外站在了同一个水平线上。
2) 交流增加
十年前很难得有海外人士来做报告。一般的情形,一个系一年有那么五、六次海外人士学术报告,这个系就算相当活跃了。每次报告一定是人满为患,搞不搞这个领域的人都会来听,因为这是难得的接触“最新信息”的机会。2000年之后情况开始改观,随着国家加大科技经费投入,各单位逐渐开始有钱请人来访了。现在一个系每周有人来报告是很普通的事情。报告会多,大部分都懒得去听,也成为普遍现象。
交流对学术研究的重要性大家都知道,例如可以了解最新信息,知道别人在做什么,讨论讨论还可能碰撞出火花。但是对国内的情况,还有一个极为特别的、容易被人忽视的重要因素。
文革毁了中国科学界几代人。文革前的名教授,基本上都被打成反动学术权威;大学刚毕业的,赶上搞运动耽误十多年。等运动结束,再到恢复正常的大学,这些学人已经远离国际学术舞台差不多二十年了。而计算机科学恰恰在60年代到80年代这20来年里发生了巨大的变化。像90年代中期机器学习在国外已经兴盛起来了,但国内人工智能界主流还在搞专家系统、知识工程,而那是老美60年代中期开始做的事情。说穿了,8、90年代的时候,国内知道国际上在做什么的人可以说是凤毛麟角,大多数研究生都是“unsupervised learning”。这是很可怕的一件事。今日的学生在入学第一天就能知道的东西,例如什么样的国际期刊、会议是顶级的,哪些单位、哪些人在这个领域水平高,等等,在那时候没有人能告诉你,需要学生自己去摸索,能不能不迷路不掉进陷阱地雷阵,就看自己造化了。
在这样的情况下,外来学人的报告就是雪中送炭了。哪怕报告人本身的水平未必有多高,总可以提供一些关于国际上目前在做什么的信息。中国从来就不缺聪明人。知道了别人在做什么,一些聪明学生自己就能折腾点东西出来了。我见过若干“高徒出名师”的例子,和这些学生接触之后发现,他们几乎都是从别人的报告中了解到一些东西开始起步的。
另外一个极为重要的方面,是参加国际会议。十年前,即使是教授,几年能出国一次就已经相当不错了,回国的时候都免不了大包小包往回背东西。研究生出国参加国际会议,简直是想都不敢想的事。2000年后国家科技投入明显增加。现在博士生即使每年出国参加会议也不稀奇,甚至有学生出国多了懒得动了。参加国际会议、和以前在文章里才看到的人讨论、甚至和他们同台报告,对提升学生的自信、开阔眼界,绝对是能起到不容忽视的作用。
总之,对2002年以后入学的学生来说,在国内一些水平相对较高的单位,国际交流方面已经不再是大瓶颈,基本上和国外大多数地方站在了同一个水平线上。
3) 设备改善
以往国内科研环境差,有一个今天大多数人已经忘记了的因素——设备。97年我念研究生的时候,好不容易有了一台自己独立使用的286计算机,而286机型是美国80年代初推出、80年代中期广泛使用的。也就是说,国内在设备上落后了近15年。很多需要大量计算的实验工作,国内大多数单位都难以开展。
但是仅仅十年后,今天可以看到,就计算机学科来说,国内的设备不仅不差,和绝大多数地方包括很多美国名校比起来,甚至是国内的设备更好。这直接受益于2000年以来科研经费的大幅增长,以及“轻人力重设备”的经费管理制度。今天教授们都在抱怨说财政制度只允许大量的经费投入在设备上,不适合计算机这种人力更值钱的学科。但是之所以有这样的政策,我估计原因之一可能是以前一说到国内研究水平不如国外,大家首先给出的理由就是设备太差,外面能做的事国内做不了,所以高层有了这个印象,只要把设备搞上去科研水平就能起来了。
2002年以后入学的学生,在他们开始接触科研工作的时候,至少在国内比较强的一些单位,设备上不仅不处于劣势,甚至可能占有优势了。
4) 求教有路
前面提到,8、90年代的时候,大多数研究生都是在unsupervised learning,而且很难找到人求教,因为周围的人自己也不在前沿。过来人知道,能不能得到指点,尤其是在科研起步的阶段,是有非常大的差别的。
90年代后期,国内BBS开始兴起,很多BBS都有学术版块,为学生们提供了一个非常有益的讨论、交流的场所。从BBS上得到帮助,是90年代末、2000年代初很多学生踏上科研旅程的重要的第一步。但是,有人提问就需要有人回答,能回答的人从哪里来呢?主体是那些unsupervised learning出来的人。
我非常荣幸地成为第一批回答问题的人。90年代末的水木清华AI版、小百合AI版以及DM版,在教育网内红极一时。在相当一段时间里我是有问必答。当时不经意的举动,为促进国内相关领域的发展可能起到了很积极的作用,我很为此骄傲。后来国内有相当多的学生进入了这些领域,我想我是有一定贡献的。
有了BBS,不少人得以从 unsupervised learning 变成 semi-supervised learning,成功的机会大多了。2000年后,国内一批年轻的研究生导师逐渐浮出水面,supervised learning 开始出现了。
还有一点,8、90年代的时候,国内计算机界极少有国际水平的学人,大多数学生都只能去想象这些人是什么样子,甚至把他们想象成神一样。2000年以后,逐渐有一些学人开始和国际接轨。学生们看到这些人其实也是普通人、并没有三头六臂,他们能做到的,自己也应该能作到。套一句老话,榜样的力量是无穷的。有了学习样本,事情就好办多了。
2002年以后入学的学生,在他们开始接触科研工作的时候,在国内一些水平相对较高的单位,可以得到一些实质性的指导了,这和以往相比是完全不同的。
另外,微软研究院和香港的几所大学,在国内计算机界爆发的过程中起到了相当大的作用。以后有空再说些故事。
总的来说,最重要的其实归结起来就是两条:Internet的普及、科技投入的大幅增加。再归结下去就是经济的飞速发展。整个中国在过去的十年取得了经济的腾飞,经济基础决定上层建筑,这是真理。经济发展了、科研水平必然会跟上去。
中国从来不缺聪明人,缺的是能够让聪明人发挥才智的环境。总要有一批人来创造环境。能有机会做创造环境的人,是一种荣幸。
十一月 2009 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 日 |
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |