北大中文论坛 www.pkucn.com

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
楼主: 路路通

《输入法编程漫谈》问答

[复制链接]
 楼主| 发表于 2008-6-15 11:29:52 | 显示全部楼层
原帖由 谢振斌 于 2008-6-14 23:55 发表


呵呵,有点越辨越乱的感觉。

你似乎总在谈论并击问题?并击的意思是“同时性”,而我没有一句话怀疑过同时性,怎么焦点变成“并击”去了。

引起你谈论并击的可能是这句话:
“手部动作不可能像大脑那样区 ...


好吧,咱们不谈并击了,谈谈你的码表吧。

        (1)“对于静态数据部分,我是力求简单。搜索匹配也是顺序搜索”
        十几二十万条的码表,不会是从第一条到最后一条这样搜索吧,连二分查找都不用?怎么个顺序法,愿闻其详。
        (2)“需要支持可以通过自定义编码部分来实现。”
        谢兄说力求简单,但自定义编码的算法肯定与系统码表的算法不一样,也就是说,需要两种码表结构,两套查找算法,这是否又回归复杂了呢?
        (3)“目前静态词库记录的就是“词语”、“频度”。 如果连频度都省略的话,那么10万个二字词就只需要400k字节。”
        省掉频度,如果只有静态码表,那没有什么不便,但是加入动态码表之后,排序的依据怎么确定呢?

[ 本帖最后由 路路通 于 2008-6-15 11:31 编辑 ]
发表于 2008-6-15 12:21:45 | 显示全部楼层
原帖由 路路通 于 2008-6-15 11:29 发表


好吧,咱们不谈并击了,谈谈你的码表吧。

        (1)“对于静态数据部分,我是力求简单。搜索匹配也是顺序搜索”
        十几二十万条的码表,不会是从第一条到最后一条这样搜索吧,连二分查找都不用?怎 ...


顺序搜索和快速搜索各有好处,前提得看你已知什么,目标是什么。
如果你是已知一个编码,从码表里查找精确匹配的词语,那么你用任何一个优化算法都好过顺序搜索,比如binary、map、hash等。但那样无法很好地完成模糊匹配及部分匹配。
一句话,各有利弊吧。按照目前机器的速度和词库的规模,可以自己平衡一下进行取舍吧。

        (2)“需要支持可以通过自定义编码部分来实现。”
        谢兄说力求简单,但自定义编码的算法肯定与系统码表的算法不一样,也就是说,需要两种码表结构,两套查找算法,这是否又回归复杂了呢?


参考加加吧,它的自定义词库支持非汉字,系统词库也是不支持非汉字,我猜也是存在类似的理由。
我只能说内部编码是基于规则的,功能庞大的,外部编码是死的,非灵活的。
简单举一个例子吧,内部拼音可以用算法实现模糊音和混拼,外部拼音码表必须用枚举法才可以实现。

        (3)“目前静态词库记录的就是“词语”、“频度”。 如果连频度都省略的话,那么10万个二字词就只需要400k字节。”
        省掉频度,如果只有静态码表,那没有什么不便,但是加入动态码表之后,排序的依据怎么确定呢?


静态频度只是省掉不是不要,可以用算法计算出来。动态频度也依然存在。最后的排序按照算法计算决定。


你是不是在做可以外挂任意码表的输入法呢?
 楼主| 发表于 2008-6-15 12:59:25 | 显示全部楼层

回复 47楼 的帖子

(1)谢兄的系统码表根本就不排序,对吗?
(2)简拼、混拼等,由于我的是基于双拼的,因此比较简单。
(3)是想做可以外挂任意码表的输入法,但还没想好。

[ 本帖最后由 路路通 于 2008-6-15 13:04 编辑 ]
发表于 2008-6-15 17:09:18 | 显示全部楼层
词语按照频度排序。
 楼主| 发表于 2008-6-15 19:03:05 | 显示全部楼层
谢兄对固顶、顶屏、智能组词之类有何高见?
发表于 2008-6-16 01:26:57 | 显示全部楼层
原帖由 路路通 于 2008-6-15 19:03 发表
谢兄对固顶、顶屏、智能组词之类有何高见?


固顶:
我不是曾发过一个“关于动态词频于静态词频”的帖子,被版主“固顶”了吗,太久没人兴趣了已经释放固顶了,你可以参考一下。

顶屏:
这是编码设计方案的一部分,我的方案是空格或选字键上屏,少部分标点也可以顶屏。其他情况不能顶屏。

智能组词:
这个涉及智能算法问题,目前都是初步的智能,各家都有自己的优缺点,都在努力完善。
 楼主| 发表于 2008-6-16 23:29:02 | 显示全部楼层

回复 51楼 的帖子

帖子已看完,看来谢兄在这方面费了不少精力。

        我觉得加加的间接辅助码的引导键tab的顺序不好,应该统一用直接辅助码,比如“帛”,直接输入bob,出来的是词组怎么办?这时才按tab将输入方式转换,虽然只是顺序的改变,但输入流畅得多。

        字词的联想功能,现在主流输入法都不用,但我觉得这里还有可挖掘的东西,有语境的配合加上句子的上下文进行动态联想,效果应该不错的。  
        
         路路通键盘现有的版本是4095键,由于按键多多,因此大师们挖空心思、极尽所能才弄出的功能,在我这里轻松的就能实现,比如辅助码,哪用得着分什么直接、间接这么麻烦?中文输入、英文大小写、中英文标点符号等等都有单独的键位,直接就可输入,这就是大键盘的好处。

        有一个疑问:微软的直接上屏方式非常好,既可增加一候选行,又可以节省屏幕资源,众多输入法为什么不采用呢?谢兄可知原因?
发表于 2008-6-17 12:30:59 | 显示全部楼层
原帖由 路路通 于 2008-6-16 23:29 发表
帖子已看完,看来谢兄在这方面费了不少精力。

        我觉得加加的间接辅助码的引导键tab的顺序不好,应该统一用直接辅助码,比如“帛”,直接输入bob,出来的是词组怎么办?这时才按tab将输入方式转换,虽然只是 ...


直接辅助码本来就是可以的,如果怕候选太多,再加尾缀区隔。
Tab最早出现时主要是为了“辅助”,偶尔用之。当成为常态法后,就会觉得累赘。只是某些用法业界已经形成习惯了,有时不得不考虑兼容之。

联想功能我原先也以为被人忽略,以为我若把它弄进去也会算是一个亮点,可近来才发现,加加和google已经有这个功能,加加是通过选项选择(称呼好像是动态智能调频),google不需要选择。
虽仍有改进空间,但创意已失。

“微软的直接上屏方式”不知指什么?我这里现在只有在WORD状态才可以调出微软拼音,但没发现特别的地方。无非就是增加一层最后的确认,在确认之前用下划虚线显示在屏幕正文中。

因为我无法尝试它在非微软自己的产品中的表现。

我感觉一般输入法,要取得文档光标位置基本是没问题,但是要取得文档当前的字体字号,却很困难,除非拦截了很多API接口才能实现,不知你有没有办法?
 楼主| 发表于 2008-6-17 13:11:46 | 显示全部楼层
微软的方式充分利用了文档的空间,其它输入法就得加宽自己的窗体。

既然可以取得宿主程序的句柄,应该可以拦截它的消息,没有试过,有时间试试看,你要是解决了,请拿出来分享一下。
 楼主| 发表于 2008-6-18 23:31:17 | 显示全部楼层
原帖由 谢振斌 于 2008-6-17 12:30 发表
我感觉一般输入法,要取得文档光标位置基本是没问题,但是要取得文档当前的字体字号,却很困难,除非拦截了很多API接口才能实现,不知你有没有办法?


要取得文档光标位置对于EDIT控件来说不难,用lpIMC->cfCompForm.ptCurrentPos直接提取就行,但对于非EDIT类的文档就不灵了,只能用GetCareagePos()。同理,取得文档当前字体字号,对于EDIT控件的文档来说,也是容易得很:
lpIMC->lfFont,非EDIT类的文档分两步,第一步取得当前字体的句柄:
        hFont = (HFONT)SendMessage(lpIMC->hWnd,WM_GETFONT,0,0);
        第二步通过字体句柄获取字体的信息,这一步费了不少的时间,主要是找不到相应的API函数,网上搜了很久也没有找到相关的信息,MFC的倒是有,但不适用,估计谢兄的IME也不是用MFC写的,没办法只能对Get开头的API函数一个个的查,最后终于找到了它:GetObject()

        HFONT hFont;
        LOGFONT lf;

        hFont = (HFONT)SendMessage(lpIMC->hWnd,WM_GETFONT,0,0);
        GetObject(hFont,sizeof(LOGFONT),&lf);

        常用的软件我试过都没问题,谢兄抽时间对各种软件试一下,看看灵不灵。
 楼主| 发表于 2008-6-19 12:23:32 | 显示全部楼层
原帖由 谢振斌 于 2008-6-19 11:51 发表


你的方法,我还没仔细研究。但你考虑一下这种情况:

当宿主控件频繁变换字体信息的时候,你如何判断你取得的字体就是前面显示的字体?
比如说,一个文本编辑器,支持多种字体字号混排,每次显示完,又有意把F ...


你何时、何地需要再提取一下不就行了吗?搞不清谢兄要字体信息干吗,微软输入法有很多软件也是没有捕捉宿主控件的字体信息,你可以试试。

[ 本帖最后由 路路通 于 2008-6-19 12:26 编辑 ]
发表于 2008-6-19 12:30:15 | 显示全部楼层
原帖由 路路通 于 2008-6-18 23:31 发表


要取得文档光标位置对于EDIT控件来说不难,用lpIMC->cfCompForm.ptCurrentPos直接提取就行,但对于非EDIT类的文档就不灵了,只能用GetCareagePos()。同理,取得文档当前字体字号,对于EDIT控件的文档来说,也是 ...


你的方法,我还没仔细研究。但你考虑一下这种情况:

当宿主控件频繁变换字体信息的时候,你如何判断你取得的字体就是前面显示的字体?
比如说,一个文本编辑器,支持多种字体字号混排,每次显示完,又有意把Font信息恢复为系统默认,那么你取到的最多只能是那个默认值,无法取到历史用过的每一个字体。
我常用BabelPad编辑器,记得曾试过没取到正确的字体。

当然,如果能适合多数场合的话,那也是不错,其他的就自己设置一个合适大小的字体。有空再看看。
发表于 2008-6-19 12:35:35 | 显示全部楼层
原帖由 路路通 于 2008-6-19 12:23 发表


你何时、何地需要再提取一下不就行了吗?搞不清谢兄要字体信息干吗,微软输入法有很多软件也是没有捕捉宿主控件的字体信息,你可以试试。



不是要在编辑器窗口的光标位置,显示和原来一样的字号吗?否则大小悬殊,就很难看了。
也就是模拟微软拼音那样的显示。

字体或者没那么重要,得不到也是没关系。但字体和字号信息似乎是一体的,得到字号时顺便得到了字体。
发表于 2008-6-19 12:38:27 | 显示全部楼层
你试一下BabelPad编辑器看看。
 楼主| 发表于 2008-6-19 12:54:27 | 显示全部楼层
原帖由 谢振斌 于 2008-6-19 12:35 发表



不是要在编辑器窗口的光标位置,显示和原来一样的字号吗?否则大小悬殊,就很难看了。
也就是模拟微软拼音那样的显示。

字体或者没那么重要,得不到也是没关系。但字体和字号信息似乎是一体的,得到字号时 ...


谢兄原来也是想模拟微软拼音那样的显示,上次是不是我说的不够清楚?BabelPad没用过,能不能取字号,这个不敢保证,但UltraEdit是绝对没问题的。这个UltraEdit比较难伺候,一般的方法光标会跟丢,字体信息你也取不到,但按我的方法肯定能行。我找过BabelPad试下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大中文系 ( 京ICP备12040209号

GMT+8, 2016-3-24 20:39 , Processed in 0.112507 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表