请选择 进入手机版 | 继续访问电脑版

北大中文论坛 www.pkucn.com

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 126494|回复: 419
打印 上一主题 下一主题

《输入法编程漫谈》问答

[复制链接]
跳转到指定楼层
1
发表于 2008-6-9 15:45:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有问题的朋友可在这里发表。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
2
发表于 2008-6-9 18:01:21 | 只看该作者
我对自由拼音的字表和词表的结构感到模糊。
不知道,楼主有没有空细说?
3
 楼主| 发表于 2008-6-9 19:12:28 | 只看该作者

回复 2楼 的帖子

《自由拼音》的码表结构很复杂,作者当初设计码表时为了节省内存,作了特殊处理,初学者如果没有过硬的《数据结构》知识,很难理解和操作其码表。如果没有什么特殊原因,建议不要试图分析其码表。
    你的另一个问题也在这里回你:很抱歉,这段时间很多事情都忙不过来,除了与示例程序有关的问题外,其它的估计很难帮得上忙了。
4
发表于 2008-6-10 20:01:55 | 只看该作者
两个不同区域的数字键有什么区别?
5
 楼主| 发表于 2008-6-10 20:51:00 | 只看该作者

回复 4楼 的帖子

扫描码不同。
6
 楼主| 发表于 2008-6-11 14:36:44 | 只看该作者

回复 2楼 的帖子

今天有点时间,重看了一下《自由拼音》码表的短语部分,它的码表结构是这样的:

        短语的最大长度为8
        第一个字节是短语的长度
        第二字节是拼音音节序号的第9位
        拼音音节序号
        短语

        比较难理解的是第二个字节,为什么会有拼音音节的第9位,是什么意思呢?我们知道,一个字节的最多只能记录256个数,拼音音节有410多个,用一个字节不够,用两个字节又浪费,因此《自由拼音》采用9位来记录一个拼音音节,音节序号的第9位统一放在码表结构的第2个字节里。比如“三三龙”,短语的长度是3,san的序号大于255,龙的序号小于255,因此第二字节是00000011,在码表结构里就是这个样子:

短语长度  拼音音节的第9位  san的序号   san的序号  long的序号     三字的内码          三字的内码          龙字的内码
00000011    0000011             xxxxxxxx       xxxxxxxx      xxxxxxxx     xxxxxxxx xxxxxxxx  xxxxxxxx  xxxxxxxx  xxxxxxxx xxxxxxxx

        音节的序号可通过表查。采用这个结构,最大好处是可为码表减肥,节省内存,长度为8的短语,就可节省7个字节的内存。但缺点也是明显的,查找时,每次都要计算一番,最大的短语长度只能为8(当然可增加一个字节达到16)。如今PC的内存配置都是GB级了,不必再像当年那样为区区几个字节大费周章了。

       希望能对你有所帮助。
7
发表于 2008-6-11 15:21:12 | 只看该作者
表中的按键组合如“125”表示同时按下第1、第2和第5号键,“2345”表示同时按下“第2、第3、第4和第5号键,其余依次类推。实际应用中2个、3个、4个按键的组合用路路通键盘输入时,只需按一个按键就可完成输入。
===================================

不可思议

表中的按键组合如“125”表示同时按下第1、第2和第5号键
==============================================
实际应用中2个、3个、4个按键的组合用路路通键盘输入时,只需按一个按键就可完成输入。
===============================================
一键输入一字已经是天方夜谭了,一键输入三键的组合根本是办不到的,收录机发明已经多年了,还只能做到“125”表示同时按下第1、第2和第5号键
8
发表于 2008-6-11 15:24:18 | 只看该作者
我设计的词语信息结构,不保存拼音信息,因为每个单字都有拼音信息。
对于多音字,采取不同的内码表示。这样最大限度节约内存,又可以简化操作,提高处理速度。

目前不足之处是,不支持包含非汉字的短语。不过这可以用其他办法解决,如果需要时。
9
发表于 2008-6-11 16:55:57 | 只看该作者
我一直用的输入法,是自己在自由拼音源码上修改的。
但我只是想用哪部分才去改那部分,
现在见到楼主如此系统地讲解,颇为景仰。
10
发表于 2008-6-11 17:54:20 | 只看该作者
请问龙文中文平台的简繁通用是如何做到的?
例如:
1. 控制台=>地区及语言选项=>非 unicode 语言 -> 中文(PRC)
   安装声笔飞码试用 => OK.
   coolvv 的 coolime => OK
   龙文中文平台的输入法 => OK.

2. 控制台=>地区及语言选项=>非 unicode 语言 ->中文(台湾)
   声笔飞码 => fail.
   coolime => 无反应.
   龙文中文平台 => OK.

自己改写的输入法程式也一样, 只能选一种语言,不能通用。
11
发表于 2008-6-11 18:13:19 | 只看该作者
不知道有没有人想做输入法挂接程式, 假设名字 xyz,
它会 load ime.dll 再挂在真正的程式、例如 notepad.exe

32bit IME -> xyz32tsf32 => 变成 32 bit tsf 输入法
32bit IME -> xyz32tsf64 => 变成 64 bit tsf 输入法
(旧版的输入法孤儿有救了)
32bit IME -> xyz32ime64 => 变成 64 bit ime 输入法
(懒惰的工程师只需写一次 32 bit 输入法)
64bit TSF -> xyztsf64ime32 => 可以在 32bit XP 用 64 bit 的vista 输入法
(奇怪的用途)
32bit IME -> xyz32ime32 => 32 bit ime -> 32 bit ime.
可以偷偷换介面(skin), 改字型, 改 window 座标, 记录打字速度等等
12
 楼主| 发表于 2008-6-11 19:45:36 | 只看该作者

回复 8楼 的帖子

“对于多音字,采取不同的内码表示”
敢问谢兄,一个汉字用占用几个字节?如果是两个字节,好像最多只能表示两个读音,当然短语的字集在GB2312-80范围内是没问题的。
13
发表于 2008-6-12 09:44:28 | 只看该作者
原帖由 路路通 于 2008-6-11 14:36 发表
今天有点时间,重看了一下《自由拼音》码表的短语部分,它的码表结构是这样的:

        短语的最大长度为8
        第一个字节是短语的长度
        第二字节是拼音音节序号的第9位
        拼音音节序号
   ...


你太厉害了。
我几天都看不明白的地方,你看一下就知道了。
14
 楼主| 发表于 2008-6-12 12:32:12 | 只看该作者

回复 13楼 的帖子

几年前研究过,不过没什么印象了,重看一下是能够明白的。
输入法程序用到的位操作较多,如果这方面不过关的网友,最好补一下课。
15
发表于 2008-6-12 15:47:22 | 只看该作者
原帖由 路路通 于 2008-6-11 19:45 发表
“对于多音字,采取不同的内码表示”
敢问谢兄,一个汉字用占用几个字节?如果是两个字节,好像最多只能表示两个读音,当然短语的字集在GB2312-80范围内是没问题的。


我已经实现的系统是处理7万多汉字的。对于词语,我不储存拼音的。

不过,我把Ext-B汉字单独储存,而且目前也没有考虑Ext-B汉字构成的词语,所以:

(1)BMP汉字,每个汉字内码用2个字节,拼音2个字节(采用简单压缩便于分解,声介韵调,或声韵调,5+6+2共13bit,多余3bit另有用途),频度信息(目前用2个字节,必要时我考虑自动生成频度,不储存)。
(2)Ext-B汉字,内码-0x20000,得到16bit编码,然后类似BMP处理。
(3)多音字,用的是我自己扩展的内码,利用BMP空闲区域(韩语、PUA等都没用)分配新内码,需要对应原汉字,查映射表即可。
(4)词语,目前只有BMP汉字和频度。对于多音字,用得就是上述的扩展内码,所以我不需会浪费空间储存拼音。
(5)部件信息,我只储存二元拆分信息,从中派生出其他需要的信息。
(6)笔画信息,我还没写进去。计划是由部件信息自动生成,仅对于少数无法生成的字查表。
以上透露的信息,也算是给同行一点贡献吧。

我目前做出的输入法,约2M,压缩一下不到1M,包含15万基本词汇,计划进去的功能不会输给几十M的输入法。
当然如果日后增加外挂码表等功能,以及英中输入、字典能力、发声功能等等,可能会膨胀,但那些锦上添花的功能不迫切,有精力考虑时再说。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2016-10-18 23:00 , Processed in 0.120977 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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