• 大小: 0.01M
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: Python
  • 标签: 其他  

资源简介

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 < len(data):
        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 < len(data):
        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 < len(data):
        index = struct.unpack(‘H‘ bytes([data[pos] data[pos + 1]]))[0]
        ret += GPy_Table[index]

评论

共有 条评论