SunPinyin代码导读(杂类)
TDoubleAnatomy and TLongExpFloat:
TDoubleAnatomy是一个union,用来把一个双精度的浮点数,分解为符号位、指数和尾数。这个方法适用于所有符合IEEE-754浮点数的平台。下面是双精度浮点数的二进制布局:这个浮点数对应的有理数为:
V = sign * 2^{exp} * (1.fract)注意:其中指数使用的是移码,对双精度浮点数来说,指数是11位,因此实际的指数要减去2(11-1)-1,即0x3FF。TDoubleAnatomy::clearExp()方法将浮点数的指数部分清除(即设置为0x3FF),然后再调用TDoubleAnatomy::getValue()得到的双精度浮点数,就是sign * (1.fraction),这也就是TLongExpFloat::m_base的值。且在Sunpinyin中,所有的概率值都不会出现负值。
直接使用double进行概率值的连续相乘运算,容易溢出。而TLongExpFloat表示的范围要大了很多,相当于将64位(1+11+52)的浮点数扩展到96位(32+64)。因此能缓解溢出的状况。TLongExpFloat重载了部分算术操作符,让我们可以像对一个primitive数据类型那样进行比较和乘除的操作(但不支持加减)。
你可能会问另外一个问题,为什么不用对数将乘法操作转换为加法呢?这是因为插值的原因,回忆一下插值的公式。如果使用对数,必须将对数形式的结果转换回来,才能执行加法。
处理计算bow时由于浮点数累加所造成的误差
在计算bow时(参见CalcNodeBow()),可能因为浮点数的连续相加造成的误差,而导致sumnext或sum出现大于1的情况,此时使用下面的公式计算bow:
原来要考察的是sumnext和sum离1.0距离的比值,现在因为误差的原因,两者都有可能稍稍超过1.0,因此将比较的基准点向右移动一些(即γ = Max(sumnext, sum)+δ,且δ是一个较小的值,0.0001)。
后面的话
如果再想到或遇到其他一些杂类的题目,我会持续更新这个entry。而SunPinyin代码导读这个blog系列,就此告一段落了。希望能对您了解SunPinyin的架构和代码细节,有所帮助。当然,我对算法的理解以及行文当中,肯定有所偏误,请大家多多指正。下一步,我还会将这个系列,翻译为英文(头痛啊)。顺便仔细review一遍,并整理成一份文档,发布在input-method项目网站上。


sun老师:
您好!有个问题请教一下,我想知道您在SunPinYin输入法的时候是用什么函数来实现候选框中第一个字符重写为蓝色的,因为我在制作阿拉伯语的时候遇到了一个问题,举个例子还是您用的如果我们用拼音打pin的时候,会出现1拼音2品3频4拼5贫6聘,其中1拼音是蓝色的,但是因为阿拉伯语是从右往左输的,所以他会出现聘6贫5拼4频3品2拼音1,但是在6聘后面还会出现蓝色的拼音1,也就是说重写的没有被同是调离到原来的位置,所以我想问一下,在sunpinyin中,您是怎样实现重写的,有哪个类或者函数,谢谢您!
发表于 李凯 在 2007年10月17日, 07:21 下午 CST #
老师可不敢当 :) 你可以使用GtkLabel的Markup方式,参见http://library.gnome.org/devel/gtk/stable/GtkLabel.html 和 http://library.gnome.org/devel/pango/stable/PangoMarkupFormat.html
发表于 Yong Sun 在 2007年10月17日, 10:19 下午 CST #
sun老师,您好!我想咨询一下关于如果用solaris的英文界面(公司规定界面必须是英文的),然后在其中又可以使用中文输入法。现在我的步骤是:登陆时选择en_US.UTF-8的语言,然后启动office,此时回出来IME Status的选项框,此时选择s_chinese,然后关闭office,此时系统就可以用ctrl+space切换中文输入法了,但是每次都要这么做,觉得很麻烦,希望系统进入后,就可以直接切换中文输入法.另外在此状态下office中输入的中文有好多无法显示,改变字体也没有什么效果,而选择相同的字体在中文utf-8下是可以显示的. 请问我该如果解决这两个问题.谢谢!
其实我只要达到这个效果就可以了.如果中文utf-8语言下,可以显示英文界面也是挺好的.
发表于 万建明 在 2007年10月18日, 09:10 上午 CST #
嗯,您说的极是,我们会尽快实现这个feature,即记住用户最近一次输入法的选择。关于staroffice在en_US.UTF-8 locale下无法正确显示某些中文字符的问题,您能举几个例子么,谢谢?
发表于 Yong Sun 在 2007年10月18日, 09:42 上午 CST #
sun,有中国的"国",体育的"体".
另外您可能误解了我的意思.我是希望在en_US.UTF-8下直接可以切换中文输入法.而不需要通过startoffice来开启IME Status.谢谢!
发表于 万建明 在 2007年10月18日, 09:57 上午 CST #
你使用的是staroffice 8么?我在Solaris Nevada的en_US.UTF-8中试了一下,是没有问题的。另外,我的意思是,iiimf应该记住用户最近一次使用的输入法,下次再login时(即使选择不同的locale),依然有效。
发表于 Yong Sun 在 2007年10月18日, 10:10 上午 CST #
我使用的是StartOffice 7,蓝色五角星的图标.现在每次登陆必须通过startoffice进行切换,否则ctrl+space根本不会切换出输入法.有什么配置可以让iiimf在启动后就被配置为这个状态吗.
我的主要目的在http://bbs.chinaunix.net/thread-1003511-1-2.html中已经说了(可能我上面没有说清楚).麻烦你帮我解决一下.
另外你们能添加紫光拼音中常用的左右shift选词吗?
还有(栟)还有一个读音是(ben)我可以通过修改原麻达到这个功能吗?该怎么做呢?
发表于 万建明 在 2007年10月18日, 10:28 上午 CST #
建议您安装使用staroffice/starsuite 8。左右shift通常不是用来切换中英文状态么?关于“栟”,您可以修改SunPinyin的词表文件( http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin/slm/raw/dict.utf8 ),然后重新构建pydict的二进制文件,具体步骤参见 http://blogs.sun.com/yongsun/entry/sunpinyin%E4%BB%A3%E7%A0%81%E5%AF%BC%E8%AF%BB_%E4%B8%80 。
发表于 Yong Sun 在 2007年10月18日, 10:38 上午 CST #
请问,为什么选择了中文的utf-8进入后,默认的就是可以直接CTRL+Space切换到中文呢?而且此时office可以直接显示汉字,如果此时如果将界面设置为英文就能很好的达到我的要求了。sun能不能指点一下呢?谢谢!
发表于 万建明 在 2007年10月19日, 10:46 上午 CST #
默认的输入法是根据当前的locale来选择的。如果用中文登陆,但要显示英文界面,可以在$HOME/.dtprofile中设置环境变量LC_MESSAGES=C。
发表于 Yong Sun 在 2007年10月19日, 02:00 下午 CST #
修改了该变量后,进入仍然是中文,好像没有效果,那当前的输入法是记录在哪个变量中的呢?
发表于 万建明 在 2007年10月22日, 12:08 下午 CST #
你可以在登陆之后,打开一个终端,用locale命令查看当前语言环境的设置,其中LC_MESSAGES应该为C或者en_US.UTF-8。然后从这个终端打开一个应用程序,应该可以看到其界面的文字是英文的。
发表于 Yong Sun 在 2007年10月24日, 12:30 上午 CST #
我试了一下,这样改是有效的。而且我在.dtprofile文件中添加自己的变量也是有效的.所以我觉得在.dtprofile文件中修改LC_MESSAGES不生效的原因是在执行完.dtprofile文件后,某一个脚本又修改了LC_MESSAGES的值,所以要达到修改的界面的效果,应该在最后一个被执行的脚本中修改LC_MESSAGES的值才行.不知道Yong Sun能不能指点一下思路.
另外反映两个问题.1. 使用CTRL+SHIFT+SPACE 修改输入法有时达不到将修改应用到所有程序的目的.必须通过点击iiim-panel中修改才行.
2. 我现在使用的8/07的solaris的版本,staroffice中中文显示的问题,需要碰运气,有时候都可以显示,有时候会显示方框,不知道是什么原因.
发表于 万建明 在 2007年10月26日, 11:19 上午 CST #
建议你可以换个字体试试。
发表于 xue 在 2007年11月13日, 11:58 下午 CST #
在x86_64下会怎样?貌似SLM本身没法识别x86_64的build host
发表于 Funda Wang 在 2008年01月01日, 12:40 上午 CST #
Hi, Funda, 目前在configure.ac中的确缺少对x86_64 host的设置。而且也不甚清楚,编译好的64bits的程序是否运行正常。手边没有AMD64+Linux的机器,如果您能帮我们添加build host的设置,并测试一下(建议可以先使用gtk-standalone),就太好了。:)
发表于 Yong Sun 在 2008年01月01日, 10:12 上午 CST #