Skip to content

Sense v0.4.5.beta.5 - Decoder quality and Frost lexicon

Pre-release
Pre-release

Choose a tag to compare

@EthanBird EthanBird released this 30 Jul 15:53

Sense v0.4.5.beta.5 — Decoder quality and Frost lexicon

版本

  • Tag:v0.4.5.beta.5
  • Android:versionCode 26versionName 0.4.5.beta.5
  • 发布资产:Sense-v0.4.5.beta.5.apk
  • 平台:Android 10+,minSdk 29targetSdk 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 首选源格式。仓库保存实际参与
构建的 8105baseextothers 源表,并在
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 私钥材料保存在仓库外