热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

输入法词库解析(二)搜狗拼音细胞词库.scel

前面很多空字节的地方不用管,是一些描述信息,词库名、示例词等。0x124跟的4个字节是词条数,新的scel在文件最后面可能有违禁词(黑名单词)。拼音表直接从0x1540开始。前两个

前面很多空字节的地方不用管,是一些描述信息,词库名、示例词等。

0x124 跟的 4 个字节是词条数,新的 scel 在文件最后面可能有违禁词(黑名单词)。


拼音表

直接从 0x1540 开始。

前两个字节是拼音表的长度,这里面都是按小端算的。

这里 9D 01 就表示有 0x100 * 0x01 + 0x9D = 413 组。

后两个字节意义不明,一般是 0。

从 0x1544 开始就是拼音表正文部分。























占用字节数描述
2索引,从 00 00 到 9C 01
2拼音字节的长度
由上一项决定拼音,utf-16le 编码,一个字母占 2 字节。

词条

偏移量 0x2628







































占用字节数描述
2同一个音有多少词
2拼音索引的字节长度
由上一项决定拼音索引数组
2词占用字节数
由上一项决定词,utf-16le 编码
2描述信息字节长度
由上一项决定描述


带英文词库的索引

从拼音表的长度往后,依次是 abcd。比如表长 413,最大索引9D 01,则下一个索引9E 01表示字母 a,依次类推。


golang 代码实现


func ParseSougouScel(rd io.Reader) []Pinyin {
ret := make([]Pinyin, 0, 1e5)
data, _ := ioutil.ReadAll(rd)
r := bytes.NewReader(data)
// utf-16le 转换器
decoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder()
// 读词条数
tmp := make([]byte, 4)
r.Seek(0x124, 0)
r.Read(tmp)
dictLen := bytesToInt(tmp)
// 拼音表偏移量
r.Seek(0x1540, 0)
// 前两个字节是拼音表长度,413
tmp = make([]byte, 2)
r.Read(tmp)
pyTableLen := bytesToInt(tmp)
pyTable := make([]string, pyTableLen)
// fmt.Println("拼音表长度", pyTableLen)
// 丢掉两个字节
r.Read(tmp)
// 读拼音表
for i := 0; i // 索引
tmp := make([]byte, 2)
r.Read(tmp)
idx := bytesToInt(tmp)
// 拼音长度
r.Read(tmp)
pyLen := bytesToInt(tmp)
// 拼音 utf-16le
pySli := make([]byte, pyLen)
r.Read(pySli)
py, _ := decoder.Bytes(pySli)
pyTable[idx] = string(py)
}
// 读码表
for count := 0; count // 重码数(同一串音对应多个词)
tmp := make([]byte, 2)
r.Read(tmp)
repeat := bytesToInt(tmp)
// 索引数组长
r.Read(tmp)
codeLen := bytesToInt(tmp)
// 读取编码
var code []string
for i := 0; 2*i r.Read(tmp)
theIdx := bytesToInt(tmp)
if theIdx >= pyTableLen {
code = append(code, string(byte(theIdx-pyTableLen+97)))
continue
}
code = append(code, pyTable[theIdx])
}
// 读取一个或多个词
count += repeat
for i := 1; i <= repeat; i++ {
// 词长
r.Read(tmp)
wordLen := bytesToInt(tmp)
// 读取词
wordSli := make([]byte, wordLen)
r.Read(wordSli)
wordSli, _ = decoder.Bytes(wordSli)
word := string(wordSli)
ret = append(ret, Pinyin{word, code, 1})
// 末尾的补充信息
r.Read(tmp)
infoLen := bytesToInt(tmp)
info := make([]byte, infoLen)
r.Read(info)
}
}
return ret
}


推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 如何将人人影视下载的字幕添加到视频中
    许多用户在下载了人人影视提供的字幕后,不清楚如何将其与视频文件结合。本文将详细介绍如何正确地将字幕加载到视频中,确保观看体验更加完整。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 在API测试中,我们常常需要通过大量不同的数据集(包括正常和异常情况)来验证同一个接口。如果为每种场景单独编写测试用例,不仅繁琐而且效率低下。采用数据驱动的方式可以有效简化这一过程。本文将详细介绍如何利用CSV文件进行数据驱动的API测试。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
author-avatar
手机用户2502855061
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有