Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1204876
  • 博文数量: 252
  • 博客积分: 5421
  • 博客等级: 大校
  • 技术积分: 2418
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-17 12:59
文章分类

全部博文(252)

文章存档

2017年(3)

2016年(18)

2015年(31)

2014年(18)

2013年(7)

2012年(8)

2011年(12)

2010年(30)

2009年(32)

2008年(57)

2007年(36)

分类: Python/Ruby

2014-08-11 15:56:05

From:
------------------------------------------------------------

将搜狗(sogou)的细胞词库转换为mmseg的词库

功能:

  • scel2mmseg.py: 将.scel文件转换为mmseg格式的.txt文件

    使用方法: python scel2mmseg.py a.scel a.txt

    批量转换方法:python scel2mmseg.py scel文件目录 a.txt

    说明:新增加的所有词的词频都为1,对于格式的解释如下:[摘自 ]

    每条记录分两行。其中,第一行为词项,其格式为:[词条]\t[词频率]。需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率需要在 大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。第二行为占位项,是由于 LibMMSeg库的代码是从Coreseek其他的分词算法库(N-gram模型)中改造而来的,在原来的应用中,第二行为该词在各种词性下的分布频 率。LibMMSeg的用户只需要简单的在第二行处填”x:1″即可

  • mergedict.py: 将mmseg的多个.txt文件合并为一个.txt

    使用方法: python mergedict.py unigram.txt b.txt c.txt new.txt

    说明: .txt可以使mmseg格式的,也可以是每行一个词的格式(这样词频默认为1)

    注意:因为merge的时候会判重,一个词在前面出现过,就不会追加到新产生的文件中,所以要将unigram.txt放到最前面

------------------------------------------------------------


scel2mmseg.py:
------------------------------------------------------------

  1. import struct
  2. import os, sys, glob

  3. def read_utf16_str (f, offset=-1, len=2):
  4.     if offset >= 0:
  5.         f.seek(offset)
  6.     str = f.read(len)
  7.     return str.decode('UTF-16LE')

  8. def read_uint16 (f):
  9.     return struct.unpack (', f.read(2))[0]

  10. def get_word_from_sogou_cell_dict (fname):
  11.     f = open (fname, 'rb')
  12.     file_size = os.path.getsize (fname)
  13.     
  14.     hz_offset = 0
  15.     mask = struct.unpack ('B', f.read(128)[4])[0]
  16.     if mask == 0x44:
  17.         hz_offset = 0x2628
  18.     elif mask == 0x45:
  19.         hz_offset = 0x26c4
  20.     else:
  21.         sys.exit(1)
  22.     
  23.     title = read_utf16_str (f, 0x130, 0x338 - 0x130)
  24.     type = read_utf16_str (f, 0x338, 0x540 - 0x338)
  25.     desc = read_utf16_str (f, 0x540, 0xd40 - 0x540)
  26.     samples = read_utf16_str (f, 0xd40, 0x1540 - 0xd40)
  27.     
  28.     py_map = {}
  29.     f.seek(0x1540+4)
  30.     
  31.     while 1:
  32.         py_code = read_uint16 (f)
  33.         py_len = read_uint16 (f)
  34.         py_str = read_utf16_str (f, -1, py_len)
  35.     
  36.         if py_code not in py_map:
  37.             py_map[py_code] = py_str
  38.     
  39.         if py_str == 'zuo':
  40.             break
  41.     
  42.     f.seek(hz_offset)
  43.     while f.tell() != file_size:
  44.         word_count = read_uint16 (f)
  45.         pinyin_count = read_uint16 (f) / 2
  46.     
  47.         py_set = []
  48.         for i in range(pinyin_count):
  49.             py_id = read_uint16(f)
  50.             py_set.append(py_map[py_id])
  51.         py_str = "'".join (py_set)

  52.         for i in range(word_count):
  53.             word_len = read_uint16(f)
  54.             word_str = read_utf16_str (f, -1, word_len)
  55.             f.read(12)
  56.             yield py_str, word_str

  57.     f.close()

  58. def showtxt (records):
  59.     for (pystr, utf8str) in records:
  60.         print len(utf8str), utf8str

  61. def store(records, f):
  62.     for (pystr, utf8str) in records:
  63.         f.write("%s\t1\n" %(utf8str.encode("utf8")))
  64.         f.write("x:1\n")

  65. def main ():
  66.     if len (sys.argv) != 3:
  67.         print "Unknown Option \n usage: python %s file.scel new.txt" %(sys.argv[0])
  68.         exit (1)
  69.     
  70.     #Specify the param of scel path as a directory, you can place many scel file in this dirctory, the this process will combine the result in one txt file
  71.     if os.path.isdir(sys.argv[1]):
  72.         for fileName in glob.glob(sys.argv[1] + '*.scel'):
  73.             print fileName
  74.             generator = get_word_from_sogou_cell_dict(fileName)
  75.             with open(sys.argv[2], "a") as f:
  76.                 store(generator, f)

  77.     else:
  78.         generator = get_word_from_sogou_cell_dict (sys.argv[1])
  79.         with open(sys.argv[2], "w") as f:
  80.             store(generator, f)
  81.             #showtxt(generator)

  82. if __name__ == "__main__":
  83.     main()

------------------------------------------------------------
阅读(2151) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~