2006/11/30

UML的活动图

这是一个特高雅的说法,说白了,就是传统的流程图,只不过更严密一些。

巨硬颇有几个搞脑子的流程,今天遇到的是第一个,Composition如何响应各种按键输入事件、分隔拼音、判断中英文状态,在Visio的帮助下,画了两个UML活动图,现在感觉比较清楚了。这两天睡眠不好,总是不能静心下来高效工作(别说让我喝静心口服液),今天画了两张图,感觉武功精进,状态在提升了。是个好的开始。希望这次代码工作能进行得比上次顺利。

BTW:这几天都在强制自己使用微软拼音输入法,如果能强制自己整句输入的话,准确率还是很不错的,只是不符合用户的输入习惯,而且万一匹配出错的时候,修改的代价很高。另外就是这个输入法对减少击键次数没什么帮助,比较适合touch typing。 

2006/11/29

手机上的博客

测试。

巨硬III

可能很多人会以为这个标题是文字游戏,它不是。

过去的两周我已经仔细写完了巨硬III的逻辑文档,大部分问题都考虑完毕,这周开始进入代码阶段。上一次写代码大约是今年6-7月份,把这些代码翻出来看了看,庆幸当时的结构化设计,很多代码都可以重用,包括数组类、字串类、文件操作类;数据封装方面,原来的PalmOS数据库和记录操作代码可以完全不用修改,直接拿过来用;引擎和框架方面,上次的代码并没有最后完工,但是仍然有相当多的部分可以重用;只有数据结构方面,因为改动很大,需要全部重写。就代码量而言,现在保守估计应该有30%-40%的水平。

大家会问为什么跳过了2.0版本。对这个问题我会在软件发布的时候仔细解释,跳过2.0是有充分的理由的--或者把前面这个进度80%左右的版本称为2.0。3.0在逻辑上有质的飞跃。

关于输入法,目前应该说有两大流派:一个是规则派,大量使用技巧和规则,绝大多数基于词组、简拼、联想的中文输入法都是这一派的,这个路已经随着计算机中文应用进化了十几年,非常成熟,紫光拼音、拼音加加和新秀搜狗拼音都是典范;剩下的能做的改进已经很有限,无非是在词组和词频上做文章,以及增加一些特殊输入方式。当然这些输入法都有一些闪光点,比如词频调整和自动造词,确实方便。但是其发展空间的限制也非常明显,词组和词频的问题其实是非常个性化的,而特殊输入方式需要学习,我相信拼音加加的用户中90%以上都不会用到它的很多快捷输入功能。

另一类就是智能派(整句输入法),以微软拼音为代表,国内还曾经有个黑马输入法,以及口碑不错的智能狂拼。这一类输入法的理论依据很厉害,是贝叶斯模型。但是这个模型是否能适用输入法,是个疑问,我发现在现有的贝叶斯模型整句输入法中,或多或少都有些错误假设。这或者影响性能,或者不符合用户的心理习惯。

巨硬3.0不同于以上两类输入法,当然它不是说抛弃了上述输入法的优点,而是继承了传统规则派输入法的绝大多数优点,包括词频调整、自造词、简拼等等。但是在逻辑上,它大胆的采用了Jeff在On Intelligence中首次提出的Memory Prediction模型。该模型对用户来说的好处在于大大降低无效重码,在数字键盘设备上尤其明显。形象的说,MP模型就是词组的词组,再加上词组的联想,同时不要求用户的输入方式,比如连续输入几次蒲巴甲,即使是一个字一个字输入的,系统也会把他们组合成词。至于怎么从用户输入的序列中抽取出来组合的开始和结束,正是MP模型的闪光之处。实际上这个想法在2.0版本中就想实现了,但是直到最近灵光频现,才想明白了其中的一些关键问题,2.0中的一些思路是错误的,于是推倒重来。和商业软件相比,个人软件的魅力也许就在与此,It's ready when it's ready,你不需要把半生不熟的东西端上客户的餐桌。至于这个模型和现有模型能有多少进步。我的预测大概是这样的,如果是PC输入法,因为touch typing的速度是接近甚至超过人的口语速度的,用不用MP模型都没所谓;在thumb qwerty kb上,现有的巨硬和梅花都没有联想,如果采用MP能直接补足这个问题,如果是双手操作,速度应该能有50%左右的提升,如果是单手,还要多些,但是不会达到100%;在numpad kb上,传说中的Nokia神奇T9在我看来根本不怎么样,MP模型绝对可以让你shit in your pants。它应该可以让num kb超越现有qwerty巨硬的速度。

最后说说进度的预期,老实说,PALMOS是开发输入法最恶心的,没有好的系统框架,稳定性大成问题,debug也很困难,但是它在存储设计和运行效率上最好,而且我也最熟悉PalmOS开发,所以仍然从这里开始;最近也在看Windows Mobile和Symbian的开发,Windows Mobile开发也不难,有很好的输入法框架,就是效率上不知道怎么样,但是WM PPC设备的大内存是不错的,WM Smartphone就难受一些,不过总的来说差异不大;Symbian的系统在编程习惯上差异比较大,好处是FEP框架和C++类都很好,惟一的缺点是我对它的Stream类效率担忧,巨硬III的动态读取数据在M量级,频繁的读写操作系统能否高速完成是个未知数,如果要自己设计cache系统来解决这个问题的话,就太悲凉了。不过我现在就在使用E60,所以无论困难多大,我都会完成的。PalmOS的版本应该在春节前有Alpha,但是我不打算立刻发布;PalmOS版本完成之后会马上进入Symbian开发,我希望是在明年春暖花开的时候(大约4月吧)能同时发布PalmOS的QWERTY版、 Symbian的QWERTY(E61/E62)和NUMPAD(S60 3rd Edition)版。正式发布之后就进入Windows Mobile系统的移植,这个应该很快,再多花2个月吧。

 

2006/11/14

SEQUENCE & FORGETTING

说起来有趣,一个以智能为目标的输入法设计,其核心的数据结构要考虑一个遗忘的问题。

巨硬一中没有特别设计遗忘算法,不过如果要实现的话并不复杂;因为巨硬一中没有设计记忆序列,所以所有词组可以放在26个序列中,至于为什么以S开头的字词和以K开头的字词都要遵守同样的空间限制,并不是一个非要解决的问题,即使K开头的字词浪费了存储空间,用户并不会有什么实际的使用障碍,浪费的那些存储空间也无关紧要。

但是巨硬二不同了,对于记忆序列的存储需要解决这个问题,不然浪费的空间就不是几百K的问题,而可能是几百M的问题。所以巨硬一的那种简单算法不再够用了。

解决这个问题有两个思路,一个是在记忆序列的时候记录使用次数,另一个是对所有记忆序列整体排序。前面一种方式比较可行。需要注意的地方是(1)排序的依据并不是使用次数,(2)该值的目的是遗忘,所以能记录有限的几次就可以了。基本上所有曾经被多次使用的记录都不应该被遗忘。