Sense v0.4.5.beta.5 - Decoder quality and Frost lexicon
Pre-releaseSense v0.4.5.beta.5 — Decoder quality and Frost lexicon
版本
- Tag:
v0.4.5.beta.5 - Android:
versionCode 26,versionName 0.4.5.beta.5 - 发布资产:
Sense-v0.4.5.beta.5.apk - 平台:Android 10+,
minSdk 29,targetSdk 36 - 发布性质:GitHub Pre-release
- 项目许可:GPL-3.0-only
解码器:从独立规则堆叠到统一候选图
本轮把全拼、整句组合、简拼、混拼、前缀、英文和纠错候选送入同一排序域,而不是
依赖固定候选槽位或某一来源的局部分数。新的 CandidateRanker 负责来源先验、稳定
去重和全局截断。最终来源先验为:
| 来源 | 先验 |
|---|---|
| canonical exact / canonical composition | +8.00 / +6.00 |
| exact / composition / user | +1.20 / +0.55 / +0.45 |
| hybrid / initials | +0.55 / +0.10 |
| correction:无 canonical / 有 exact / 有 composition | -0.25 / -13.00 / -8.00 |
| prefix | -0.75 |
| English exact / prefix | +0.40 / -0.90 |
保护项仍是可比较的分数特征,而非预留候选位置。词典基础分、prefix 完成代价、简拼
长度证据和上下文 bigram 先形成候选自身分数,再叠加来源先验。
拼音纠错改用有界加权 spelling graph。它在音节清单上同时表达键盘邻键替换、相邻
字符换位、重复键、插入和删除,并把编辑代价一路带入候选排序。合法全拼不再因 exact
命中而提前结束,用户仍可在后续候选中看到合理纠错;xi'an 这类显式音节边界保持
强约束,避免退化成单音节 xian。
生产 CorrectionSearchBudget 使用 compact canonical 分档:无 canonical 时始终使用
48 条 spelling paths 和 4 个 composed probes;已有 exact/规范组合且
outputLimit < 64 时使用 24/1,outputLimit >= 64 时保持 48/3。exact candidates
固定为 48/path、composed candidates 为 24/path、每段 8 项和 beam 32。该预算
不再按词库或 fixture 大小切换,窄预算测试通过显式注入运行同一算法。规范化字母输入
上限覆盖完整可逆 composition(已选片段与待解码尾部合计),为 96。
图搜索会按 cost tier 和首次编辑位置保留路径多样性,避免长句尾部错误被前部歧义
耗尽预算;组合 probe 还优先保留至多 2 条单字母尾部增删,并尝试覆盖距离最靠后编辑
位置不超过 1 的路径。编辑偏移定位真实替换/增删字符,而不是音节边起点;生产 48 路
回归固定 nihaoshijiee → 你好世界。syllableEnds 贯穿 corrected lattice,词格边和候选 initials
必须匹配原路径音节数。撇号会停用整段 exact、hybrid、initials 和 prefix,并要求
组合与纠错边都遵守声明的音节接缝。
动态整句路径扩大了每个位置的音节边和 beam 预算,并跳过除 a/e/o 外的单字母伪
音节。词边界代价、词典权重和字符上下文在同一 lattice 中累计,长句组合分数按片段
归一化,减少多词句子因固定片段罚分而系统性沉底。initials 至少 2 个字母;hybrid
至少 3 个字母并最多扫描 128 条 record、每条读取 16 项;动态 prefix 的通用词典扫描
最多 96 条 record、每条读取 2 项。
中英文混输也移除固定“四个中文后插英文”的策略。英文 exact、复数形式与词法补全
保留各自语义,但最终位置由统一分数决定;强中文候选不会被硬插槽打断,高置信英文
也可自然前移。单首字母中文输入的单汉字前缀另有有界双语证据校准,使 w → 我
一类明确中文信号不被宽泛英文补全淹没。
候选栏:整句优先、渐进路径可见、异步状态可判定
渐进解码快照先发布整句候选,再按已消费拼音路径选取少量代表性前缀,随后补齐其余
整句和前缀候选。ProgressivePrefixProbeDecoder 让前缀选择保留 canonical、组合与
补全能力,同时跳过每个前缀重复的 spelling-correction graph;整句候选仍走完整解码
并保留纠错。单音节歧义查询会限制早期前缀数量,降低局部词淹没目标整词的概率。
新请求处于 pending 时,候选栏保留上一帧几何和相同主题文本颜色,避免列表跳动与
逐键调色频闪;readiness 只作为交互屏障,点击、翻页和拖动命中全部暂停。readiness
变化或候选内容批次替换前还会主动取消候选相关的已按下指针,封住“旧批次按下、
新批次抬起”的 source-index 竞态。新批次完成后再原子恢复交互;旧 revision、同
revision 不同 composition 以及拖动中的陈旧候选都不会被提交。
Han 过滤、字符计数与学习全部按 Unicode code point 和 UnicodeScript.HAN 执行,
Frost 中补充平面字可进入渐进候选并作为单字学习。英文 type/backspace 同样采用
两阶段宿主边界:只有 setComposingText 成功且同步回调未改变 session、revision、
editor 或 InputConnection 身份时,才推进本地 composition 与候选。
个性化:强度、衰减与负反馈
用户词学习从单一累计次数升级为带证据类型的模型:
- 默认首选提交、显式选择和渐进选择使用不同正反馈强度,并记录原候选位次;
- 频次与最近使用奖励均有上界和时间衰减,长期历史不会永久压过明显更好的系统词;
- 快速删除与紧接着的替换会形成负反馈,
[-4.5, +4.5]signed adjustment 可直接
降低同文本系统候选的分数,而不只是移除一条重复用户候选; - 渐进选词先随 composition 暂存,完整上屏成功后才学习;在 composition 内回退会
丢弃对应暂存事件; - 用户候选先转换到统一分数域,再与系统 exact、组合、英文和纠错候选共同排序;
- 内存词典采用全局 10,000 条、每个完整拼音 64 条预算;每条记录默认最多 16 个 alias,
每个 initials/alias 非 exact 查询桶最多索引 128 条记录,lookup 使用有界 top-K heap;
非 exact 桶裁剪仅移除索引映射,完整拼音 exact 与负反馈记录继续保留,而记录预算
产生的淘汰仍同步为持久化删除; - 持久化数据库升级到 SQLite v3,同时保留旧数据迁移路径和内存热路径;初始化先完成
open/migration/read 再转交 writer,任一构建阶段异常都会关闭当前资源 owner。
启动路径:Frost 后台装载与原子热切换
IME 创建阶段先装配轻量 FakeDecoder、fallback 音节表、空英文词表和内存用户词典;
35 MB Frost、字符 bigram、英文词表和 SQLite 迁移由专用单线程后台装载,不占用
InputMethodService.onCreate 主线程。完整 AdaptivePinyinDecoder 构建完成后再在
主线程原子热切换,候选工作线程的后续请求自然读取新实例。
若切换时仍有中文 composition,服务会强制重新进入 pending 并以生产解码器刷新;
英文 composition 也会重建到正式词表。生产实例就绪前暂停个性化写入,避免 bootstrap
结果进入长期学习;资产读取异常会记录原因并保留对应本地 fallback。
Rime Frost 生产词库
项目许可切换为 GPL-3.0-only,生产中文词库切换到固定 commit 的
Rime Frost 首选源格式。仓库保存实际参与
构建的 8105、base、ext、others 源表,并在
ime-service/src/main/lexicon/sources.json 固定 revision、SHA-256、许可、权重校准
和索引策略。
源表先转换为带来源归属的 canonical IR,再确定性生成 SPLX v3、音节表、bigram 和
统计文件。当前生产产物包含 524,851 个 exact key、610,298 个 exact candidate 和
608,314 个唯一 exact 文本;pinyin_lexicon.bin 为 35,069,585 bytes。低频长尾保留
完整拼音召回,高频记录才扩展统计前缀、简拼与 hybrid 索引,以控制 APK 和运行时索引
体积。
早期为 M4/M5 排序构造的十亿级权重与 Emoji fixture 已移出生产 overlay,仅保存在
ime-service/src/test/fixtures。离线门禁从 vendored 首选源重新构建所有词库产物并
逐字节比较,不再把已有二进制当作自身来源。完整决策和重建契约见
ADR 0022。完整 GPL v3 正文位于
根目录 LICENSE,Rime Frost 与 ISC 英文词表的来源、固定哈希和
随包副本位置见 NOTICE。
质量回放与性能门禁
M3 质量回放扩充为 120 条版本化用例,覆盖全拼、长句、姓名、口语、技术词、单处
拼写错误、简拼和混拼,并按 head/mid/tail 词频桶拆分。报告同时给出
Top-1/3/10、MRR、Coverage、模式/词频分桶以及候选上限 10/64/255 下的
p50/p95/p99;纠错路径单独计时,避免慢路径被普通 exact 查询平均掉。
生产上限 255 的 contextual 结果为 Top-1 92/120(76.67%)、Top-3
100/120(83.33%)、Top-10 109/120(90.83%)、Coverage
118/120(98.33%)、MRR 0.8140。对应门禁为 Top-1 70%、Top-10 85%、
Coverage 93%、MRR 0.75;hybrid 还要求 Top-1 至少 10/11,并固定
rengzn → 人工智能 为 Top-1 sentinel。
Host contextual 延迟中,非 typo、limit 255 为 p95 12.858 ms、p99 15.596 ms;
typo、limit 255 为 p95 11.417 ms、p99 11.454 ms。最新 M4 报告记录 initials、
渐进 limit 16、渐进 limit 255 与组合 p95 分别为 0.037/0.402/0.839/2.578 ms;
生产上限的前缀候选数为 51。M5 报告记录英文词典 p95 5.802 µs、中英混合渐进解码
p95 0.623 ms、hybrid 解码 p95 0.497 ms,分别低于 0.5/5/5 ms 预算。
渐进热路径通过预排序解码器契约跳过重复 CandidateRanker、空个性化索引快速返回,
并把候选前缀的 whole/decode rank 预计算到内部 wrapper;排序比较阶段不再创建
substring、Pair 或执行 Map 查询。M4 采用 20 个 batch 的 nearest-rank p95,并保持
与原门禁相同的总 lookup 数,避免 7 个 batch 时 p95 等同单次最大值。
正式发布由 tools/local_release.ps1 -Publish 在同一 release HEAD 上执行 Python
源资产测试、JVM/Android unit test、Lint、AndroidTest APK assembly、debug/benchmark
构建、M0–M6 benchmark、X-02 source/artifact gate、release APK 元数据与签名验证,
随后上传并从 GitHub Release 下载资产复核。
固定发布签名
本版本继续沿用 Sense Release v1 固定签名,可从 v0.4.5.beta.1 至
v0.4.5.beta.4 直接覆盖升级。
- 证书:
sense-release-v1-cert.pem - SHA-256:
76db888ff42b04d52d4d19a573fe8f8df2fa3af0ab36bd6a08c6f70a8aace984 - 算法:RSA-4096 / SHA256withRSA
- 仓库仅保存公开证书和指纹;固定 PKCS12 私钥材料保存在仓库外