Python 处理输入法字库(五笔极点字库转小鸭字库)

一直都是用的小鸭五笔,091新字库是极点格式的,刚开始懒得动,直接用极点五笔了,用了一段时间碰到很多问题.其中最坑的是. 在tkinter Gui 里极点输入不能退格,一退格就乱码( )  ,我以为是我开发的程序有问题,调试了很久都找不到原因. 突然想到会不会是输入法问题,换个输入法就OK 了. 

赶紧把极点删了,新字库导出到小鸭五笔用.  不过小鸭五笔对 一个字词有多个编码的情况,会出两顺序和字库不一致的情况.字词的排序变了。  研究了一下小鸭的出词规律,发现可以通过删除一字多码的情况来修正. 一字多码,保留简码. 去掉一些非汉字码.越简单越好呀...

1.极点导出字库:

先整理成下面字典数据结构: 一个是字对多码,一个是码对多字.

然后通过这两个结构来整理.

最后整理成小鸭五笔的导入码表

代码如下:


#!/usr/bin/python
# -*- coding: gbk -*-

# conver.py
#
# Copyright (C) 2016 - xulong <fangkailove@yeah.net>
# python3
#

import sys
import os
import re
import json
#import sendkeys
#import win32con
#import win32ui
#import win32gui
#import time

#定义中文字符范围
area=[]
area.append(range(0x4E00,0x9FA5+1))		#基本汉字     20902字    
area.append(range(0x9FA6,0x9FEF+1))		#基本汉字补充 74字       
area.append(range(0x3400,0x4DB5+1))		#扩展A        6582字     
area.append(range(0x20000,0x2A6D6+1))		#扩展B        42711字    
area.append(range(0x2A700,0x2B734+1))		#扩展C        4149字     
area.append(range(0x2B740,0x2B81D+1))		#扩展D        222字      
area.append(range(0x2B820,0x2CEA1+1))		#扩展E        5762字     
area.append(range(0x2CEB0,0x2EBE0+1))		#扩展F        7473字     
area.append(range(0x2F00,0x2FD5+1))		#康熙部首     214字      
area.append(range(0x2E80,0x2EF3+1))		#部首扩展     115字      
area.append(range(0xF900,0xFAD9+1))		#兼容汉字     477字      
area.append(range(0x2F800,0x2FA1D+1))		#兼容扩展     542字      
area.append(range(0xE815,0xE86F+1))		#PUA(GBK)部件 81字       
area.append(range(0xE400,0xE5E8+1))		#部件扩展     452字      
area.append(range(0xE600,0xE6CF+1))		#PUA增补      207字      
area.append(range(0x31C0,0x31E3+1))		#汉字笔画     36字       
area.append(range(0x2FF0,0x2FFB+1))		#汉字结构     12字       
area.append(range(0x3105,0x312F+1))		#汉语注音     43字       
area.append(range(0x31A0,0x31BA+1))		#注音扩展     22字       
area.append(range(0x3000,0x303F+1))		#CJK 符号和标点 (CJK Symbols and Punctuation) 
area.append(range(0x0,0xFF))		        #           英文字母        

#中文标点符号
area.append([
0x3002,   #句号     。   
0xFF1F,   #问号     ?   
0xFF01,   #叹号      !   
0xFF0C,   #逗号     ,
0x3001,   #顿号     、   
0xFF1B,   #分号     ;   
0xFF1A,   #冒号     :   
0x300C,   #引号     「   
0x300D,   #       」   
0x300E,   #引号     『   
0x300F,   #       』   
0x2018,   #引号     ‘   
0x2019,   #       ’   
0x201C,   #引号     “   
0x201D,   #       ”   
0xFF08,   #括号     (   
0xFF09,   #       )   
0x3014,   #括号     〔   
0x3015,   #       〕   
0x3010,   #括号     【   
0x3011,   #       】   
0x2014,   #破折号     —   
0x2026,   #省略号     …   
0x2013,   #连接号     –   
0xFF0E,   #间隔号     .   
0x300A,   #书名号     《   
0x300B,   #       》   
0x3008,   #书名号     〈   
0x3009    #       〉 
]
)



#极点格式字库转为小鸭格式字库
def jd2xy_convert():
    context = ''
    with open('./freeime.txt','r',encoding='utf-16' ) as f:
        context=f.read()

    #取编码 a 到 yyyy
    rlt = re.findall(r'\n(a .*?)\nz',context,re.S)
    if len(rlt) == 1:
        context = rlt[0]


    #替换掉一些特殊标记
    context=context.replace('~','')
    context=context.replace('^','')
    context=context.replace('!','')


    #转换文本为对象
    lns = context.splitlines()
    bm_wd = {}#Key存编码,value以列表形式存对应的的字词
    wd_bm = {}#key存字忘,value以列表形式存对应的的编码
    for l in lns:
        l=l.strip(' ')
        lst=l.strip(' ').split(' ')
        bm_wd[lst[0]]=lst[1:]
        for i in range(1,len(lst)):
            if lst[i] in wd_bm.keys():
                wd_bm[lst[i]].append(lst[0])
            else:
                wd_bm[lst[i]]=[lst[0]]

    #同字的多码排序
    for bm in wd_bm:
        wd_bm[bm].sort()

    #输出保存方便检查
    with open(u'./1.编码对字.txt','w',encoding='utf-16') as f:
        f.write('{\n')
        for bm in bm_wd:
            f.write('%s:%s,\n'%(bm,str(bm_wd[bm])))
        f.write('}\n')
    with open(u'./1.字对编码.txt','w',encoding='utf-16') as f:
        f.write('{\n')
        for bm in wd_bm:
            f.write('%s:%s,\n'%(bm,str(wd_bm[bm])))
        f.write('}\n')

    will_remove=[]
    for ti in  range(4):
        for wd in wd_bm:
            #包含有不非汉字表字符,移除
            for c in wd:
                for r in area:
                    if ord(c) in r:break
                else:
                    for i in range(0,len(wd_bm[wd])):
                        will_remove.append((wd_bm[wd][i],wd,str(wd_bm[wd])))

            #汉字只有一个编码的,跳过
            if len(wd_bm[wd]) == 1:
                continue
            #七 a agci #花 a awci ,单字双码跳过
            if len(wd) == 1 and len(wd_bm[wd]) == 2:
                if wd_bm[wd][0] == wd_bm[wd][1][0] and wd_bm[wd][1][2:4]== 'ci':
                    continue

            #同字词有多编码,后码以前辍方式包含了前码的,剔除(针对二码字词,删除对应的三四码)
            for i in range(1,len(wd_bm[wd])):
                if wd_bm[wd][i].startswith(wd_bm[wd][i-1]) and len(wd_bm[wd][i-1]) < 3:
                    will_remove.append((wd_bm[wd][i],wd,str(wd_bm[wd])))
        for t in will_remove:
            if t[0] in wd_bm[t[1]]: wd_bm[t[1]].remove(t[0])
            if t[1] in bm_wd[t[0]]: bm_wd[t[0]].remove(t[1])


    with open('./2.删除的字码.txt','w',encoding='utf-16') as f:
        for t in will_remove:
            f.write('%s:%s %s\n'%(t))

    #清空无字词编码,并记录到文件
    with open('./3.空码.txt','w',encoding='utf-16') as f:
        bms =  list(bm_wd.keys())
        for bm in bms:
            if len(bm_wd[bm]) == 0:
                f.write('%s %s\n'%(bm,' '.join(bm_wd[bm])))
                del bm_wd[bm]

    with open('./9.转成功的小鸭字库.txt','w',encoding='utf-16') as f:
        f.write('[cmd:RefCode]\n')
        f.write('[cmd:RemoveAll]\n')
        f.write('[cmd:Info=Gnolux专用词库]\n')
        f.write(';------------------------------\n')
        for bm in bm_wd:
            f.write('%s %s\n'%(bm,' '.join(bm_wd[bm])))
        
def test_input():
    bm_wd=jd2xy_convert()
    for k in bm_wd:
        print(k,bm_wd[k])
        for i in range(1,len(bm_wd[k])+1):
            if (len(bm_wd[k])) == 1 and (len(k)==4):
                sendkeys.SendString('%s'%(k))
                print('%s'%(k))
            else:
                sendkeys.SendString('%s%d'%(k,i))
                print('%s%d'%(k,i))
                #time.sleep(0.5)
        sendkeys.UniKeyPress(win32con.VK_RETURN)
        #time.sleep(1)

        
        
if __name__ == '__main__':
    
    jd2xy_convert()
    #os.startfile('notepad.exe')
    #time.sleep(1)
    #w=win32ui.FindWindow(None,'无标题 - 记事本')
    #win32gui.SetForegroundWindow(w.GetSafeHwnd())
    #time.sleep(1)
    #test_input()


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxgnolux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值