python - 搜狗词库 (.scel 文件转 txt)

解析示例:

词库名: 妖神记【官方推荐】
词库类型: 动漫
描述信息: 妖神记妖神一出,谁与争锋!霸气词库来袭,小编整理了其中的家族,人名,武器等,让你打出字来so easy。欢迎大家前来补充哦!
词库示例: 天道之力 圣血翼蛟 天痕世家 圣灵大陆  龙墟界域 
解析 妖神记【官方推荐】.scel -> /Users/xxx/Downloads/搜狗词库/output/妖神记【官方推荐】.txt

代码:

# -*- coding: utf-8 -*-
import struct
import os
import time
'''
2021-04-21 搜狗词库 scel 转 txt
'''
# 主要两部分
# 1.全局拼音表,貌似是所有的拼音组合,字典序
#       格式为(index,len,pinyin)的列表
#       index: 两个字节的整数 代表这个拼音的索引
#       len: 两个字节的整数 拼音的字节长度
#       pinyin: 当前的拼音,每个字符两个字节,总长len
#
# 2.汉语词组表
#       格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表
#       same: 两个字节 整数 同音词数量
#       py_table_len:  两个字节 整数
#       py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引
#
#       word_len:两个字节 整数 代表中文词组字节数长度
#       word: 中文词组,每个中文汉字两个字节,总长度word_len
#       ext_len: 两个字节 整数 代表扩展信息的长度,好像都是10
#       ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0
#
#      {word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表
#
_debug = True
_debug = False
# scel所在文件夹路径
in_path = r"/Users/xxx/Downloads/搜狗词库"
# 输出词典所在文件夹路径
out_path = r"/Users/xxx/Downloads/搜狗词库/output"
# 拼音表偏移,
startPy = 0x1540;
# 汉语词组表偏移
startChinese = 0x2628;
# 全局拼音表
GPy_Table = {}
# 解析结果
# 元组(词频,拼音,中文词组)的列表class LibInfo:name = ''type = ''desc = ''case = ''pinyinDict = Nonecn_chars = None# 原始字节码转为字符串
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 += lenPyreturn GPy_Table# 获取一个词组的拼音
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):GTable = []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_lenreturn GTabledef getLibInfo(file_name):print('-' * 60)with open(file_name, 'rb') as f:data = f.read()libInfo = LibInfo()libInfo.name = byte2str(data[0x130:0x338])libInfo.type = byte2str(data[0x338:0x540])libInfo.desc = byte2str(data[0x540:0xd40])libInfo.case = byte2str(data[0xd40:startPy])print("词库名:", libInfo.name) # .encode('GB18030')print("词库类型:",libInfo.type)print("描述信息:", libInfo.desc)print("词库示例:",libInfo.case)libInfo.pinyinDict = getPyTable(data[startPy:startChinese])# print(lst)libInfo.cn_chars = getChinese(data[startChinese:])return libInfoif __name__ == '__main__':fin = [fname for fname in os.listdir(in_path) if fname[-5:] == ".scel"]print('所有词库文件',fin)for f in fin:file_path=(os.path.join(out_path, str(f).split('.')[0] + '.txt'))try:dt = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))libInfo = getLibInfo(os.path.join(in_path, f))# 保存结果with open(file_path,'w+',encoding='utf-8')as file:file.write('#词库名:%s\r\n'%libInfo.name)file.write('#词库类型:%s\r\n'%libInfo.type)file.write('#描述信息:%s\r\n'%libInfo.desc)file.write('#词库示例:%s\r\n'%libInfo.case)file.write('#词数:%s\r\n'%len(libInfo.cn_chars))file.write('#时间:%s\r\n'%dt)file.write('#%s\r\n'%('~'*30))for (freq,py,w) in libInfo.cn_chars:file.write('%s\t%s\t%s\r\n'%(w,py,freq))print('解析 %s -> %s'%(f,file_path))except Exception as e:print('解析异常:'+f,e)if _debug:print('终止 debug=',_debug)break'''
>>> f = open('test.txt', 'w',encoding='utf-8') # 若是'wb'就表示写二进制文件
>>> f.write('Hello, world!')
>>> f.close()
python文件对象提供了两个“写”方法: write() 和 writelines()。
write()方法和read()、readline()方法对应,是将字符串写入到文件中。
writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
关于open()的mode参数:
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'
'''

python - 搜狗词库 (.scel 文件转 txt)相关推荐

  1. 爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件

    一:爬取词库,使用jieba分词库,自定义dict.txt文件 import jiebafrom urllib.request import urlopen from bs4 import Beaut ...

  2. 搜狗词库scel格式转为txt格式(python3版本)

    1.想用搜狗的词库来辅助jieba分词,需要把词库从scel转成txt格式. 在网上找到了大神的python2版本,https://blog.csdn.net/zhangzhenhu/article/ ...

  3. java scel_使用java将搜狗词库.scel文件转化为.txt文件

    需求:批量将.scel文件转化为可视的txt文件(支持1对1,多对1,多对多),并从中提取中文词(去重),支持追加内容. 成果: 使用: package com.hxl.files; import j ...

  4. python读取文本两个数字的成语_只要2步!将搜狗词库(scel)转为Python可读的文本...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 将搜狗词库(scel)转化为python可读的文本(text)的方法方法 1. 利用R语言(方法简单) ① 载入词库(R语言) library(Rword ...

  5. 将搜狗词库.scel格式转化为.txt格式

    [2020年5月28日更新:有一说一,这篇文章是我2017年底在新浪工作时处理家居.房产频道相关业务时的实践,代码是后来从自己代码库直接粘贴的,当然转码部分的代码是借鉴的,当时也是查阅了几种方法,一一 ...

  6. 搜狗词库的批量下载#Python

    在制作电子病历全文索引时,需要建立索引,索引是根据索引词建立的,现有索引词匮乏,不能满足需求,搜寻之后,发现搜狗输入法的医学词库很庞大,所以,想着自学写一个Python脚本,完成词库的自动下载工作. ...

  7. PHP高性能输出UNICODE正则汉字列表 汉字转拼音多音字解决方案 搜索引擎分词细胞词库更新 搜狗词库提取TXT...

    为什么80%的码农都做不了架构师?>>>    目前现状 汉字转拼音 难度大就大在 多音字!行业上较准确的是基于词语.成语的识别.搜狗有1万多词库 每个词库又很大: 比如: 了 我们 ...

  8. Python:文本分析必备—搜狗词库

    全文阅读:Python:文本分析必备-搜狗词库| 连享会主页 目录 1. 引言 2. 词典的妙用 3. 搜狗词库的下载 3.1 抓取12个页面链接 3.2 爬取所有词库名称和下载链接 3.3 下载细胞 ...

  9. coreseek 词库 导入搜狗词库

    2019独角兽企业重金招聘Python工程师标准>>> 先到搜狗官方找你需要的词库.下载 然后用 深蓝词库转换.exe 此软件转换成txt文件才能开导咯ini_set('max_ex ...

  10. Windows下小狼毫输入法(Rime)的安装与配置(含导入搜狗词库)

    Windows下小狼毫输入法(Rime)的安装与配置(含导入搜狗词库) 最近彻底烦透了搜狗拼音输入法的各种流氓行为,自动升级不说,还在后台偷偷下载搜狗浏览器,卸了又下载,还自动弹出搜狐新闻,一怒之下把 ...

最新文章

  1. python 文件追加写入_Python写入文件–解释了打开,读取,追加和其他文件处理功能
  2. 清华构建新一代数据集NICO,定义图像分类新标准
  3. mysql数据库报Access denied for user 的解决方法
  4. Java中的对象序列化操作
  5. SpringBoot整合redisson分布式锁
  6. (97)FPGA时序违规案例(二)
  7. 即将全部下架!支付宝等平台不许再卖互联网存款产品
  8. 《和平精英》崩了 官方回应:受运营商网络波动影响 正在修复
  9. TCP/UDP协议简要梳理
  10. 2017计算机考研统考,2017年计算机考研408统考真题及答案.pdf
  11. 疯狂HTML5 CSS 3 JavaScript讲义 (李刚) 高清PDF扫描版
  12. Excle超链接图片修改默认打开方式
  13. 判断是否为非负数、小数点后两位
  14. IMAX China去年实现扭亏为盈;华为助力打造成都智算中心;Quantinuum和IBM壮大量子生态系统 | 全球TMT...
  15. qq绑定outlook邮箱服务器,Outlook2013怎么绑定QQ邮箱
  16. autojs实用文档
  17. 铁路及工程相关专业术语自动查询
  18. 论文:EMNLP2021-End-to-End Entity Resolution and Question Answering Using Differentiable Knowledge Grap
  19. fastcgi php 集群 分离,使用nginx配置多个php fastcgi负载均衡--梦飞翔的地方(梦翔天空)...
  20. python中断响应_Python手动中断(Ctrl-C)多线程程序

热门文章

  1. 移动安全工具:fastboot
  2. JDE 权限,分环境设置权限,PY,PD设置不同权限
  3. 【PLC】PLCPAC入门教程
  4. pandavan 固件squashfs只读文件系统如何上传应用程序
  5. 微波工程(3)——网络
  6. Wework和优客工场争相上市,共享办公第一股风云再起
  7. 【转载】Pandas速查手册中文版
  8. STM32固件库的安装
  9. java 生成二维码,带logo,底部文字
  10. phpcms url伪静态