• 用Python写了个根据基本码表生成词组码表的工具


    『快码』码表生成工具

    建立一个基本的单字码表文件,使用UTF8格式保存为文本文件,中间用空格间隔,如base.txt:

    中 zlh
    华 hkgs
    人 rk
    民 mbg
    共 gtk
    和 hfl
    国 glah
    

    再建立一个要编码的词库文件,同样使用UTF8格式保存为文本文件,中间用空格间隔,如source.txt:

    中国
    共和国
    中华人民
    中华人民共和国
    

    然后运行这个程序。程序为python3所写,大家简单安装个python环境运行即可。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    #-------------------------------------------------------------------------------
    # Name:        mbtool
    # Purpose:     生成『快码』码表
    #
    # Author:      Garfield
    #
    # Created:     09-29-2022
    # Copyright:   (c) Garfield 2022
    # Licence:     <your licence>
    #-------------------------------------------------------------------------------
    
    # base_file = "base.txt"
    # source_file = "source.txt"
    des_file = "mb.txt"
    
    base_dic = {}
    source_dic = []
    des_dic = {}
    
    # 读入单字码表
    def init_base_dic(base_file):
        
        with open(base_file,'r', encoding='UTF-8') as fr:
            while True:
                lines = fr.readline()
                if not lines:
                    break
                wd = lines.split()
                base_dic[wd[0]] = wd[1]
    
        fr.close()
       
    # 读入待处理的词组
    def init_source_dic(source_file):
        
        with open(source_file,'r', encoding='UTF-8') as fr:
            while True:
                lines = fr.readline()
                if not lines:
                    break
                source_dic.append(lines.rstrip()) # rstrip()是为了却去除后面的换行
    
        fr.close()    
    
    # 获取单字的指定长度的编码
    def get_mb_one_word(w,count):
        try:
            v = base_dic[w]
            return v[0:count]
        except Exception as e:
            return "ERROR"
    
    # 获取词组的编码
    def gen_mb(word):
        # 双字,规则[12][12],即取第一个的第1和第2个编码,再取第二个字的第1和第2个编码
        if len(word) == 2:  
           return get_mb_one_word(word[0],2) + get_mb_one_word(word[1],2)  
        # 三个字,规则[1][1][12],即取第一个的第1个编码,再取第二个字的第1个编码,再取第三个字的第1和第2个编码
        elif len(word) == 3:  
           return get_mb_one_word(word[0],1) + get_mb_one_word(word[1],1) + get_mb_one_word(word[2],2)  
        # 四个字以上,规则[1][1][1]...[1],即取前三个的第1个编码,再取最后一个字的第1个编码
        elif len(word) >= 4:  
           return get_mb_one_word(word[0],1) + get_mb_one_word(word[1],1) + get_mb_one_word(word[2],1) + get_mb_one_word(word[len(word)-1],1)
        else:
           return "ERROR" 
        
    def main():
        init_base_dic("base.txt")
        init_source_dic("source.txt")
        
        # 要写入的码表文件
        fw = open(des_file,'w', encoding='UTF-8')
        
        # 错误处理
        fe = open("error.txt",'w', encoding='UTF-8')
        for w in source_dic:
            # 将编码写入文件,如果编码方案获取编码失败,则编码置为ERROR
            mb = gen_mb(w)
            # 如果编码时发生错误,则写到错误文件中
            if "ERROR" in mb:
                fe.writelines(w + '\n')
            else:
                fw.writelines(w + ' ' + mb + '\n')
            # print(gen_mb(w))
        fw.close()
        fe.close()
        
        print("成功生成码表文件!")
    
    if __name__ == '__main__':
        main()
    

    这样程序会生成一个mb.txt文件,UTF8格式保存为文本文件,中间用空格间隔:

    中国 zlgl
    共和国 ghgl
    中华人民 zhrm
    中华人民共和国 zhrg
    

    如果有无法编码的词组,会保存到error.txt文件中。(略)

    生成规则是这样(代码中有注释)

    双字,规则[12][12],即取第一个的第1和第2个编码,再取第二个字的第1和第2个编码
    三个字,规则[1][1][12],即取第一个的第1个编码,再取第二个字的第1个编码,再取第三个字的第1和第2个编码
    四个字以上,规则[1][1][1]...[1],即取前三个的第1个编码,再取最后一个字的第1个编码
    

    大家可以根据自己需要改写,生成的码表格式也可以自行调整,这里抛砖引玉,给大家个思路

  • 相关阅读:
    Golang的演化历程
    优秀的计算机编程类博客和文章
    NET Portability Analyzer
    NET SqlClient
    Razor模板引擎
    js资源
    依赖注入和控制器
    Vue.js 2.0 和 React、Augular
    过滤器
    Prism vs MvvmCross
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/16742038.html
Copyright © 2020-2023  润新知