LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: trotsky

四种拼音输入法的比较以及拼音输入法开发[讨论篇]

[复制链接]
发表于 2003-6-23 19:50:58 | 显示全部楼层
最初由 stormful 发表
简单看了一下。呵呵,太困难了。好多单词不懂。不过好像只是拼音的内容呀。这没有什么用处。有文本的字典么?如果有人能搞一个文本的字典,无论多复杂的结构都是有办法的。

看来汉字输入法的数据来源真是太困难了。如果有一个文本的字典,常用词就太好统计了。而且有主谓宾动属性。实现逼进微软拼音的整句输入只是时间问题了。


Unihan.txt 的格式很简单呀。

grep ^U+.*kMandarin Unihan.txt

就可以得到所有的拼音了。每行前面的 U+xxxx 是汉字的 Unicode 编码。kMandarin 后面的就是拼音。
发表于 2003-6-23 19:51:32 | 显示全部楼层
呵呵,你有些太心急了。我现在只是在汉字的多种匹配阶段。还没有到达词法分析阶段。现在,这个问题我可没法和你讨论。因为,只是在2天前由于和你讨论才勾起我对整句或者暂时整句输入的兴趣。

呵呵,慢慢来。
发表于 2003-6-23 19:52:35 | 显示全部楼层
最初由 james_su 发表
Unihan.txt 的格式很简单呀。

grep ^U+.*kMandarin Unihan.txt

就可以得到所有的拼音了。每行前面的 U+xxxx 是汉字的 Unicode 编码。kMandarin 后面的就是拼音。


呵呵,我现在要的不是拼音。这已经不能满足我了。我要的是字或词的属性。
发表于 2003-6-23 20:01:06 | 显示全部楼层
我现在,在想。这些属性对于任何个人或公司来说都太庞大了。是否紫光拼音使用的只是简单的Next-ONE?
发表于 2003-6-23 22:23:51 | 显示全部楼层
最初由 stormful 发表
呵呵,我现在要的不是拼音。这已经不能满足我了。我要的是字或词的属性。


字或词的属性好办,但关键是算法。
发表于 2003-6-24 06:56:28 | 显示全部楼层
最初由 james_su 发表
字或词的属性好办,但关键是算法。



算法嘛,呵呵现在还没有。不过可以去研究嘛。就算研究不出新鲜的东西,也可以去研究现有的技术嘛。

楼上所说的那个“去海南”的例子就非常有趣。我的系统下“去海南”这个词被覆盖了。我就用“去北京”来描述一下。在第一次键入q'b'j的时候,显示“情报局”。然后键入qu'bei'jing,显示“去北京”。就算以前键入过多少次的“背景”这个词,在这种情况下也会显示“去北京”。然后再键入q'b'j,这是就可以看到“去北京”了。显然这时候“去北京”就已经变成了用户词组了。

做了上面的试验,我感觉“紫光”确实有Next-ONE。紫光在Windows下的安装目录是c:\windows\system32\ime\Unispim,它的用户词库保存在C:\Documents and Settings\用户名\Application Data\Unispim中。用户词库的名字是USRWL.DAT,很有意思的是它非常大,有1.2M。这个大小和它的系统目录下的SYSWL.DAT相当。如果WL是word library的缩写的话,可以推测出它的某些管理机制。在它的系统目录下有一个更大的文件BCOC.DAT,它也是紫光安装目录中最大的一个文件。如果BCOC这个缩写表示:back char of char的话,呵呵,就有意思了。

奇怪的是在紫光安装目录的一个文件hzfreq.dat,它只有35344字节。从名字上看它是汉字词频文件。但这个文件也太小了。如果按每单元4个字节算它只有8836个单元。就算是每单元2个字节,也覆盖不了GBK呀。看来它可能只统计了GB的词频。

你说的那个“我抡起斧头砍了下去”的例子就更有趣了。

紫光的结果如下:    涡轮起伏偷看下去。
微软拼音的结果如下:沃伦奇斧头砍下去。

如果给紫光造一个词“抡起”,而且只输入wo'lun'qi'fu'tou'kan'xia的话结果就非常接近了,其结果是“我抡起斧头砍了下”。但一旦输入最后一个qu的话,紫光又回到了最初的结果。

看来紫光确实不具有整句输入特点,它甚至没有语法分析能力。而微软拼音确实是整句输入的,呵呵,但实现得也不怎么样。

紫光的算法应该不是很复杂。在研究了现有的这些例子后,我做了一个简单的推测:紫光有可能在词组的匹配上是“倒序”的。否则,它不应该随着输入的增加而改变前面的结果。在匹配中,如果实在匹配不成功,它会向前跳一个拼音token,并用一个汉字补齐,然后继续匹配。在这个过程中Next-ONE控制了候选词的词频。

你真得有汉字和词组得属性信息么?能提供给我一个么?我现在还不能保证用这些信息能产生什么样得结果。但我会用他们进行大量得统计工作。这样就能找到汉语语法得很多规律性得东西。或许微软有很多语言学家,呵呵,但我也有程序员自己得办法。最终得结果还真不一定比他们差。
发表于 2003-6-24 09:23:34 | 显示全部楼层
关于紫光的文件列表,这里有个说明, 来自红旗里面的紫光输入法。

紫光拼音输入法3.0 for Linux
引擎与用户端界面软件开发说明

last updated 2002-8-26, Copyright (c) Thunisoft Co. Ltd.
===============================================================================

引擎
---------

输入法引擎实现按键信息到拼音汉字搜索功能。在对按键信息的处理过程中,
输入法引擎自己维护拼音串与候选字词,并在键入返回键(空格)的时候,获得
最终的输入结果串。

引擎程序:upimd
使用:
        Usage: upimd [options]
        Options:
          -start             : startup engine daemon
          -start [directory] : startup engine daemon, specify config/wordlib path
          -start -logmsg     : startup engine daemon, log engine message
          -stop              : stop engine daemon
          -version           : show version information
          -? or -help        : show this usage help

使用命令行“upimd start|stop”启动、停止输入法引擎。

引擎使用的默认配置文件、用户词库与数据文件目录为“/usr/local/unispim/”。


相关文件
----------

upimd                        引擎主程序
unispim.conf        输入法配置信息文件
chnsym.ini                中文符号定义文件
spewords.ini        特殊字词与短语定义文件
unispimsp.ini        双拼编码定义文件
unispimsp.ksc        双拼编码定义二进制文件,根据unispimsp.ini生成
                                如果修改了unispimsp.ini,可删除该文件,下次引擎启动时自动生成
syswl.dat                系统词库文件
usrwl.dat                用户词库文件,可重新从syswl.dat复制一份初始的
bcoc.dat                智能组词数据文件
hzfreq.dat                单字字频信息文件
hzcache.dat                单字缓存信息文件,第一次使用时生成


用户端界面软件开发
--------------------

用户端界面软件调用API接口:
头文件:upimagent.h - 函数原型与函数说明,常量定义
库文件:upimagent.o

示例文件:
upimdemo.cpp

示例文件运行:
启动引擎:upimd start
运行示例文件:upimdemo,按Ctrl-C退出
停止引擎:upimd stop

主要API说明:
upimSelect                输入法开关函数,用户端软件首先需要调用此函数连接引擎
upimSetContext        重置输入法上下文,第一次调用upimSelect(TRUE)时不需要调用此函数
upimOnKey                发送按键信息给输入法引擎
upimicGetProperty/upimicSetProperty        输入法上下文属性读取/设置
upimicInputString        取得输入法返回串
upimicCompString        取得输入拼音串(Compose)
upimicCandString        取得候选字词串(Candidate)

其它:
用户端界面的库中(upimagent),使用消息队列与输入法引擎进行通信,如有必要,
增加系统的消息队列最大数限制(MSGMNI)。


输入法设置文件说明
--------------------
主要设置文件:unispim.conf
用户端界面程序通过读写unispim.conf读取/设置输入法相关属性。
如果在打开状态下设置了新的属性,则应该调用upimSetContext通知引擎重新读入设置。

设置说明:
#默认情况下,1表示TRUE,0表示FALSE
输入风格=0或者1,0为输入拼音串后按空格,1为即敲即现
用字母键选择候选字词=0或者1
使用双拼输入=0或者1
双拼输入时显示提示信息=0或者1
动态调整词频=0或者1
自动隐藏低频词=0或者1
动态调整字频=0或者1
最近输入字优先=0或者1
每页最多候选个数=3-9,缺省为5
中英文输入切换键=0或者1,0使用Shift,1使用Ctrl
回车键定义=0或者1,0为输入结果串,1为输入英文串
多个候选翻页键=0、1、2,0使用(,)和(.),1使用(-)和(+),2使用([)和(])
输入第二第三候选字词键=0或者1,0使用左右Shift,1使用左右Ctrl
以词定字选字键=0、1、2,0使用(,)和(.),1使用(-)和(+),2使用([)和(])
支持GBK大字符集=0或者1
输入简体汉字=0或者1,1为输入简体,0为输入繁体
智能组词=0或者1
智能组词自动记忆=0或者1
按前次输入动态调整字序=0或者1
数字后跟随英文符号=0或者1
记忆并可输入最近输入过的字词=0或者1
中文符号=0或者1
打开时默认为英文输入状态=0或者1
v状态可输入空格=0或者1,如果设置为1,v状态用回车键输入整个串
声母模糊音设置=x,x为以下的或组合,例如7表示设置了z=zh,c=ch,s=sh
        0x01        z=zh
        0x02        c=ch
        0x04        s=sh
        0x08        l=n
        0x10        k=g
        0x20        f=h
韵母模糊音设置=x,x为以下的或组合
        0x01        an=ang
        0x02        en=eng
        0x04        in=ing
        0x08        ian=iang
        0x10        uan=uang


#以下为兼容Windows的相关设置
光标跟随=0或者1
软键盘索引=0
软键盘开关键=a-z,表示Ctrl+Shift+开关键
发表于 2003-6-24 18:45:53 | 显示全部楼层
呵呵,看来今天这里非常冷清。

在这里我要说几句感谢词。

感谢james_su的帮助。和你的讨论终于让我理解了智能匹配的含义,让我开了翘。这也激起了我对它的兴趣。今天,我终于完成的词组分拣的功能。我不知道原来的结构是否够用,因此在内存中实现了部分索引功能。拿阿甘正传中的一句话来描述我现在的心情应该是非常准确的,“我终于和上帝和解了。下一步我要做的可能就是真正的智能匹配了。不过我认为智能匹配这个词太容易混淆,我想应该使用智能分拣这个词。

感谢penny的帮助。感谢你的“去海南”。以前我在看紫光的文档时它就提到了Next-ONE能力,但我始终怀疑。现在通过“去海南”我终于验证了自己的怀疑是错误的。感谢你今天提供的紫光在Linux下的信息。由于我使用的是FreeBSD,能不能提供一些紫光在Linux下的资源统计信息。比如内存和CPU情况。测试CPU可以通过反复算便键入一些随机的内容得到。

其实,我现在的目标是测试一种半整句输入法。我感觉在算法级上clone一个紫光不是达不到的目标。我期望能更深入一点的研究。

我现在最缺少的是基础资料。无论是某个拼音串还是成M的字典都有可能产生意想不到的效果。我期望有人说说他喜欢的拼音是什么样子的。

我需要的资料都是为了去生成算法,而不会去发布。应该不会有什么版权问题。

这个程序只是以测试为目标的。

总之,我期望有人能帮助我完成这件事情。
发表于 2003-6-25 11:23:41 | 显示全部楼层
fcitx可以让非ROOT用户,在英文环境下输入中文!
其他输入法估计连其中一项都达不到。
发表于 2003-6-25 11:34:37 | 显示全部楼层
最初由 wangxiaohu 发表
fcitx可以让非ROOT用户,在英文环境下输入中文!
其他输入法估计连其中一项都达不到。


你这是纯搞笑吧。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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