背景介绍:将搜狗词库中 .scel 文件转化为 .txt 文件

  1. 搜狗词库链接:https://pinyin.sogou.com/dict/
  2. 搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母)找出其每部分的偏移位置即可,主要两部分:

    2.1 全局拼音表,貌似是所有的拼音组合,字典序 格式为(index,len,pinyin)的列表 index: 两个字节的整数 代表这个拼音的索引 len: 两个字节的整数 拼音的字节长度 pinyin: 当前的拼音,每个字符两个字节,总长len

    2.2 汉语词组表 格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表 same: 两个字节 整数 同音词数量 py_table_len: 两个字节 整数 py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引

      word_len:两个字节 整数 代表中文词组字节数长度word: 中文词组,每个中文汉字两个字节,总长度word_lenext_len: 两个字节 整数 代表扩展信息的长度,好像都是10ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0{word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表
  3. struct函数 -- struct.pack()和struct.unpack()

    在转化过程中,主要用到了一个格式化字符串(format strings),用来规定转化的方法和格式。

    3.1 struct.pack(fmt,v1,v2,.....)

      将v1,v2等参数的值进行一层包装,包装的方法由fmt指定。被包装的参数必须严格符合fmt。最后返回一个包装后的字符串。

    3.2 struct.unpack(fmt,string)

      顾名思义,解包。比如pack打包,然后就可以用unpack解包了。返回一个由解包数据(string)得到的一个元组(tuple), 即使仅有一个数据也会被解包成元组。其中len(string) 必须等于 calcsize(fmt),这里面涉及到了一个calcsize函数。struct.calcsize(fmt):这个就是用来计算fmt格式所描述的结构的大小。 格式字符串(format string)由一个或多个格式字符(format characters)组成,对于这些格式字符的描述参照Python manual如下:

Format C Type Python
x pad byte no value
c char string of length
b signed char integer
B unsigned char integer
h short integer
H unsigned short integer
i int integer
I unsigned int long
l long integer
L unsigned long long
q long long long
Q unsigned long long long
f float float
d double float
s char[] string
p char[] string
P void * integer

下面给出 Python 代码:


import struct
import os# 拼音表偏移,
startPy = 0x1540;# 汉语词组表偏移
startChinese = 0x2628;# 全局拼音表
GPy_Table = {}# 解析结果
# 元组(词频,拼音,中文词组)的列表
GTable = []# 原始字节码转为字符串
def byte2str(data):pos = 0str = ''while pos < len(data):c = chr(struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0])if c != chr(0):str += cpos += 2return str# 获取拼音表
def getPyTable(data):data = data[4:]pos = 0while pos < len(data):index = struct.unpack('H', bytes([data[pos],data[pos + 1]]))[0]pos += 2lenPy = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]pos += 2py = byte2str(data[pos:pos + lenPy])GPy_Table[index] = pypos += lenPy# 获取一个词组的拼音
def getWordPy(data):pos = 0ret = ''while pos < len(data):index = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]ret += GPy_Table[index]pos += 2return ret# 读取中文表
def getChinese(data):pos = 0while pos < len(data):# 同音词数量same = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]# 拼音索引表长度pos += 2py_table_len = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]# 拼音索引表pos += 2py = getWordPy(data[pos: pos + py_table_len])# 中文词组pos += py_table_lenfor i in range(same):# 中文词组长度c_len = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]# 中文词组pos += 2word = byte2str(data[pos: pos + c_len])# 扩展数据长度pos += c_lenext_len = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]# 词频pos += 2count = struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]# 保存GTable.append((count, py, word))# 到下个词的偏移位置pos += ext_lendef scel2txt(file_name):# 分隔符print('-' * 60)# 读取文件with open(file_name, 'rb') as f:data = f.read()print("词库名:", byte2str(data[0x130:0x338])) # .encode('GB18030')print("词库类型:", byte2str(data[0x338:0x540]))print("描述信息:", byte2str(data[0x540:0xd40]))print("词库示例:", byte2str(data[0xd40:startPy]))getPyTable(data[startPy:startChinese])getChinese(data[startChinese:])if __name__ == '__main__':# scel所在文件夹路径in_path = "Scel"fin = [fname for fname in os.listdir(in_path) if fname[-5:] == ".scel"]for f in fin:f = os.path.join(in_path, f)scel2txt(f)f = open('./Scel/coal_dict.txt', 'w')for count, py, word in GTable:f.write(str(count)+ '\t\t\t' + py + '\t\t\t' + word + '\n')f.close()

得到结果如下:

------------------------------------------------------------
词库名: 东北话大全【官方推荐】
词库类型: 方言
描述信息: 贼拉逗的东北话你一定听过,说起来实在霸气!词库终于出来了,再也不愁打不出来你想说的话,专门为你私人订制哦,还不快去下载!!!
词库示例: 不想嘎哈 老嘎瘩 嗯呐 瞅你咋的 咋地
------------------------------------------------------------
词库名: 史记【官方推荐】
词库类型: 文学
描述信息: 作者司马迁以其“究天人之际,通古今之变,成一家之言”的史识,使《史记》成为中国第一部,也是最出名的纪传体通史。小编整理了书中经典故事、名句、人物等,让你更快打出相关词汇,我在这等你哦~
词库示例: 十表 姬昌 项羽本纪 武王伐纣 虚怀若谷 商鞅变法
------------------------------------------------------------
词库名: 开发大神专用词库【官方推荐】
词库类型: 互联网
描述信息: 程序猿们是不是遨游在代码的海洋里无法自拔?小编知道你们整日找BUG辛苦了,为辅助你们的工作特意奉上专属词库,提高工作效率,畅快打字。欢迎你们前来补充词条哦 !
词库示例: 资源保留 代码 优先级 启动事件 排期 公开测试
------------------------------------------------------------
词库名: 柳宗元诗词【官方推荐】
词库类型: 诗词歌赋
描述信息: 柳宗元,唐朝文学家、散文家和思想家。倡导唐代古文运动。散文论说性强,笔锋犀利,讽刺辛辣。游记写景状物,多所寄托。诗多抒写抑郁悲愤、思乡怀友之情,自成一路。
词库示例: 柳河东 永州八记 捕蛇者说 柳河东集 江雪 小石潭记
------------------------------------------------------------
词库名: 诗经【官方推荐】
词库类型: 诗词歌赋
描述信息: 《诗经》是中国古代诗歌开端,最早的一部诗歌总集,现存305篇(此外有目无诗的6篇,共311篇),分《风》、《雅》、《颂》三部分。《颂》有40篇,《雅》有105篇(《小雅》中有6篇有目无诗,不计算在内),《风》的数量最多,共160篇,合起来是305篇。古人取其整数,常说“诗三百”。
词库示例: 君子好逑 悠哉悠哉 左右采之 琴瑟友之 施于中谷 黄鸟于飞 

GitHub项目链接:

scel文件:https://github.com/CQiang27/Spark_Python/tree/master/Scel

Python源码:https://github.com/CQiang27/Spark_Python/blob/master/scel_TR_txt.ipynb

参考文献:

[1] 多个.scel合并为同一dict,并去重,https://blog.csdn.net/leitouguan8655/article/details/82834517

[2] scel2txt 搜狗scel格式转txt python3,https://blog.csdn.net/cFarmerReally/article/details/78149648

[3] Python中struct.pack()和struct.unpack()用法详细说明,http://www.php.cn/python-tutorials-356984.html

Python读取scel文件相关推荐

  1. python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据

    在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...

  2. python读取一个文件夹/子文件夹下的所有文件名字

    python读取一个文件夹/子文件夹下的所有文件名字 示例代码: import osfile_path = './images/' all_file_name = os.listdir(file_pa ...

  3. python删除重复值所在的行数_使用python读取txt文件的内容,并删除重复的行数方法...

    注意,本文代码是使用在txt文档上,同时txt文档中的内容每一行代表的是图片的名字. #coding:utf-8 import shutil readDir = "原文件绝对路经" ...

  4. python读取txt文件并画图

    1,使用python读取txt文件 已知txt文件内容如下: 0 01 12 43 94 165 256 36 请以第一列为x轴,第二列为y轴画图 步骤如下: 1)使用readlines读取文件 2) ...

  5. MATLAB和Python读取wave文件的波形对比

       用python读取.wav文件的波形后再用MATLAB读取文件波形进行验证. 1.MORSE 1.1 Python 程序见之前的博客. 波形如图1所示: 图1 1.2 MATLAB 读取波形程序 ...

  6. 用Python读取整个文件

    本文翻译自:Reading entire file in Python If you read an entire file with content = open('Path/to/file', ' ...

  7. python怎么读xlsx_用python读取xlsx文件

    一 准备工作: 二 xlrd库读取 首先安装xlrd库,安装方法: pip install xlrd import xlrd #打开excel wb = xlrd.open_workbook('tes ...

  8. python读取.edf文件

    目录 EDF文件简介 MNE-python读取.edf文件 案例 第一步:导入工具包 第二步:加载本地edf文件 第三步:获取原始数据中事件 第四步:根据事件ID获取对应事件 第五步:绘制事件图 本教 ...

  9. python读取.locs文件

    目录 简介 知识点: 案例 本教程为脑机学习者Rose发表于公众号:脑机接口社区 .QQ交流群:903290195 简介 本案例主要介绍如何读取eeglab示例文件.locs文件.为了演示电极位置,所 ...

  10. python英文单词及其出现次数-Python读取英文文件并记录每个单词出现次数后降序输出示例...

    本文实例讲述了Python读取英文文件并记录每个单词出现次数后降序输出.分享给大家供大家参考,具体如下: 对文中出现的句号,逗号和感叹号做了相应的处理 sorted排序函数用法: 按照value值降序 ...

最新文章

  1. Linux环境变量说明与配置
  2. shell 全局和局部变量
  3. Android --- 动态获取定位权限时: Fragment 中 onRequestPermissionsResult 方法不执行
  4. View页面间的跳转
  5. 人形机器人正在美国史密森尼博物馆中担任导游的工作
  6. ApacheCN NodeJS 译文集 20211204 更新
  7. 关于鼠标移到gridview行上,背景变色的问题。
  8. Pytorch中的错误和bug
  9. 计算机控制的液压提升,一种液压提升监控系统及其在液压提升控制上的运用
  10. PCSHARE VIP 2005源代码
  11. google服务框架 闪退_没 Google 服务闪退?教你解决手游谷歌服务问题
  12. textview加下划线
  13. ​UI自动化测试面试题及答案大全
  14. MFC 绘制 PNG 格式图片
  15. Confluence: A Robust Non-IoU Alternative to Non-Maxima Suppression in Object Detection 论文阅读翻译
  16. JAVA文件下载,IE不提示下载,直接打开的解决方法
  17. Debian dns设置
  18. POI最新版本 4.1.2 操作 Excel
  19. P44 break continue
  20. Urlencode编码对HTTP的URL地址的作用的探究(20210519更新,最终结论得出,XSS相关)

热门文章

  1. 计算机冯诺依曼原理及应用,冯·诺依曼计算机工作原理的核心是( )和“程序控制...
  2. php获取alexa世界排名值的函数
  3. Win10无法访问共享文件,错误代码0x80004005
  4. 论文下载哪家强 | caj 官网软件下载
  5. 学习笔记之Python的六种内置对象
  6. 微博运营的5个经典案例
  7. Elasticsearch文档内部的父子关系
  8. go语言 flag用法
  9. 四川绵阳动感地带学生套餐资费备忘
  10. 【ArcGIS】PointsToLine执行报999999错误的一种解决方案