python的成语接龙程序代码_基于Python经典版成语接龙逻辑实现
import structimport os
# 搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母)
# 找出其每部分的偏移位置即可
# 主要两部分
#1.全局拼音表,貌似是所有的拼音组合,字典序
# 格式为(index,len,pinyin)的列表
# index: 两个字节的整数 代表这个拼音的索引
# len: 两个字节的整数 拼音的字节长度
# pinyin: 当前的拼音,每个字符两个字节,总长len
#
#2.汉语词组表
# 格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表
# same: 两个字节 整数 同音词数量
# py_table_len: 两个字节 整数
# py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引
#
# word_len:两个字节 整数 代表中文词组字节数长度
# word: 中文词组,每个中文汉字两个字节,总长度word_len
# ext_len: 两个字节 整数 代表扩展信息的长度,好像都是10
# ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0
#
# {word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表
# 拼音表偏移,
startPy= 0x1540;
# 汉语词组表偏移
startChinese= 0x2628;
# 全局拼音表
GPy_Table={}
# 解析结果
# 元组(词频,拼音,中文词组)的列表
GTable=[]
# 原始字节码转为字符串
def byte2str(data):
pos= 0str= ''
while pos
c= chr(struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0])if c != chr(0):
str+=c
pos+= 2
returnstr
# 获取拼音表
def getPyTable(data):
data= data[4:]
pos= 0
while pos
index= struct.unpack('H', bytes([data[pos],data[pos + 1]]))[0]
pos+= 2lenPy= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
pos+= 2py= byte2str(data[pos:pos +lenPy])
GPy_Table[index]=py
pos+=lenPy
# 获取一个词组的拼音
def getWordPy(data):
pos= 0ret= ''
while pos
index= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
ret+=GPy_Table[index]
pos+= 2
returnret
# 读取中文表
def getChinese(data):
pos= 0
while pos
# 同音词数量
same= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
# 拼音索引表长度
pos+= 2py_table_len= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
# 拼音索引表
pos+= 2py= getWordPy(data[pos: pos +py_table_len])
# 中文词组
pos+=py_table_lenfor i inrange(same):
# 中文词组长度
c_len= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
# 中文词组
pos+= 2word= byte2str(data[pos: pos +c_len])
# 扩展数据长度
pos+=c_len
ext_len= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
# 词频
pos+= 2count= struct.unpack('H', bytes([data[pos], data[pos + 1]]))[0]
# 保存
GTable.append((count, py, word))
# 到下个词的偏移位置
pos+=ext_len
def scel2txt(file_name):
print('-' * 60)
with open(file_name,'rb') asf:
data=f.read()
print("词库名:", byte2str(data[0x130:0x338])) # .encode('GB18030')
print("词库类型:", byte2str(data[0x338:0x540]))
print("描述信息:", byte2str(data[0x540:0xd40]))
print("词库示例:", byte2str(data[0xd40:startPy]))
getPyTable(data[startPy:startChinese])
getChinese(data[startChinese:])if __name__ == '__main__':
# scel所在文件夹路径
in_path= "E:\python_workspace"# 输出词典所在文件夹路径
out_path= "coal_dict.txt"fin= [fname for fname in os.listdir(in_path) if fname[-5:] == ".scel"]for f infin:
f=os.path.join(in_path, f)
scel2txt(f)
# 保存结果
with open(out_path,'w', encoding='utf8') asf:
f.writelines([word+'\n' for count, py, word in GTable])
python的成语接龙程序代码_基于Python经典版成语接龙逻辑实现相关推荐
- python名片打印程序代码_基于Python的名片识别接口调用代码实例
#!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib import urlencode #-------- ...
- python 运行程序代码_一些python程序
<从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...
- python点名代码_基于python tkinter的点名小程序功能的实例代码
基于python tkinter的点名小程序功能的实例代码,花名册,次数,窗口,未找到,初始化 基于python tkinter的点名小程序功能的实例代码 易采站长站,站长之家为您整理了基于pytho ...
- python利用pandas合并excel表格代码_利用Python pandas对Excel进行合并的方法示例
前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...
- 随机数写excel java代码_基于python实现在excel中读取与生成随机数写入excel中
搜索热词 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再生成随机数作为学生的考试成绩. 首先要用到的数据库有:xlwt,xlr ...
- python的坐标代码_基于Python的地图坐标服务接口调用代码实例
代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...
- python三维重建代码_基于Python的三维重建开源代码
[实例简介] 基于Python的三维重建开源代码,包括特征提取,SFM,PMVS以及CMVS等相关功能! [实例截图] [核心代码] sfm-bundler(python) └── sfm-bundl ...
- 编写python手机充值代码_基于Python的天聚人合加油卡充值接口调用代码实例
一.接口申请开通 本代码是基于天聚人合的话费充值API实现的话费充值功能,使用前需要: 通过https://www.tianjurenhe.com/docs/api/?id=1申请开通话费接口服务. ...
- python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
最新文章
- 远程桌面中Tab键不能补全的解决办法
- eclipse手动安装alibaba代码规范插件
- 嵌入式烤箱能不能放台面上_2021年开放式厨房怎么设计?先来做做嵌入式家电的功课吧!...
- Vue2 源码漫游(一)
- TCP/IP是如何实现可靠传输的
- 【Redis】redis cluster 添加 删除 重分配 节点
- WPF Rendering 2(硬件加速、软件加速)
- 天堂2服务器自动停止,为什么我一进天堂2就与服务器连接中断??/
- 【学习笔记】文献检索课程总结
- 数据结构与算法分析Java语言描述 第三版 课后习题 练习 答案
- NShape(开源矢量图形编辑器) 基本功能开发(一)
- 数据交换技术(*):电路交换,报文交换,分组交换的概念,特点和优缺点以及存储转发技术概念
- 何水无鱼?何山无石?何人无父?何女无夫?何树无枝?何城无市?
- Unity3D中Quaternion.Euler方法解析
- educoder算法设计与分析 实验一扩展 袋鼠过河问题
- PAT考试乙级1024(C语言实现)重点题目
- window下利用ip反查域名与利用域名查ip
- 经典动态规划:编辑距离
- MT6572,JB3,EMMC换nandflash问题!
- Typora 基本使用操作