源码:
https://github.com/yxl/Android-OpenWnn/commits/master
https://github.com/yxl/Android-OpenWnn.git
https://code.google.com/p/openwnn-legacy/w/list
国内下载
http://handonghandong.iteye.com/blog/858467
http://dev.10086.cn/cmdn/wiki/index.php?doc-view-2689.html
http://www.opencvchina.com/forum-36-1.html
cd /cygdrive/e/source/InputMethod/Android-OpenWnn/
cd /cygdrive/e/source/InputMethod/PinyinIme/PinyinIme
VS2008绿色版
http://blog.csdn.net/yangluoning/article/details/17166511
Android PinyinIME 源码笔记
http://blog.sina.com.cn/s/blog_4177a2e20100lub8.html
http://blog.csdn.net/keanbin/article/details/17116585
深蓝词库转换是一款开源免费输入法词库转换工具,实现了各平台各种输入法的用户词库、网络词库(细胞词库、分类词库)之间的相互转换,用户不用再担心换输入法时积累的词库无法转移到新输入法了。
https://code.google.com/p/imewlconverter/
Trie
前缀树或字典树
http://zh.wikipedia.org/wiki/Trie
http://blog.csdn.net/v_july_v/article/details/6897097
dicttrie 是一个两层的辞典,严格说并不是树状结构,其中第一层是一个LmaNodeLE0类型的数组,在程序中是root_这个动态数组。每个元素如图 dicttrie.odg所示。第二层是一个LmaNodeGE1类型的数组,在程序中是nodes_ge1_这个动态数组,每个元素如图 dicttrie.odg所示。
其实这两个数组中是对应的汉语拼音,储存在spl_idx字段上,这个值是在spellingtrie生成时确定的,例如'ai'的spl_idx是 31,root_中包含了所有的汉字,并按照spl_idx排了序,以拼音'ang'为例(下面是含'ang'的所有词汇), spellingtrie生成时其spel_idx为33, 同音字个数为6个即 num_of_homo = 6,其son就是‘ang’的下一个字拼音不同的个数,经过观察可知,六个以'ang'开头的词的第二个字的拼音都不相同,所以'ang'的 num_of_homo = 6,在生成
dict的时候经过程序中相关算法的计算,得出‘ang’的son_1st_off = 391,
homo_idx_buf_off = 463, 即nodes_ge1_[391]为'ang'的first son,通过下面的观察应该知道nodes_ge1_[391].spl_idx 对应的是'da'的spelling_idx,经查证确实如此。关于homo_idx_buf_off的计算比较复杂,同音词都放在DictTrie的 lma_idx_buf_数组中。
醠 0.930130992851 1 ang
骯 1.34170755231 1 angs
昻 2.26727616676 1 ang
肮 15.7621930961 0 ang
盎 45.8593409192 0 ang
昂 1474.61550226 0 ang
昂达 257.3078729 0 ang da
昂贵 1036.37823089 0 ang gui
盎然 144.143005824 0 ang ran
肮脏 572.671468255 0 ang zang
盎司 171.831677206 0 ang si
昂扬 126.464093517 0 ang yang
举例说明汉语词是怎么在这样的字典中保存的
“爱美 393.063006485 0 ai mei”——这是汉字文件的原始数据,在生成dict的时候,会根据一些信息排序。'ai'的spelling_idx是31,经过映射,'ai'被保存在root_[2]中,root_[2]的信息如下:
son_1st_off = 87,homo_idx_buf_off = 85,spl_idx = 31,num_of_son = 69, num_of_homo = 49
在lma_idx_buf_[87]放着'ai'的第一个son,经检查是‘ai’,继续往下在lma_idx_buf_[87+29]的地方找到spl_idx=228的'mei',具体信息如下:
son_1st_off_l=0,homo_idx_buf_off_l=183,spl_idx=228,num_of_son=0,num_of_homo=2,son_1st_off_h=0,homo_idx_buf_off_h=0
son_1st_off_l=0说明其下没有son,也就是说'爱美'不是某个词的一部分,所以num_of_son=0。num_of_homo=2是因为,跟‘爱美’同音的一共是两个。
输入法的大概执行过程是这样的:
如果输入的是'zhe',经过splparser,在spellingtrie中找到其相应的spe_idx=428,再映射到usrdic的root层的第399个元素root_[399],具体信息如下,
son_1st_off = 43678,homo_idx_buf_off = 61612,spl_idx = 428,num_of_son = 118,num_of_homo = 49,
意思是有son 118个,同音字 49个,其第一个son在nodes_ge1_的下标是43678,其同音字在lma_idx_buf_的下标为61612*3(因为程序将每个同音字的id映射成三个字段),查找
lma_idx_buf_[61612*3], 经计算得到id=13819,一直到lma_idx_buf_[(61612+49)*3]都是‘zhe’的同音字,映射到相应的id后 在DictList的buf_[id]中取出这些汉字显示在屏幕上。