open-gram词表协议改为Apache V2.0

经过社区的讨论,我们一致同意,将open-grame词表的协议改为Apache V2.0

  • 新的词库将以android-google-pinyin的词库为基础
  • 废弃之前基于cc-cedict的老词库,但是将open-gram自己发现/汇总的一些新词以Apache V2.0协议重新贡献给open-gram词表
  • libpinyin/novel-pinyin/smart-pinyin 项目lead已同意,将各自项目的词库,以Apache V2.0的协议贡献给open-gram项目
  • FIT团队同意将FIT输入法的网络热词,定期反馈给open-gram社区

非常感谢大家的支持和帮助!

SunPinyin的词库一直以来为大家所诟病,希望这次能为大家带来质量更好的词库,和更好的输入体验…

sunpinyin-2.0.3 released

在漫长的RC之后,sunpinyin社区release了2.0.3版本…

Quoted from sunpinyin.org:

2.0.3 release is containing a lot of major fix compare to last release. User should update to this release as soon as possible. It fixed many inconveniet bugs. Changes compare to 2.0.2 are described below:

Build:

  • CFLAGS, CXXFLAGS and LDFLAGS are recongnized.
  • Scons scripts now will remember the configuration arguments in configure.conf.
  • Ported to ARMEL architecture.
  • Able to build on FreeBSD.

libsunpinyin:

  • New LOGO!
  • History cache focus more on recent commits.
  • Supports --libdir and --libdatadir as configuration arguments.
  • Hunpin support. (Contributed by Hanjie Xu)
  • Fixed weird behavior of history with a single character.
  • Fixed a potential issue for candidate ranking.

ibus-sunpinyin:

  • Supports --libdir, --datadir, --execdir as configuration arguments.
  • Alt+num key as the candidate delete key for ibus-sunpinyin.
  • Able to build on IBus-1.4

xsunpinyin:

  • Synchronized the version between xsunpinyin and libsunpinyin project.
  • Fixed startup crash with empty directory.
  • Fixed position problem on multi-screen.
  • Fixed crash on exit, which caused history information lost.
  • Refact UI system
  • Added skin support
  • Fixed text overbound when pinyin are too long.
  • Fixed ignorance of ShuangPin setting.
  • Fixed weird behavior of fast switch to english. ( Issue 213 ).

scim-sunpinyin:

  • Add legacy support for scim (Thanks to liangguo)

FIT和SunPinyin展开全面合作

FIT和SunPinyin社区决定长期合作,联手制作下一个版本的FIT中文输入法。在合作中,FIT将使用SunPinyin的核心组件作为FIT的拼音输入引擎,完全替换掉旧版的fitx拼音引擎。新的拼音引擎将应用在FIT的Mac版、iPhone版和即将推出的iPad版。

对SunPinyin社区来说,SunPinyin的Mac版本将不会作为社区的工作重心,从而将更多的将精力集中到引擎、算法本身的改进中去,并全力协同FIT整合sunpinyin的输入引擎。FIT团队也会积极参与到引擎的改进和完善中,并将会负责SunPinyin-for-Mac的用户支持工作。SunPinyin-for-Mac依然遵循CDDL+LGPLv2.1,合作并不会妨碍任何有兴趣改进/完善它的朋友,贡献自己的努力。

另见FIT官方网站的声明

FAQ:

Q0. 为什么会有此次合作,这次合作有得到所有sunpinyin贡献者的认可吗?

应该说FIT和SunPinyin-mac是mac平台上使用最广泛的free的拼音输入法,FIT的开发团队长于前端功能以及用户体验上的开发,sunpinyin社区长于输入引擎的算法。两个团体的合作,会融合两者的长处,打造更好的mac平台以及iOS平台上的拼音输入法。

关于合作的事宜,sunpinyin社区主要的、活跃的contributors,有经过详细的讨论,大家都充分表达了各自的意见;多数contributor都支持这一合作。

Q1. sunpinyin-mac被放弃了么?

我更愿意将其解读为,FIT放弃了其自身的拼音引擎,转而采用sunpinyin的输入引擎;同时FIT团队也会积极参与到引擎的改进和完善的工作中,以及支持原有的sunpinyin-mac用户。sunpinyin的社区力量相比来说更加壮大了。sunpinyin-mac依然遵循CDDL+LGPLv2.1,合作并不会妨碍任何有兴趣改进/完善它的朋友,贡献自己的努力。

Q2. sunpinyin和fit的合作是因为收到Goopy的压力么?

fit和sunpinyin的合作意向,在Goopy“泄露”之前就已经达成了。sunpinyin的主要贡献者,基本上都是纯粹为了爱好和兴趣,我们的目标一直是,做最好的、开源的拼音输入法;Goopy的压力只会成为我们的动力,激励我们继续努力 :)

发布SunPinyin-MacOS-2.0.2.1008 (10.5/10.6)

本次更新的主要内容包括:

  1. 加入了关闭/打开内模糊切分的选项
  2. 加入了使用backspace取消用户选择的选项
  3. 升级系统词库和语言模型至open-gram 0.1.22
  4. 解决了Sparkle升级时无法打开安装包的问题
  5. 加入了小鹤双拼方案的支持
  6. bugfixes若干

功能方面和上次在twitter上放出的RC版本,没有什么不同,主要是将数据文件更新至了open-gram 0.1.22。虽然Sparkle升级时无法打开安装包的问题已经解决,但是得等到下一次更新的时候才能起作用;所以,烦请大家不要通过自动升级来安装,而是直接下载pkg包来安装 …

欢迎大家下载试用

导入sogou输入法的细胞词库

首先请下载这个导入工具,解压缩到某个目录中。从pinyin.sogou.com下载细胞词库(scel格式),保存在某个目录中。然后在terminal中执行下面的操作:

$ python import_sogou_celldict.py PATH_TO_CELL_DICT.scel

感谢中文社区其他开发者和项目reverse engineering的工作,

发布 SunPinyin-MacOS-2.0.2 (10.5/10.6)

本次更新主要是对2.0.2-beta-1进行了一些修正,加入了“声母简写(z/c/s->zh/ch/sh)”的选项,也加入了全角空格的支持(尚未支持全角小写字母)。

从2.0.2开始,SunPinyin 2 for Mac 全面采用了open-gram的词库和语言模型,因此会导致您的history cache无效,您可以在执行完安装程序之后,手工删除现有的history cache文件($ rm ~/Library/Application\ Support/SunPinyin/history)。另外一个重大的更改是,扩大了wordID的范围,使系统词库+用户词库的理论容量可以达到2^24,您现在可以放心导入比较大的个人词库了。不过这也导致了和2.0/2.0.1的词库格式不相兼容。

正是由于上面两个原因,2.0.2的安装包中,直接包括了lm_sc.t3g.le和pydict_sc.bin.le的二进制数据文件,大家可以直接安装就好。另外,sunpinyin_importer中的系统词表也更新为open-gram的词表了。

对于power的mac用户来说,我们已经解决了大端数据的生成问题,请在安装时下载相应的数据文件 ... 另外,非常抱歉的是,sparkle自动升级的问题还没有来得及解决,请大家不要通过自动升级来安装,而是直接下载pkg包来安装 ...

欢迎大家下载试用 ...

更新SunPinyin-MacOS-2.0.2 beta 1 (10.5/10.6)

本此更新的主要内容包括:

  1. 为全拼切分器加入了模糊切分的功能,即根据上下文将fangan自动切分为fang'an或fan'gan。
  2. 为双拼加入了南方模糊音的功能。
  3. 将删除用户自造词的快捷键改为ctrl+command+num,以避免和Space的快捷键相冲突。

上述的一些功能,虽已大体稳定,但尚未经过严格的测试;另外还有其他一些bug fixes,也计划在2.0.2中加入。欢迎有兴趣尝鲜的朋友下载试用,SunPinyin-MacOS-2.0.2-beta1.zip。已安装2.0/2.0.1版本的朋友,无需删除已安装的版本,直接运行安装程序即可。

首次安装的朋友请注意,当安装程序进行到“下载数据文件”步骤时,请点击“开始…”按钮下载必要的数据文件(文件较大,可能比较耗时)。

SunPinyin-2.0模糊音节切分的实现

模糊切分,即根据上下文,将有歧义的拼音字符串进行自动切分,例如,将fangan切分为fang'an或fan'gan。这是许多现代拼音输入法都具备的功能。SunPinyin的ime-core本身具有搜索多种切分组合的能力,只要在buildLattice时,保证传入的segments是按照起始位置(m_start)排好顺序的即可。

那么首先要解决的问题就是,根据得到的最佳句子,反查到对应的切分序列。例如,最佳句子是“我的方案获得通过”,可以推得“wo'de'fang'an'huo'de'tong'guo”。

我们为TLexiconState加入了m_seg_path的成员,用来记录这个LexiconState对应的切分路径,例如我们有一个lexiconState对应是上例中的fang'an,其切分路径是[4, 8, 10]。然后,为CLatticeState加入了m_pLexiconState成员,用来记录之前transfer时所引用的那个lexiconState。这样,在backTrace最佳句子的时候,就可以得到对应的音节了。由于易混淆音(即z<->zh)的存在,一个seg_path可能对应多个syllable_paths(m_syls);但是最后在存入用户词典时,必须要知道真实的syllables,所以没有采用TLexiconState结构包含一个seg_path、和多个syllable_paths的方案。

接下来,就是该如何产生模糊切分的了。我们为CPinyinData类加入了一些额外的table,这些table都是使用pinyin_data.py脚本生成的。包括fuzzy_finals_map,这是为处理型如xian->xian/xi'an的模糊切分的;以及fuzzy_pre_syllables和fuzzy_pro_syllables,分别代表可能产生切分歧义的前一个音节和后一个音节。经过pinyin_data.py的筛选,发现只有“r/g/n”三个声母,可能作为前一个音节的结尾,或后一个音节的声母。

接下来,我们为CQuanpinSegmentor加入了一个新的helper functor,CGetFuzzySegmentsOp。这个助手类的输入是主切分器(即基于double-array trie的、改良的、最大后向匹配算法)所得到的segments;输出是,其对应的模糊切分segments。这个寻找模糊切分的过程,和切分器的主过程是平行的。但是,我们并不是简单的每次输入都从头到尾扫描一遍。

首先,根据主切分序列的最后一个segment(记为seg),invalidate那些受影响的fuzzy segments。在我们目前的实现中,fuzzy_segs中的模糊切分都是成对出现的,我们从后向前一对一对的进行筛选,只有当某一对的右边界(r),小于或等于seg的起始位置,才能够保留下来。然后,我们仅需要对主切分的最后一个切分(如果是xian的情况),或最近两个切分(如果是fangan的情况),进行处理。然后小心地调整好updatedFrom的值,并返回给CQuanpinSegmentor::_push()。

因此,如果输入xian,会生成xian和xi'an的两种切分,如果继续输入一个a,则会得到xia'na和xian'a,而不会包括xi'an'a这个切分了。主切分器的最后一个segment(即na),会先将xi'an给invalidate掉;然后辅助切分器会将xian'a加入到fuzzy_segs中。从这一点来说,我们和google和sogou输入法的处理仍然有所不同,他们都会保留xi'an'a这个切分。

我个人的感觉,sogou和google输入法每次在追加或删除一个拼音字符时,都是会从头进行一遍扫描处理;其间处理了各种情况,包括易混淆音,自动就错,和模糊音节切分等。而SunPinyin的push/pop操作,尽可能少的对拼音字符串进行扫描和匹配,应该来说效率要高一些。而且,我感觉目前的这种实现方式,也基本满足大家的需要了。:)

返回到_push方法之后,如果设置了易混淆音,就对m_fuzzy_segs的最后两个segments,加入易混淆音。无论之前是否已经加入过易混淆音,CQuanpinSegmentor::_addFuzzySyllables都会先将seg.m_syllables resize为1,即清空了之前的易混淆音。

最后,在getSegments()时,将m_fuzzy_segs和m_segs合并到m_merged_segs中,并按照m_start排好顺序,返回给外层的调用者。我们今后可能会改进这部分,其实m_segs和m_fuzzy_segs都是有序的,只要让CIMIContext::buildLattice可以按照m_start的顺序,同时迭代这两个有序的vector就可以了。

还有其他的一些辅助的修改,例如,CIMIContext::getCandidates的循环退出条件不同了,导致我们现在迭代的次数会明显增多了,需要想一些更好的解决方法。