用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個編碼

大家可以根據自己需要改寫,生成的碼錶格式也可以自行調整,這裏拋磚引玉,給大家個思路 😃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章