搜狗詞庫轉txt
阿新 • • 發佈:2018-01-12
移位 一個 truct unpack art set_trace 描述 格式 索引
# 運行環境要求 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,pinyin)的列表 13# index: 兩個字節的整數 代表這個拼音的索引 14 # len: 兩個字節的整數 拼音的字節長度 15 # pinyin: 當前的拼音,每個字符兩個字節,總長len 16 # 17 #2.漢語詞組表 18 # 格式為(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一個列表 19 # same: 兩個字節 整數 同音詞數量 20 # py_table_len: 兩個字節 整數 21 # py_table: 整數列表,每個整數兩個字節,每個整數代表一個拼音的索引22 # 23 # word_len:兩個字節 整數 代表中文詞組字節數長度 24 # word: 中文詞組,每個中文漢字兩個字節,總長度word_len 25 # ext_len: 兩個字節 整數 代表擴展信息的長度,好像都是10 26 # ext: 擴展信息 前兩個字節是一個整數(不知道是不是詞頻) 後八個字節全是0 27 # 28 # {word_len,word,ext_len,ext} 一共重復same次 同音詞 相同拼音表 29 30 31 #拼音表偏移, 32 startPy = 0x1540; 33 34 #漢語詞組表偏移 35 startChinese = 0x2628; 36 37 #全局拼音表 38 39 GPy_Table ={} 40 41 #解析結果 42 #元組(詞頻,拼音,中文詞組)的列表 43 GTable = [] 44 45 def byte2str(data): 46 ‘‘‘將原始字節碼轉為字符串‘‘‘ 47 i = 0; 48 length = len(data) 49 ret = u‘‘ 50 while i < length: 51 x = data[i] + data[i+1] 52 t = unichr(struct.unpack(‘H‘,x)[0]) 53 if t == u‘r‘: 54 ret += u‘n‘ 55 elif t != u‘ ‘: 56 ret += t 57 i += 2 58 return ret 59 #獲取拼音表 60 def getPyTable(data): 61 62 if data[0:4] != "x9Dx01x00x00": 63 return None 64 data = data[4:] 65 pos = 0 66 length = len(data) 67 while pos < length: 68 index = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 69 #print index, 70 pos += 2 71 l = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 72 #print l, 73 pos += 2 74 py = byte2str(data[pos:pos+l]) 75 #print py 76 GPy_Table[index]=py 77 pos += l 78 79 80 #獲取一個詞組的拼音 81 def getWordPy(data): 82 pos = 0 83 length = len(data) 84 ret = u‘‘ 85 while pos < length: 86 87 index = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 88 ret += GPy_Table[index] 89 pos += 2 90 return ret 91 92 93 #獲取一個詞組 94 def getWord(data): 95 pos = 0 96 length = len(data) 97 ret = u‘‘ 98 while pos < length: 99 100 index = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 101 ret += GPy_Table[index] 102 pos += 2 103 return ret 104 105 #讀取中文表 106 def getChinese(data): 107 #import pdb 108 #pdb.set_trace() 109 110 pos = 0 111 length = len(data) 112 while pos < length: 113 #同音詞數量 114 same = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 115 #print ‘[same]:‘,same, 116 117 #拼音索引表長度 118 pos += 2 119 py_table_len = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 120 #拼音索引表 121 pos += 2 122 py = getWordPy(data[pos: pos+py_table_len]) 123 124 #中文詞組 125 pos += py_table_len 126 for i in xrange(same): 127 #中文詞組長度 128 c_len = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 129 #中文詞組 130 pos += 2 131 word = byte2str(data[pos: pos + c_len]) 132 #擴展數據長度 133 pos += c_len 134 ext_len = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 135 #詞頻 136 pos += 2 137 count = struct.unpack(‘H‘,data[pos]+data[pos+1])[0] 138 139 #保存 140 GTable.append((count,py,word)) 141 142 #到下個詞的偏移位置 143 pos += ext_len 144 145 def deal(file_name): 146 print ‘-‘*60 147 f = open(file_name,‘rb‘) 148 data = f.read() 149 f.close() 150 151 if data[0:12] !="x40x15x00x00x44x43x53x01x01x00x00x00": 152 print "確認你選擇的是搜狗(.scel)詞庫?" 153 sys.exit(0) 154 #pdb.set_trace() 155 156 print "詞庫名:" ,byte2str(data[0x130:0x338])#.encode(‘GB18030‘) 157 print "詞庫類型:" ,byte2str(data[0x338:0x540])#.encode(‘GB18030‘) 158 print "描述信息:" ,byte2str(data[0x540:0xd40])#.encode(‘GB18030‘) 159 print "詞庫示例:",byte2str(data[0xd40:startPy])#.encode(‘GB18030‘) 160 161 getPyTable(data[startPy:startChinese]) 162 getChinese(data[startChinese:]) 163 164 if __name__ == ‘__main__‘: 165 166 #將要轉換的詞庫添加在這裏就可以了 167 o = [‘計算機詞匯大全【官方推薦】.scel‘, 168 ‘IT計算機.scel‘, 169 ‘計算機詞匯大全【官方推薦】.scel‘, 170 ‘北京市城市信息精選.scel‘, 171 ‘常用餐飲詞匯.scel‘, 172 ‘成語.scel‘, 173 ‘成語俗語【官方推薦】.scel‘, 174 ‘法律詞匯大全【官方推薦】.scel‘, 175 ‘房地產詞匯大全【官方推薦】.scel‘, 176 ‘手機詞匯大全【官方推薦】.scel‘, 177 ‘網絡流行新詞【官方推薦】.scel‘, 178 ‘歇後語集錦【官方推薦】.scel‘, 179 ‘飲食大全【官方推薦】.scel‘, 180 ] 181 182 for f in o: 183 deal(f) 184 185 #保存結果 186 f = open(‘sougou.txt‘,‘w‘) 187 for count,py,word in GTable: 188 #GTable保存著結果,是一個列表,每個元素是一個元組(詞頻,拼音,中文詞組),有需要的話可以保存成自己需要個格式 189 #我沒排序,所以結果是按照上面輸入文件的順序 190 f.write( unicode(‘{%(count)s}‘ %{‘count‘:count}+py+‘ ‘+ word).encode(‘GB18030‘) )#最終保存文件的編碼,可以自給改 191 f.write(‘n‘) 192 f.close()
搜狗詞庫轉txt