python把 scel 词库转成txt 格式

2015年08月13日 10:31 by:zhangzhenhu

搜狗输入法提供了词库下载但是下载下来的是scel格式的,如果要把下载的scel的词库导入其它数据库中可以先用 python把 scel 词库转成txt 格式 , 然后再导入就可以了。

搜狗输入法词库下载连接:http://pinyin.sogou.com/dict/

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. import struct
  4. import sys
  5. import binascii 
  6. import pdb
  7. #搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母)
  8. #找出其每部分的偏移位置即可
  9. #主要两部分
  10. #1.全局拼音表,貌似是所有的拼音组合,字典序
  11. #       格式为(index,len,pinyin)的列表
  12. #       index: 两个字节的整数 代表这个拼音的索引
  13. #       len: 两个字节的整数 拼音的字节长度
  14. #       pinyin: 当前的拼音,每个字符两个字节,总长len
  15. #       
  16. #2.汉语词组表
  17. #       格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表
  18. #       same: 两个字节 整数 同音词数量
  19. #       py_table_len:  两个字节 整数
  20. #       py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引
  21. #
  22. #       word_len:两个字节 整数 代表中文词组字节数长度
  23. #       word: 中文词组,每个中文汉字两个字节,总长度word_len
  24. #       ext_len: 两个字节 整数 代表扩展信息的长度,好像都是10
  25. #       ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0
  26. #
  27. #      {word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表


  28. #拼音表偏移,
  29. startPy = 0x1540;

  30. #汉语词组表偏移
  31. startChinese = 0x2628;

  32. #全局拼音表

  33. GPy_Table ={}

  34. #解析结果
  35. #元组(词频,拼音,中文词组)的列表
  36. GTable = []

  37. def byte2str(data):
  38.     '''将原始字节码转为字符串'''
  39.     i = 0;
  40.     length = len(data)
  41.     ret = u''
  42.     while i < length:
  43.         x = data[i] + data[i+1]
  44.         t = unichr(struct.unpack('H',x)[0])
  45.         if t == u'r':
  46.             ret += u'n'
  47.         elif t != u' ':
  48.             ret += t
  49.         i += 2
  50.     return ret
  51. #获取拼音表
  52. def getPyTable(data):

  53.     if data[0:4] != "x9Dx01x00x00":
  54.         return None
  55.     data = data[4:]
  56.     pos = 0
  57.     length = len(data)
  58.     while pos < length:
  59.         index = struct.unpack('H',data[pos]+data[pos+1])[0]
  60.         #print index,
  61.         pos += 2
  62.         l = struct.unpack('H',data[pos]+data[pos+1])[0]
  63.         #print l,
  64.         pos += 2
  65.         py = byte2str(data[pos:pos+l])
  66.         #print py
  67.         GPy_Table[index]=py
  68.         pos += l


  69. #获取一个词组的拼音
  70. def getWordPy(data):
  71.     pos = 0
  72.     length = len(data)
  73.     ret = u''
  74.     while pos < length:
  75.         
  76.         index = struct.unpack('H',data[pos]+data[pos+1])[0]
  77.         ret += GPy_Table[index]
  78.         pos += 2    
  79.     return ret


  80. #获取一个词组
  81. def getWord(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. def getChinese(data):
  93.     #import pdb
  94.     #pdb.set_trace()
  95.     
  96.     pos = 0
  97.     length = len(data)
  98.     while pos < length:
  99.         #同音词数量
  100.         same = struct.unpack('H',data[pos]+data[pos+1])[0]
  101.         #print '[same]:',same,
  102.         
  103.         #拼音索引表长度
  104.         pos += 2
  105.         py_table_len = struct.unpack('H',data[pos]+data[pos+1])[0]
  106.         #拼音索引表
  107.         pos += 2
  108.         py = getWordPy(data[pos: pos+py_table_len])

  109.         #中文词组
  110.         pos += py_table_len
  111.         for i in xrange(same):
  112.             #中文词组长度
  113.             c_len = struct.unpack('H',data[pos]+data[pos+1])[0]
  114.             #中文词组
  115.             pos += 2  
  116.             word = byte2str(data[pos: pos + c_len])
  117.             #扩展数据长度
  118.             pos += c_len        
  119.             ext_len = struct.unpack('H',data[pos]+data[pos+1])[0]
  120.             #词频
  121.             pos += 2
  122.             count  = struct.unpack('H',data[pos]+data[pos+1])[0]

  123.             #保存
  124.             GTable.append((count,py,word))
  125.         
  126.             #到下个词的偏移位置
  127.             pos +=  ext_len

  128. def deal(file_name):
  129.     print '-'*60
  130.     f = open(file_name,'rb')
  131.     data = f.read()
  132.     f.close()
  133.         
  134.     if data[0:12] !="x40x15x00x00x44x43x53x01x01x00x00x00":
  135.         print "确认你选择的是搜狗(.scel)词库?"
  136.         sys.exit(0)
  137.     #pdb.set_trace()
  138.     
  139.     print "词库名:" ,byte2str(data[0x130:0x338])#.encode('GB18030')
  140.     print "词库类型:" ,byte2str(data[0x338:0x540])#.encode('GB18030')
  141.     print "描述信息:" ,byte2str(data[0x540:0xd40])#.encode('GB18030')
  142.     print "词库示例:",byte2str(data[0xd40:startPy])#.encode('GB18030')
  143.     
  144.     getPyTable(data[startPy:startChinese])
  145.     getChinese(data[startChinese:])
  146.             
  147. if __name__ == '__main__':

  148.     #将要转换的词库添加在这里就可以了
  149.     o = ['计算机词汇大全【官方推荐】.scel',
  150.     'IT计算机.scel',
  151.     '计算机词汇大全【官方推荐】.scel',
  152.     '北京市城市信息精选.scel',
  153.     '常用餐饮词汇.scel',
  154.     '成语.scel',
  155.     '成语俗语【官方推荐】.scel',
  156.     '法律词汇大全【官方推荐】.scel',
  157.     '房地产词汇大全【官方推荐】.scel',
  158.     '手机词汇大全【官方推荐】.scel',
  159.     '网络流行新词【官方推荐】.scel',
  160.     '歇后语集锦【官方推荐】.scel',
  161.     '饮食大全【官方推荐】.scel',
  162.     ]
  163.     
  164.     for f in o:
  165.         deal(f)
  166.         
  167.     #保存结果  
  168.     f = open('sougou.txt','w')
  169.     for count,py,word in GTable:
  170.         #GTable保存着结果,是一个列表,每个元素是一个元组(词频,拼音,中文词组),有需要的话可以保存成自己需要个格式
  171.         #我没排序,所以结果是按照上面输入文件的顺序
  172.         f.write( unicode('{%(count)s}' %{'count':count}+py+' '+ word).encode('GB18030') )#最终保存文件的编码,可以自给改
  173.         f.write('n')
  174.     f.close()    


标签:词库