資源簡介
scel2txt.py
代碼片段和文件信息
#!/usr/bin/env?python
#?_*_?coding:utf-8?_*_
#
#?@Version?:?1.0
#?@Time????:?2018/8/17
#?@Author??:?圈圈烴
#?@File????:?scel2txt.py
#?@Description:?將搜狗的詞庫.scel文件轉化為.txt文件
#?本人在之前作者的基礎上進行了部分修改
#?添加了單個文件轉化函數single_file()
#?添加了多個文件轉化函數batch_file()
#
import?struct
import?os
############################################################################
#?第二原作者
#?由于原代碼不適用python3且有大量bug
#?以及有函數沒有必要使用且一些代碼書寫不太規范或冗余
#?所以本人在原有的大框架基本不動的情況下作了大量的細節更改
#?使得沒有亂碼出現,文件夾導入更方便等等
#?Author:Ling?Yue?Taiyuan?U?of?Tech
#?Blog:?http://blog.yueling.me
############################################################################
#?原作者:
#?搜狗的scel詞庫就是保存的文本的unicode編碼,每兩個字節一個字符(中文漢字或者英文字母)
#?找出其每部分的偏移位置即可
#?主要兩部分
#?1.全局拼音表,貌似是所有的拼音組合,字典序
#???????格式為(indexlenpinyin)的列表
#???????index:?兩個字節的整數?代表這個拼音的索引
#???????len:?兩個字節的整數?拼音的字節長度
#???????pinyin:?當前的拼音,每個字符兩個字節,總長len
#
#?2.漢語詞組表
#???????格式為(samepy_table_lenpy_table{word_lenwordext_lenext})的一個列表
#???????same:?兩個字節?整數?同音詞數量
#???????py_table_len:??兩個字節?整數
#???????py_table:?整數列表,每個整數兩個字節每個整數代表一個拼音的索引
#
#???????word_len:兩個字節?整數?代表中文詞組字節數長度
#???????word:?中文詞組每個中文漢字兩個字節,總長度word_len
#???????ext_len:?兩個字節?整數?代表擴展信息的長度,好像都是10
#???????ext:?擴展信息?前兩個字節是一個整數(不知道是不是詞頻)?后八個字節全是0
#
#??????{word_lenwordext_lenext}?一共重復same次?同音詞?相同拼音表
#############################################################################
#?拼音表偏移
startPy?=?0x1540;
#?漢語詞組表偏移
startChinese?=?0x2628;
#?全局拼音表
GPy_Table?=?{}
#?解析結果
#?元組(詞頻拼音中文詞組)的列表
GTable?=?[]
def?byte2str(data):
????“““
????原始字節碼轉為字符串
????:param?data:
????:return:
????“““
????pos?=?0
????str?=?‘‘
????while?pos?????????c?=?chr(struct.unpack(‘H‘?bytes([data[pos]?data[pos?+?1]]))[0])
????????if?c?!=?chr(0):
????????????str?+=?c
????????pos?+=?2
????return?str
def?getPyTable(data):
????“““
????獲取拼音表
????:param?data:
????:return:
????“““
????data?=?data[4:]
????pos?=?0
????while?pos?????????index?=?struct.unpack(‘H‘?bytes([data[pos]?data[pos?+?1]]))[0]
????????pos?+=?2
????????lenPy?=?struct.unpack(‘H‘?bytes([data[pos]?data[pos?+?1]]))[0]
????????pos?+=?2
????????py?=?byte2str(data[pos:pos?+?lenPy])
????????GPy_Table[index]?=?py
????????pos?+=?lenPy
def?getWordPy(data):
????“““
????獲取一個詞組的拼音
????:param?data:
????:return:
????“““
????pos?=?0
????ret?=?‘‘
????while?pos?????????index?=?struct.unpack(‘H‘?bytes([data[pos]?data[pos?+?1]]))[0]
????????ret?+=?GPy_Table[index]
評論
共有 條評論