ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

深蓝词库转换 scel 导出实现解析:从搜狗细胞词库二进制结构到 `-o scel` 双向转换

深蓝词库转换 scel 导出实现解析:从搜狗细胞词库二进制结构到 `-o scel` 双向转换 桌面应用CLI开发工具【免费下载链接】imewlconverter”深蓝词库转换“ 一款开源免费的输入法词库转换程序项目地址https://gitcode.com/gh_mirrors/im/imewlconverter点击查看免费下载导读搜狗细胞词库.scel是搜狗输入法专有的二进制词库格式也是中文输入法词库生态中流传最广的载体之一。本文以开源项目深蓝词库转换IME WL Converter中导出 scel功能的设计与实现为主线完整讲解 scel 文件的五段式二进制结构文件头、统计信息区、元信息区、拼音表、词条数据区、六项关键设计决策含 unknown 字段默认值、magic number、同音词归组等并结合 导出器源码 与 单元测试 给出可复现的 CLI 命令与验证方法。读完本文你将理解 scel 格式的本质并能通过imewlconverter -i ggpy -o scel -O output.scel input.txt把任意拼音词库转换为可被搜狗输入法直接导入的细胞词库。一、背景为什么需要补全 scel 导出能力深蓝词库转换在引入本功能前只具备 scel 的单向解析能力通过逆向工程解明 scel 二进制格式后SougouScelImporter历史上称SougouPinyinScel实现了从.scel文件读取词条的 Import 逻辑见 SougouScelImporter.cs但不支持把其他输入法的词库反向导出为.scel。这导致大量用户场景被切断许多人希望把自用词库、其他输入法谷歌拼音、QQ 拼音、Rime、微软拼音等的词库整理后导入搜狗输入法使用。补全导出能力后scel 才真正成为双向转换格式——既能导入也能导出形成完整闭环。这一需求在社区中长期存在也是本功能被立项的核心动因详见 proposal.md。二、scel 文件的五段式二进制结构设计文档design.md给出了通过逆向工程得出的 scel 整体布局。所有整数均为小端序LE所有文本均为UTF-16LE编码。文件从偏移 0x0000 起依次划分为五个区域区域偏移范围内容编码/类型文件头0x0000 – 0x011Fmagic number 保留区域含校验和、随机文件 ID、Unix 时间戳原始字节统计信息区0x0120 – 0x012F词组数 dictLen、词条总数、拼音总字节、词条数据字节Int32 LE元信息区0x0130 – 0x153F名称、类型、描述、示例词UTF-16LE定长字段拼音表0x1540 起Int32 条目数 逐条索引号、字节长度、拼音串Int16/Int32 LE UTF-16LE词条数据区紧跟拼音表按同音词组组织的词条数据见下文关键偏移约定0x0120处的dictLen是词组数同音词合并后计数不展开0x0124处才是展开后的词条总数元信息区四个定长字段名称0x0130520 字节、类型0x0338520 字节、描述0x05402048 字节、示例词0x0D402048 字节均以\0结尾拼音表固定从0x1540开始。注意上述 0x1540 的固定起点还隐含一个约束——写入拼音表时之前所有区域必须恰好填满到该偏移因此文件头与元信息区都按固定字节数补齐这正是导出器必须精确控制每个字段长度的原因。三、设计目标与非目标设计文档明确划定了本功能的边界目标实现导出接口将内部词库对象WordLibraryList当前架构中对应IReadOnlyListWordEntry序列化为合法的 scel 二进制文件生成的文件可被搜狗输入法正常识别并导入CLI 支持-o scel参数与现有导出架构保持一致。非目标明确不做不实现 scel 元信息自定义名称、类型、描述使用默认值即可不解析 unknown 字段的具体含义使用已验证的安全默认值不支持搜狗词库的加密格式不支持 .scel → .scel 的元信息保留转换后视为新文件。这些边界在 spec.md 中被细化为可验收的场景文件头以40 15 00 00 44 43 53 01开头、统计信息正确、元信息区完整、拼音表覆盖全部音节、同音词合并写入且same_py_count正确、CLI 支持-o scel、词条拼音完整性得到保证。四、六项关键设计决策与源码实现决策 1在现有类上新增导出实现而非新建独立类设计文档选择了在现有SougouPinyinScel类上新增导出实现的方案理由有三项目中其他格式QQPinyin、GooglePinyin、Rime 等均在同一个类上同时实现 Import 与 Export导出需要复用已有的拼音表结构和格式常量保持架构一致性。从当前代码库看这一决策最终演进为独立的SougouScelExporter/SougouScelImporter成对类位于 src/ImeWlConverter.Formats/SougouScel/两者通过[FormatPlugin(scel, 搜狗细胞词库scel, 20, FileExtension .scel)]特性注册由源生成器ImeWlConverter.SourceGenerators自动收集进格式注册表。这与设计文档保持架构一致性的意图一脉相承只是实现形态随项目整体重构而演进。决策 2二进制导出不走文本返回而是直接写流设计文档记录了导出接口演进的关键难点旧版IWordLibraryExport.Export()返回IListstring文本行而 scel 是二进制格式二者语义不匹配。当时考虑过的替代方案包括Base64 编码后塞进文本返回值不优雅、破坏语义和在 ExportLine 抛异常与 Import 端行为一致、可接受。当前仓库的最终答案是流式导出IFormatExporter接口见 IFormatExporter.cs统一提供TaskExportResult ExportAsync(IReadOnlyListWordEntry entries, Stream output, ExportOptions? options null, CancellationToken ct default)由 ConversionPipeline 负责创建文件流File.Create(request.OutputPath)并调用导出器写入。scel 导出器完全基于Stream顺序写入字节从而绕开了文本返回值承载二进制的架构难题同时保证 CLI、GUI 共用同一套导出路径。决策 3拼音表使用完整标准音节表413 个按索引映射设计文档选择从WordLibraryList收集去重拼音并按字母序排序作为方案同时指出搜狗原始文件约含 413 个标准汉语拼音音节并可使用项目已有的拼音资源保证兼容性。源码实现SougouScelExporter.cs最终采用了更稳妥的做法直接内嵌完整的 413 音节标准表StandardPinyinTablea、ai、an……直到zuo导出时BuildPinyinIndex()把 413 个音节映射为拼音 → 索引号字典每个词条的拼音逐音节查表得到索引数组WritePinyinTable()在 0x1540 处先写条目数413再逐条写入(Int16 索引号, Int16 字节长度, UTF-16LE 拼音串)。固定 413 音节表的优势是拼音表本身完整、稳定与搜狗官方文件的表结构高度一致词条数据区只需用 2 字节索引引用拼音无需为每个词条重复写拼音串大幅压缩文件体积。决策 4unknown 字段使用已验证的安全默认值scel 词条数据中携带若干未知含义字段设计文档基于大量样本分析给出默认值策略字段大小默认值理由unknown12 字节10即 0x000A所有观察样本中此值恒为 10unknown24 字节0含义无法确定0 为安全默认值extra6 字节全零同上源码中对应 WriteWordData()每个词条写完汉字后固定追加 12 字节0A 00 2D 00 00 00 00 00 00 00 00 00——其中前 2 字节即 unknown1100x000A后 4 字节 unknown200x0000002D 是 45这是0x00 2D两字节小端即 0x2D0011520不按字节排列为0A 0010、2D 00 00 0045。设计文档与实现略有出入实现中 unknown2 写的是 0x2D45 而非 0但核心结论不变搜狗输入法导入时主要校验文件头 magic number、拼音表完整性和词条数据格式这些附加字段不影响导入。以实测为准导入端SougouScelImporter读取时也只是简单跳过这 12 字节见 SougouScelImporter.cs并不校验其取值从侧面印证了这些字段的宽容语义。决策 5固定 8 字节 magic number设计文档规定文件头使用固定值40 15 00 00 44 43 53 01其余保留区域填充 0理由是所有合法 scel 文件均以此 8 字节开头搜狗输入法通过这些字节识别文件格式。源码在 WriteHeader() 中除了 8 字节签名还按逆向结果补齐了4 字节标志位01 00 00 00偏移 0x000C 起16 字节校验和占位写完词条数据后回填见下文偏移 0x001C 起 12 字节随机文件 ID6 位随机数转 UTF-16LE填充至 0x011C 后写入 4 字节Unix 时间戳。单元测试TestExportBasicScel见 SougouPinyinScelExportTest.cs逐一断言了这 8 个签名字节与统计区数值。决策 6同音词必须归并为同一词组scel 格式要求相同拼音序列的词条写入同一个词组块词组头 拼音索引数组 词条列表且 0x0120 的dictLen统计的是词组数而非词条数。设计文档要求将具有相同拼音序列的词条合并为同音词组按拼音序排列写入理由一是格式约束二是利于搜狗输入法内部索引查找。源码GroupByPinyin()SougouScelExporter.cs的实现要点以string.Join(, normalized)作为分组 key同 key 词条并入同一PinyinWordGroup词组的PinyinIndices只存一份索引数组Words收集该组全部同音词最终按索引序列字典序转 4 位补零字符串排序输出保证词组顺序稳定可复现。词组写入格式WriteWordData()为词组头部same_py_countN (UInt16) | pinyin_byte_lenM*2 (UInt16) 拼音索引数组M 个 UInt16每个 2 字节 词条列表N 个 汉字字节数 (UInt16) | 汉字 UTF-16LE | unknown1 (2B) | unknown2 (4B) | extra (6B)单元测试TestExportWithSamePinyin验证世界(shijie)与石阶(shijie)归为一组、实际(shiji)独立一组时词组数应为 2、词条总数应为 3。五、导出全流程从词条集合到二进制文件综合上述决策SougouScelExporter.ExportAsync()的完整执行序列源码为构建拼音索引BuildPinyinIndex()建立 413 音节 → 索引字典同音词归组GroupByPinyin()提取每个WordEntry的拼音分段Code.Segments每段取首个音节、标准化、查表过滤、分组排序预计算统计量词组数、词条总数、拼音索引总字节数cSize、汉字总字节数wSize供统计信息区使用写文件头magic number 标志位 校验和占位 随机文件 ID 时间戳写统计信息0x0120 处依次写入词组数 | 词条总数 | cSize | wSize四个 Int32写元信息默认名称深蓝词库转换、类型自定义、描述由深蓝词库转换工具生成示例词取前 5 个词条拼接写拼音表413 条目数 逐条索引/长度/拼音串写词条数据区逐词组写入头部、索引数组、词条列表回填校验和读回 0x1540 之后的所有字节用搜狗专用校验和算法SougouCheckSum一个基于 MD5 变体的 4 轮分组散列见 源码计算 16 字节结果写回 0x000C 处的占位区。其中步骤 9 是容易被忽略的关键细节校验和必须覆盖拼音表 词条数据区的全部字节因此必须先写完数据、回读计算、再回填到文件头。WriteHeader中预留 16 字节正是为此。拼音标准化与无效词条处理spec 要求带声调数字、大写等非标准拼音必须转换为小写无声调格式。源码NormalizePinyin()SougouScelExporter.cs对每个音节执行ToLower()并TrimEnd(0..5)剥离声调数字后缀。而查表不命中的音节如xxx会导致该词条整条跳过——单元测试TestSkipWordsWithInvalidPinyin验证了含非法拼音的词条不进入输出最终词条总数只统计合法词条。设计文档的对应风险项词条拼音信息不完整在规范层面由导出前依赖 PinyinGenerater 补全拼音无法生成则跳过并报错来兜底见 spec.md 的词条拼音完整性保证一节。六、CLI 实战把其他词库导出为 scel当前 CLI 采用 GNU 风格参数见 CommandBuilder.csscel 作为标准输出格式注册直接可用# 将谷歌拼音词库 input.txt 导出为 output.scel imewlconverter -i ggpy -o scel -O output.scel input.txt # 等价写法长选项 imewlconverter --input-format ggpy --output-format scel --output output.scel input.txt # 从搜狗 scel 导入后再导出scel → scel 转换 imewlconverter -i scel -o scel -O output.scel input.scel要点-o scel即输出格式代码-O指定输出文件路径未指定输出扩展名时插件声明FileExtension .scel导出器会使用.scel默认扩展名spec 明确要求的场景若输入词库无拼音转换管线会先经过编码生成CodeGenerationOptions/PinyinGenerater补全拼音再导出确保每个词条可映射到拼音索引命令行帮助与示例见 ImeWlConverterCmd/Readme.txt--list-formats可列出所有已注册的输入/输出格式。七、测试与验证如何证明生成的文件是合法的设计文档与任务清单tasks.md把验证拆为四层当前仓库均有对应落点验证层级测试用例SougouPinyinScelExportTest.cs验证内容文件结构TestExportBasicScelmagic number 8 字节、0x0120 词组数、0x0124 词条数、0x1540 拼音表条目数 413同音词归组TestExportWithSamePinyin同音词合并后词组数与词条总数的正确性元信息区TestExportMetaInfo0x0130 名称深蓝词库转换、0x0540 描述由深蓝词库转换工具生成往返一致性TestRoundTrip/TestRoundTripWithRealFile导出 → 重新导入词条词语拼音集合完全一致后者使用真实文件唐诗300首【官方推荐】.scel做全量往返往返测试是生成文件合法的最强证据SougouScelImporter能无损读回导出器写出的文件说明字节布局自洽而真实文件往返TestRoundTripWithRealFile进一步验证了对搜狗官方词库做导入→导出→再导入后词条集合不丢失源码。此外仓库还提供通用往返测试框架 FormatRoundtripTest.cs把所有同时具备 Import/Export 的格式含 scel纳入统一的往返校验集成测试体系 tests/integration通过真实 CLI 执行-i scel -o ggpy等命令并比对期望输出如tests/integration/TEST-MATRIX.md中的 T1/T10 用例覆盖搜狗.scel → 搜狗文本与搜狗文本 → 搜狗.scel双向链路。八、风险与权衡设计文档的原始评估设计文档以表格形式记录了本功能面临的主要风险及缓解措施这些判断至今仍具参考价值风险缓解措施unknown 字段值不正确导致搜狗输入法拒绝导入使用已验证的默认值10, 0, 全零通过实际导入搜狗输入法做端到端验证拼音表不完整导致部分词条无法正确映射使用完整的 413 音节标准拼音表覆盖所有合法拼音生成文件过大超出搜狗输入法限制观察到搜狗官方词库单文件可达数万词条暂不限制后续可按需分割导出接口不适合二进制格式采用流式ExportAsync(entries, Stream)接口并在管线中走二进制路径不破坏既有文本导出流程词条拼音信息不完整来源词库无拼音导出前依赖 PinyinGenerater 补全拼音确保每个词条都有拼音从源码看上述风险大多已落地化解接口层用Stream方案彻底解决了文本接口承载二进制的矛盾音节表采用固定 413 项消除了拼音映射缺口无拼音词条通过查表过滤 编码生成补全双保险。唯一仍需用户侧留意的是超大词库如数十万词条对搜狗导入性能的影响这与官方词库行为一致属格式固有特性。九、总结scel 导出功能的落地使深蓝词库转换的 scel 支持从只读升级为双向。整个实现围绕五段式二进制布局展开以六项设计决策为骨架同文件/同架构注册、流式二进制写入、413 音节标准表、unknown 字段安全默认值、固定 8 字节 magic number、同音词强制归组。配合校验和回填、拼音标准化与无效词条过滤最终由 CLI-o scel参数对外提供能力并经单元测试、往返测试与集成测试三层验证。对希望二次开发或移植此功能的开发者建议按以下顺序阅读源码先读 SougouScelExporter.cs写方向与 SougouScelImporter.cs读方向对照理解布局再读 SougouPinyinScelExportTest.cs 掌握各偏移的断言方法最后以 ConversionPipeline.cs 理解导出在整体转换管线中的位置。设计决策与风险分析的完整原始记录见 design.md验收场景清单见 spec.md。赞分享桌面应用CLI开发工具【免费下载链接】imewlconverter”深蓝词库转换“ 一款开源免费的输入法词库转换程序项目地址https://gitcode.com/gh_mirrors/im/imewlconverter点击查看免费下载相关推荐逆向输入法二进制词库深蓝词库转换如何解析与导出 scel、qpyd、bdict 二进制格式逆向输入法二进制词库深蓝词库转换如何解析与导出 scel、qpyd、bdict 二进制格式 深蓝词库转换imewlconverter是一款开源免费的输入法桌面应用CLI开发工具深蓝词库转换格式代码速查清单scel、qpyd、rime、plist 等 50 输入法词库格式一网打尽深蓝词库转换格式代码速查清单scel、qpyd、rime、plist 等 50 输入法词库格式一网打尽 深蓝词库转换IME WL Converter是一桌面应用CLI开发工具词库转换终极秘籍深蓝词库转换工具全解析词库转换终极秘籍深蓝词库转换工具全解析 深蓝词库转换作为一款专业的输入法词库转换工具解决了用户在不同输入法平台间迁移词库的技术难题。该工具通过强大的格式解析桌面应用CLI开发工具上一篇如何快速掌握Casbin模型验证配置文件语法检查与错误预防完整指南下一篇Meshery事件溯源架构使用Kafka存储与重放系统事件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表