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

由于项目中要用到词库,而下载的搜狗词库是.scel格式,所以就用python脚本将搜狗词库.scel格式文件转化为.txt格式文件。

  1 #!/bin/python
  2 # -*- coding: utf-8 -*-
  3
  4
  5 import struct
  6 import sys
  7 import binascii
  8 import pdb
  9
 10 try:
 11     reload(sys)
 12     sys.setdefaultencoding(‘utf-8‘)
 13 except:
 14     pass
 15
 16 # 搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母)
 17 # 找出其每部分的偏移位置即可
 18 # 主要两部分
 19 # 1.全局拼音表,貌似是所有的拼音组合,字典序
 20 #       格式为(index,len,pinyin)的列表
 21 #       index: 两个字节的整数 代表这个拼音的索引
 22 #       len: 两个字节的整数 拼音的字节长度
 23 #       pinyin: 当前的拼音,每个字符两个字节,总长len
 24 #
 25 # 2.汉语词组表
 26 #       格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表
 27 #       same: 两个字节 整数 同音词数量
 28 #       py_table_len:  两个字节 整数
 29 #       py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引
 30 #
 31 #       word_len:两个字节 整数 代表中文词组字节数长度
 32 #       word: 中文词组,每个中文汉字两个字节,总长度word_len
 33 #       ext_len: 两个字节 整数 代表扩展信息的长度,好像都是10
 34 #       ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0
 35 #
 36 #      {word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表
 37
 38 # 拼音表偏移,
 39 startPy = 0x1540;
 40
 41 # 汉语词组表偏移
 42 startChinese = 0x2628;
 43
 44 # 全局拼音表
 45
 46 GPy_Table = {}
 47
 48 # 解析结果
 49 # 元组(词频,拼音,中文词组)的列表
 50 GTable = []
 51
 52
 53 def byte2str(data):
 54     ‘‘‘‘‘将原始字节码转为字符串‘‘‘
 55     i = 0;
 56     length = len(data)
 57     ret = u‘‘
 58     while i < length:
 59         x = data[i] + data[i + 1]
 60         t = unichr(struct.unpack(‘H‘, x)[0])
 61         if t == u‘\r‘:
 62             ret += u‘\n‘
 63         elif t != u‘ ‘:
 64             ret += t
 65         i += 2
 66     return ret
 67
 68
 69 # 获取拼音表
 70 def getPyTable(data):
 71     if data[0:4] != "\x9D\x01\x00\x00":
 72         return None
 73     data = data[4:]
 74     pos = 0
 75     length = len(data)
 76     while pos < length:
 77         index = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
 78         # print index,
 79         pos += 2
 80         l = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
 81         # print l,
 82         pos += 2
 83         py = byte2str(data[pos:pos + l])
 84         # print py
 85         GPy_Table[index] = py
 86         pos += l
 87
 88         # 获取一个词组的拼音
 89
 90
 91 def getWordPy(data):
 92     pos = 0
 93     length = len(data)
 94     ret = u‘‘
 95     while pos < length:
 96         index = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
 97         ret += GPy_Table[index]
 98         pos += 2
 99     return ret
100
101
102 # 获取一个词组
103 def getWord(data):
104     pos = 0
105     length = len(data)
106     ret = u‘‘
107     while pos < length:
108         index = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
109         ret += GPy_Table[index]
110         pos += 2
111     return ret
112
113
114 # 读取中文表
115 def getChinese(data):
116     # import pdb
117     # pdb.set_trace()
118
119     pos = 0
120     length = len(data)
121     while pos < length:
122         # 同音词数量
123         same = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
124         # print ‘[same]:‘,same,
125
126         # 拼音索引表长度
127         pos += 2
128         py_table_len = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
129         # 拼音索引表
130         pos += 2
131         py = getWordPy(data[pos: pos + py_table_len])
132
133         # 中文词组
134         pos += py_table_len
135         for i in xrange(same):
136             # 中文词组长度
137             c_len = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
138             # 中文词组
139             pos += 2
140             word = byte2str(data[pos: pos + c_len])
141             # 扩展数据长度
142             pos += c_len
143             ext_len = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
144             # 词频
145             pos += 2
146             count = struct.unpack(‘H‘, data[pos] + data[pos + 1])[0]
147
148             # 保存
149             GTable.append((count, py, word))
150
151             # 到下个词的偏移位置
152             pos += ext_len
153
154
155 def deal(file_name):
156     print ‘-‘ * 60
157     f = open(file_name, ‘rb‘)
158     data = f.read()
159     f.close()
160
161     if data[0:12] != "\x40\x15\x00\x00\x44\x43\x53\x01\x01\x00\x00\x00":
162         print "确认你选择的是搜狗(.scel)词库?"
163         sys.exit(0)
164         # pdb.set_trace()
165
166     print "词库名:", byte2str(data[0x130:0x338])  # .encode(‘GB18030‘)
167     print "词库类型:", byte2str(data[0x338:0x540])  # .encode(‘GB18030‘)
168     print "描述信息:", byte2str(data[0x540:0xd40])  # .encode(‘GB18030‘)
169     print "词库示例:", byte2str(data[0xd40:startPy])  # .encode(‘GB18030‘)
170
171     getPyTable(data[startPy:startChinese])
172     getChinese(data[startChinese:])
173
174
175 if __name__ == ‘__main__‘:
176
177     # 将要转换的词库添加在这里就可以了
178     o = [u‘明星【官方推荐】.scel‘,]
179
180
181     for f in o:
182         deal(f)
183
184         # 保存结果
185     f = open(‘amuse.txt‘, ‘w‘)
186     for word in GTable:
187         # GTable保存着结果,是一个列表,每个元素是一个元组(词频,拼音,中文词组),有需要的话可以保存成自己需要个格式
188         # 我没排序,所以结果是按照上面输入文件的顺序
189         #f.write(unicode(word).encode(‘GB18030‘))  # 最终保存文件的编码,可以自给改
190         f.write(word[2])
191         f.write(‘\n‘)
192     f.close()
时间: 2024-11-05 14:52:42

将搜狗词库.scel格式转化为.txt格式的相关文章

中州韵输入法导入搜狗词库

rime是一个非常优秀的输入法,linux平台下的反应速度远超搜狗,也没有隐私风险.2012年开始接触它,到后来抛弃了它,因为rime自带的词库真的太弱了,也懒得折腾.最近发现一个词库转换软件叫imewlconverter,于是发现rime导入其他输入法(比如搜狗)的词库其实还挺方便的. 要导入词库需要两个文件: 1. luna_pinyin_simp.custom.yaml 是配置文件 rime在部署的时候会自动加载.因为我用的是明月简体schema,所以是这个名字.如果你用的是明月schem

Json格式转化为string格式

今天在学习Jsonp的时候,想通过服务端返回一段json数据,因为使用的服务端是NodeJs,那么就需要在js文件中实现返回json.(这里不懂的同学,可以先了解一下NodeJs的基础概念,在这里,我想大家推荐一个Nodejs视频  http://www.icoolxue.com/album/show/89). 首先,我们有这样一个json格式 var json={name:"xlt",age:25} 如果我们直接把上面这个”json对象“返回给客户端,那么客户端都不知道怎么接受(至于

腾讯下载的视频qlv格式转化为MP4格式

最近在看腾讯视频的时候发现下载下来的视频格式都是qlv格式,且不能用其他播放器播放,甚是恼怒,网上找了很多方法都很繁琐,于是自己写了一个小程序来处理这个问题.把下载下来的qlv格式转化为MP4格式 首先还是按照网上所说的,找到这些文件所在位置: 首先将需要转换mp4格式的视频下载,要下载完成才能进行转换.  点击设置,将文件所在位置复制  将复制内容粘贴到我的电脑,如图所示位置,点击回车[Enter]键,打开后我们找到下载文件, (因为腾讯下载内容一般都为隐藏,所以需要将文件找到)  我们打开其

解析搜狗词库(python)

#!/usr/bin/python # -*- coding: utf-8 -*- import struct import sys import binascii import pdb #搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母) #找出其每部分的偏移位置即可 #主要两部分 #1.全局拼音表,貌似是所有的拼音组合,字典序 # 格式为(index,len,pinyin)的列表 # index: 两个字节的整数 代表这个拼音的索引 # len:

ibus pinyin 搜狗词库

目前主流的 linux 发行版例如 fedora 和 ubuntu 默认的中文输入法都是 ibus-pinyin,但是非尝苦恼 ibus-pinyin 的词库太少,输入中文词组得一个一个的选汉字,很羡慕 windows 下用搜狗拼音的同学,于是网上有好事者提出了解决办法. 用法:先到搜狗拼音官方网站下载你认为比较常用的词库文件,注意这些词库文件通常是以 .scel 为后缀名,然后把下面的代码复制后保存为 python 脚本,保存到词库文件所在的文件夹中,运行脚本,得到 sougou.txt: 打

搜狗词库转txt

# 运行环境要求 python2 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import struct 5 import sys 6 import binascii 7 import pdb 8 #搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母) 9 #找出其每部分的偏移位置即可 10 #主要两部分 11 #1.全局拼音表,貌似是所有的拼音组合,字典序 12 # 格式为(index,len,

深蓝词库转换2.7版发布——支持Mac原生输入法词库,QQ拼音新词库qcel格式

2020年过年期间,由于冠状病毒肺炎的流行,在家无事,就把搁置了很久的词库进行了改进.发布了2.7版:https://github.com/studyzy/imewlconverter/releases/tag/v2.7.0 转眼深蓝词库转换从诞生到现在都已经10个年头了,这是我做的最久的软件了.本次2.7版的更新主要包含了以下新特性: 一.MacOS原生简体拼音输入法自定义短语词库的支持 在MacOS的“系统偏好设置”中选择“键盘”,“文本”,即可看到,Mac简体拼音输入法的自定义短语词库.

深蓝词库转换2.4版发布,支持最新的搜狗用户词库备份bin格式

很高兴的告诉大家,感谢GitHub上的h4x3rotab提供python版的搜狗用户词库备份bin格式的解析算法,感谢tmxkn1提供了C#版的实现,深蓝词库转换终于迎来了一个重大更新,能够支持搜狗用户词库的bin格式备份的导出了.再也不用受到搜狗输入法的钳制,可以自由切换到其他输入法了.搜狗bin词库只解析到了用户词条和词频,没有拼音,所以如果要导出其他拼音输入法,中间转换工具会根据词条的内容重新生成拼音. 另外在2.4版中,增加了用户词频强制设置的功能,比如将搜狗用户词库bin格式备份转换为

coreseek/sphinx自定义词库

1.在一些专业领域中,全文搜索需要定义专业的名词,这里以化学为例来说明自定义词库 国内只有搜狗提供公开词库 网址是:http://pinyin.sogou.com/dict/ 有些可以直接下载TXT的,有些则需要自己处理成txt文件,如果能下载txt的则只需要更改一下就可以,如果不能下载,则用其他软件或者自己手写一个,我用的是深蓝提供的词库转换工具 假设以上步骤已经完成,txt文件已经生成,则只需要下面的步骤就可以生成词库 mmseg词库的格式是 中文词 \t 1 x:1 由于生成的txt文件的