Skip to content

Instantly share code, notes, and snippets.

@alswl
Created February 14, 2016 07:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alswl/92ef2386b6151683c33c to your computer and use it in GitHub Desktop.
Save alswl/92ef2386b6151683c33c to your computer and use it in GitHub Desktop.
「鼠须管」导入搜狗 Bin 词库
# -*- coding: UTF-8 -*-
import sys
import struct
import codecs
PinYinDic = [
"a",
"ai",
"an",
"ang",
"ao",
"ba",
"bai",
"ban",
"bang",
"bao",
"bei",
"ben",
"beng",
"bi",
"bian",
"biao",
"bie",
"bin",
"bing",
"bo",
"bu",
"ca",
"cai",
"can",
"cang",
"cao",
"ce",
"cen",
"ceng",
"cha",
"chai",
"chan",
"chang",
"chao",
"che",
"chen",
"cheng",
"chi",
"chong",
"chou",
"chu",
"chua",
"chuai",
"chuan",
"chuang",
"chui",
"chun",
"chuo",
"ci",
"cong",
"cou",
"cu",
"cuan",
"cui",
"cun",
"cuo",
"da",
"dai",
"dan",
"dang",
"dao",
"de",
"dei",
"den",
"deng",
"di",
"dia",
"dian",
"diao",
"die",
"ding",
"diu",
"dong",
"dou",
"du",
"duan",
"dui",
"dun",
"duo",
"e",
"ei",
"en",
"eng",
"er",
"fa",
"fan",
"fang",
"fei",
"fen",
"feng",
"fiao",
"fo",
"fou",
"fu",
"ga",
"gai",
"gan",
"gang",
"gao",
"ge",
"gei",
"gen",
"geng",
"gong",
"gou",
"gu",
"gua",
"guai",
"guan",
"guang",
"gui",
"gun",
"guo",
"ha",
"hai",
"han",
"hang",
"hao",
"he",
"hei",
"hen",
"heng",
"hong",
"hou",
"hu",
"hua",
"huai",
"huan",
"huang",
"hui",
"hun",
"huo",
"ji",
"jia",
"jian",
"jiang",
"jiao",
"jie",
"jin",
"jing",
"jiong",
"jiu",
"ju",
"juan",
"jue",
"jun",
"ka",
"kai",
"kan",
"kang",
"kao",
"ke",
"kei",
"ken",
"keng",
"kong",
"kou",
"ku",
"kua",
"kuai",
"kuan",
"kuang",
"kui",
"kun",
"kuo",
"la",
"lai",
"lan",
"lang",
"lao",
"le",
"lei",
"leng",
"li",
"lia",
"lian",
"liang",
"liao",
"lie",
"lin",
"ling",
"liu",
"lo",
"long",
"lou",
"lu",
"luan",
"lue",
"lun",
"luo",
"lv",
"ma",
"mai",
"man",
"mang",
"mao",
"me",
"mei",
"men",
"meng",
"mi",
"mian",
"miao",
"mie",
"min",
"ming",
"miu",
"mo",
"mou",
"mu",
"na",
"nai",
"nan",
"nang",
"nao",
"ne",
"nei",
"nen",
"neng",
"ni",
"nian",
"niang",
"niao",
"nie",
"nin",
"ning",
"niu",
"nong",
"nou",
"nu",
"nun",
"nuan",
"nue",
"nuo",
"nv",
"o",
"ou",
"pa",
"pai",
"pan",
"pang",
"pao",
"pei",
"pen",
"peng",
"pi",
"pian",
"piao",
"pie",
"pin",
"ping",
"po",
"pou",
"pu",
"qi",
"qia",
"qian",
"qiang",
"qiao",
"qie",
"qin",
"qing",
"qiong",
"qiu",
"qu",
"quan",
"que",
"qun",
"ran",
"rang",
"rao",
"re",
"ren",
"reng",
"ri",
"rong",
"rou",
"ru",
"rua",
"ruan",
"rui",
"run",
"ruo",
"sa",
"sai",
"san",
"sang",
"sao",
"se",
"sen",
"seng",
"sha",
"shai",
"shan",
"shang",
"shao",
"she",
"shei",
"shen",
"sheng",
"shi",
"shou",
"shu",
"shua",
"shuai",
"shuan",
"shuang",
"shui",
"shun",
"shuo",
"si",
"song",
"sou",
"su",
"suan",
"sui",
"sun",
"suo",
"ta",
"tai",
"tan",
"tang",
"tao",
"te",
"tei",
"teng",
"ti",
"tian",
"tiao",
"tie",
"ting",
"tong",
"tou",
"tu",
"tuan",
"tui",
"tun",
"tuo",
"wa",
"wai",
"wan",
"wang",
"wei",
"wen",
"weng",
"wo",
"wu",
"xi",
"xia",
"xian",
"xiang",
"xiao",
"xie",
"xin",
"xing",
"xiong",
"xiu",
"xu",
"xuan",
"xue",
"xun",
"ya",
"yan",
"yang",
"yao",
"ye",
"yi",
"yin",
"ying",
"yo",
"yong",
"you",
"yu",
"yuan",
"yue",
"yun",
"za",
"zai",
"zan",
"zang",
"zao",
"ze",
"zei",
"zen",
"zeng",
"zha",
"zhai",
"zhan",
"zhang",
"zhao",
"zhe",
"zhei",
"zhen",
"zheng",
"zhi",
"zhong",
"zhou",
"zhu",
"zhua",
"zhuai",
"zhuan",
"zhuang",
"zhui",
"zhun",
"zhuo",
"zi",
"zong",
"zou",
"zu",
"zuan",
"zui",
"zun",
"zuo",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z"
]
def read_int_16(f):
byte = f.read(2)
byte = struct.unpack("<h", byte)
return byte[0]
def read_int_32(f):
byte = f.read(4)
byte = struct.unpack("<L", byte)
return byte[0]
def read_bin_file(path):
with open(path, "rb") as f:
f.seek(0x18, 0)
total_word_count = read_int_32(f)
print "Total word is %s" % total_word_count
current_word_num = 0
f.seek(0x30, 0)
res = []
while current_word_num < total_word_count :
same_py_count = read_int_16(f)
unknow_var = read_int_16(f)
py_count = read_int_16(f) / 2
py_str = []
for i in range(py_count):
idx = read_int_16(f)
if idx < len(PinYinDic) and idx >= 0:
py_str.append(PinYinDic[idx])
else:
py_str.append("--")
for i in range(same_py_count):
word_count = read_int_16(f)
word = codecs.utf_16_le_decode(f.read(word_count))[0]
count = read_int_16(f)
count2 = read_int_16(f)
unknow_var2 = read_int_32(f)
word_dic = {"count":count, "word": word, "pinyin": py_str}
res.append(word_dic)
print "current_word_num: %s and pinyin %s" % (current_word_num, py_str)
current_word_num += 1
return res
def try_pinyin():
print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)
if len(sys.argv) == 2:
print PinYinDic[int(sys.argv[1])]
def save_words_to_path(filename, words):
f = codecs.open(filename, "w", "utf-8")
for word in words:
f.write(u"%s\t%s\t%d\n" % (word["word"], " ".join(word["pinyin"]), word["count"]))
print "共写入 %d 词组" % len(words)
f.close()
if __name__ == "__main__":
path = "/Users/用户名/Library/Input Methods/Sogou/SogouPY.users/00000001/sgim_usr_v1.bin"
res = read_bin_file(path)
print res[0]
save_words_to_path("user.dic", res)
@alswl
Copy link
Author

alswl commented Feb 14, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment