IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python 整合 98五笔词库到新世纪五笔中并编码 -> 正文阅读

[Python知识库]Python 整合 98五笔词库到新世纪五笔中并编码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# d.py

from itertools import islice
import time

# wubixinshiji.dict.yaml https://github.com/GuoBinyong/wubixinshiji
NCTPATH = './wubixinshiji.dict.yaml'



# 读取新世纪五笔码表
def read_code_table():
    nc_ct = {}
    with open(NCTPATH, 'r', encoding='utf-8') as f:
        # 按行读取
        for line in islice(f.readlines(), 81, None):
            str = line.strip().split('\t')
            nc_ct[str[0]] = str[1]
    f.close()
    print("已读取新世纪码表, 共有 %d 项 " % len(nc_ct))
    return nc_ct

# 读取新世纪五笔码表为 list 
def list_code_table():
    list_nc_ct = []
    with open(NCTPATH, 'r', encoding='utf-8') as f:
        # 按行读取
        for line in islice(f.readlines(), 81, None):
            str = line.strip().split('\t')
            # 元组哦
            tmp=(str[0], str[1])
            list_nc_ct.append(tmp)
 
    f.close()
    print("已读取新世纪码表, 共有 %d 项 " % len(list_nc_ct))
    return list_nc_ct

# 生成新世纪五笔单字码表
def single_table():
    single_ct = {}
    rc=0
    dc=0
    cc=0
    with open(NCTPATH, 'r', encoding='utf-8') as f:
        # 按行读取
        for line in islice(f.readlines(), 81, None):
            # 分割行 str:['工','a','99454797','aa']
            str = line.strip().split('\t')
            # 检测第一段的长度,是否为单字
            if len(str[0]) == 1:
                # 检测编码是否为独码
                if len(str[1])>1:
                    if str[0] not in single_ct:
                        single_ct[str[0]] = str[1]
                    else:
                        rc+=1
                else:
                    dc+=1
            else:
                cc+=1
    f.close()

    print("忽略 82 行,删掉词语 %d 条,独码 %d 条,重复 %d 条,已生成单字码表共有 %d 项" %(cc,dc,rc,len(single_ct)))
    return single_ct


# 全局读一次,减少开销
NCT = read_code_table()
listNCT=list_code_table()
SCT = single_table()


# 比对 98 五笔词库和新世纪五笔码表,新世纪五笔码表中没有的保存到文件
def filter_code_table(table_path):
    dt = {}
    # 读取行数
    lc = 0
    # 新世纪五笔码表中已经存在项计数
    hc = 0
    # 单字数量
    sc = 0
    # 打开 98 五笔词库 从第25行开始
    with open(table_path, 'r', encoding='utf-8') as f:
        # 从第24行开始读取
        for line in islice(f.readlines(), 24, None):
            # 分割
            str = line.strip().split('\t')
            # 取出字串列表的第一个元素 汉字,是否在新世纪五笔码表中
            if str[0] not in NCT:
                # 检测 长度是词语吗?
                if len(str[0]) > 1:
                    dt[str[0]] = str[1]
                else:
                    sc += 1
            else:
                hc += 1
            lc += 1
    f.close()

    # 写入文件,追加方式
    with open(u'./out.txt', 'a+', encoding='utf-8') as o:
        # 遍历 dict 此处只有一对数据
        for key, value in dt.items():
            o.write('%s\t%s\n' % (key, value))
    o.close()

    print("处理词库文件 %s 完毕, 共处理 %d 行, %d 个项已经存在于新世纪五笔码表中, 保存了 %d 行,舍弃了 %d 个单独字符。" % (table_path, lc, hc, len(dt), sc))


# 查询单字编码
def query_code(s):
    if s in SCT:
        return SCT[s]


# 根据汉字查找 新世纪五笔 的编码
def get_code(str):
    len_str = len(str)
    if len_str == 1:
        return query_code(str)

    if len_str == 2:
        # 取索引 第一个字符 第二个字符
        f = str[0]
        s = str[1]
        fc = query_code(f)
        sc = query_code(s)
        return fc[:2] + sc[:2]

    if len_str == 3:
        s1 = str[0]
        s2 = str[1]
        s3 = str[2]

        s1c = query_code(s1)
        s2c = query_code(s2)
        s3c = query_code(s3)

        return s1c[0] + s2c[0] + s3c[:2]

    if len_str > 3:
        s1 = str[0]
        s2 = str[1]
        s3 = str[2]
        se = str[len_str - 1]

        s1c = query_code(s1)
        s2c = query_code(s2)
        s3c = query_code(s3)
        sec = query_code(se)
        return s1c[0] + s2c[0] + s3c[0] + sec[0]

def take_second(e):
    return e[1]

if __name__ == '__main__':
    start = time.time()
    
    filter_code_table('./wubi98_ci.dict.yaml')
    filter_code_table('./wubi98_S.dict.yaml')
    filter_code_table('./wubi98_U.dict.yaml')

    new_code_table = {}
    lc = 0
    cc = 0
    final_code_table=[]
    with open(u'./out.txt', 'r', encoding='utf-8') as f:
        for line in f:
            # 分割
            str = line.strip().split('\t')
            # 给汉字编码 此处会过滤掉重复 key
            new_code_table[str[0]] = get_code(str[0])
            lc += 1
    
    # 将筛选出来的词语添加到新世纪五笔词库中
    for n in listNCT:
        final_code_table.append(n)
    
    for key,value in new_code_table.items():
        m=(key,value)
        final_code_table.append(m)

    # 按编码排序
    final_code_table.sort(key=take_second)

    f.close()
    # 输出汉字和编码写入文件
    with open(NCTPATH, 'r', encoding='utf-8') as f,open(u'./sorted.txt', 'w', encoding='utf-8') as o:
        for line in islice(f.readlines(), 0, 81):
            # 写入文件头
            o.write(line)
        for c in final_code_table:
            o.write('%s\t%s\n' % (c[0], c[1]))
            cc+=1

    print("新世纪五笔原有 %d 条,新添加了 %d 条,整合后为 %d 条,从98五笔词库中提取了 %d 条词语(未查重),现写入 %d 条词语。" % (len(listNCT),len(new_code_table),len(final_code_table),lc, cc))


    end = time.time()
    print("程序用时:%fs" % (end - start))

程序输出

已读取新世纪码表, 共有 107396 项 
已读取新世纪码表, 共有 112061 项 
忽略 82 行,删掉词语 79459 条,独码 25 条,重复 4491 条,已生成单字码表共有 28086 项
处理词库文件 ./wubi98_ci.dict.yaml 完毕, 共处理 108547 行, 92410 个项已经存在于新世纪五笔码表中, 保存了 16047 行,舍弃了 90 个单独字符。
处理词库文件 ./wubi98_S.dict.yaml 完毕, 共处理 73011 行, 64295 个项已经存在于新世纪五笔码表中, 保存了 8715 行,舍弃了 1 个单独字符。
处理词库文件 ./wubi98_U.dict.yaml 完毕, 共处理 100477 行, 32351 个项已经存在于新世纪五笔码表中, 保存了 0 行,舍弃了 68126 个单独字符。
新世纪五笔原有 112061 条,新添加了 16072 条,整合后为 128133 条,从98五笔词库中提取了 24762 条词语(未查重),现写入 128133 条词语。
程序用时:0.481324s
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:19:48  更:2021-08-21 15:21:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:25:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码