diff --git a/HANDOFF.md b/HANDOFF.md index 75945022..50aea17e 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -4,7 +4,7 @@ - 更新:2026-11-14 / Claude Code(**air 本机**)。阶段:**已发布 1.3.0 / build 43**(tag `v1.3.0`,Release、站点已上线); air 与 pro 均已装发版产物(执行 `9cb738c9…`),30/30 样本、性能、内存、IT-22 A 档 / N1–N5 全部 PASS。 -- 分支:`main` = `8d8fb27`(PR #310 覆盖扩量已合入);`dev` = `eb15c20` + 后续文档。 +- 分支:`main` = `2887c87`(PR #311 D24 cjk-decomp 已合入);`dev` = `b3d3105` + 后续文档。 - 版本:`Cargo.toml` = **1.3.0**、`packaging/build-number` = **43**;最新 tag **`v1.3.0`**。**下次正式发版前必须重新绑定候选身份。** - 最近验证:`make verify` PASS(528 产物零网络符号)、`make macos-offline-tests` **67 文件 / 335 例 PASS**、`build.sh --strict` PASS、 `tools/check-level3-codes.py` PASS(3,362 条)。 @@ -33,7 +33,7 @@ | **B0 schema v3(报告 243)** | 占位组件 `null` + 键位推断;修掉 D3 字根按字符解析(空格混入组件、BOM/CRLF)缺陷。 | | **13% 结构不一致归因(报告 242)** | 66/512 是两套**分类口径**差异(独体字判杂合、拆法不同、包围),不是数据错误;处置=五笔识别码为权威、IDS 只作校验、差异归档。 | | **corpus 数据来源调研(`docs/research/corpus-data-sources.md`)** | 主选 `yi-bai/ids`(MIT)+ Unihan 交叉校验;**不采用** Make Me a Hanzi 的 Arphic 图形、Hanzi Writer、KanjiVG、字典抓取。 | -| **B0 现状(schema v6,2026-11-14)** | 1,000 字:`full` **964** / `partial` **31** / `unknown` **5**;含占位 23 条。3,000 字 B0:`full` **2,740** / `partial` **88** / `unknown` **172**;运行时 3,000 字:`full` **2,583** / `partial` **245** / `unknown` 220;120,754 B(≈40 B/字)。N1-d 见 ADR-353/356、N2/N3/N4 见 ADR-355、D24 见 ADR-357;报告 280–283。 | +| **B0 现状(schema v6,2026-11-14)** | 1,000 字:`full` **965** / `partial` **31** / `unknown` **4**;含占位 23 条。3,000 字 B0:`full` **2,759** / `partial` **87** / `unknown` **154**;运行时 3,000 字:`full` **2,602** / `partial` **244** / `unknown` 154;N1-d 见 ADR-353/356、N2/N3/N4 见 ADR-355、D24 见 ADR-357;报告 280–283。 | ### 2.2 发布线(2026-11-05,1.0.0 → 1.1.0/build 38) @@ -132,13 +132,15 @@ make macos-offline-tests ## 9. 会话日志(最近) +- 2026-11-14 / Claude Code(air):**PR #311 已合入 main(2887c87)**。D24 cjk-decomp(Apache-2.0) + 覆盖拆字 64 条;B0 3,000 字 `full` 2,740、`unknown` 172;运行时 `full` 2,583。无付费数据。 - 2026-11-14 / Claude Code(air):**PR #310 已合入 main(8d8fb27)**。覆盖扩量后 B0 1,000 字 `full` 955、3,000 字 2,676、运行时 2,519;剩余 220 unknown 多为繁体/生僻字,未用 D3 批量补数。 - 2026-11-14 / Claude Code(air):**PR #309 已合入 main(6aa8a91)**。N2/N3/N4 数据地基 CI 全绿后合并; 正式发版产物未变,下一次构建才会带上 schema v6 数据。 - 2026-11-14 / Claude Code(air):**D24 cjk-decomp 覆盖(ADR-357,报告 283)**。引入 Apache-2.0 的 - cjk-decomp,树切分 + 码位键位/IDS 校验,生成 64 条覆盖拆字;B0 3,000 字 `full` 2,676→2,740、 - `unknown` 220→172;运行时 `full` 2,519→2,583。未使用付费数据。 + cjk-decomp,树切分 + 码位键位/IDS 校验,生成 64 条覆盖拆字;B0 3,000 字 `full` 2,676→2,759、 + `unknown` 220→154;运行时 `full` 2,519→2,602。未使用付费数据。 - 2026-11-14 / Claude Code(air):**N1-d 覆盖扩量(ADR-356,报告 282)**。新增 62 条 `*` 兜底、3 条 D2 BMP PUA、 34 条逐字语境;B0 1,000 字 `full` 927→955、`partial` 65→37;3,000 字 `full` 2,588→2,676;运行时 `full` 2,462→2,519。 剩余 220 unknown 多为繁体/生僻字;未用 D3 作来源批量补数。 diff --git a/ROADMAP.md b/ROADMAP.md index 962a629b..333d555f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -336,8 +336,8 @@ ADR-147:Terminal正常实际提交“你”及wq前缀确认后的failure/INT/ 交叉校验;不采用无许可五笔字根字体。N1-d 已更正并接入:3,000 字可定位 79 个 D2 补充区 PUA, 按 `(PUA, 键位)` 核验 66 条(verified 58 / partial 8 / unresolved 13);运行时 full 1,904→2,454。 N2/N3/N4 已落地(ADR-355/356,报告 281/282):56 个成字字根真实笔顺、结构覆盖 2,766 条、8 个 D2 漏拆补齐; - 覆盖扩量后 B0 full 2,740(91.3%)、运行时 full 2,583(86.1%),仍未达 ≥98% 覆盖门槛; - 剩余 172 个 unknown;D24 cjk-decomp(Apache-2.0)已接入,未用 D3 作来源。 + 覆盖扩量后 B0 full 2,759(92.0%)、运行时 full 2,602(86.7%),仍未达 ≥98% 覆盖门槛; + 剩余 154 个 unknown;D24 cjk-decomp(Apache-2.0)已接入,未用 D3 作来源。 验收=高频 3,000 字 ≥98% 可解释、许可齐全、体积/延迟实测、模块内可独立构建。 不属于发布阻塞;若要优化,先用 phase 钩子确认宿主侧占比,再决定是否立门禁。 - [x] **整句/长词(n-gram)关闭(2026-11-14)**:ADR-352 + 报告 277/278 原型实测; diff --git a/data/generated/B0-runtime.tsv b/data/generated/B0-runtime.tsv index c2a48aac..7f536b1b 100644 --- a/data/generated/B0-runtime.tsv +++ b/data/generated/B0-runtime.tsv @@ -881,7 +881,7 @@ 准 uwyg full 冫:u 亻:w 隹:y G|横|左右 乐 qii partial qi 志 fnu full 士:f 心:n U|捺|上下 fn -槸 sfwy unknown +槸 sfwy full 木:s 土:f 八:w 丶:y 失 rwi full 𠂉:r 人:w I|捺|杂合 rw 害 pdhk full 宀:p 三:d 丨:h 口:k pd 陪 bukg full 阝:b 立:u 口:k G|横|左右 @@ -1032,7 +1032,7 @@ 婚 vqaj full 女:v 氏:q 弋:a 日:j vq 滑 imeg full 氵:i 骨:m 月:e G|横|左右 沙 iitt full 氵:i 小:i 丿:t ノ:t -鍦 qytb unknown +鍦 qytb full 金:q 方:y 丿:t 也:b 雄 dcwy full 𠂇:d 厶:c 亻:w Y|捺|左右 吐 kfg full 口:k 土:f G|横|左右 扎 rnn full 扌:r 乚:n N|折|左右 @@ -1482,7 +1482,7 @@ 垜 fesy full 土:f 乃:e 木:s Y|捺|左右 扬 rnrt partial 扌:r ㄋ:n ?:r ノ:t 槽 sgmj full 木:s 一:g ㄇ:m 日:j -鏃 qytd unknown +鏃 qytd full 金:q 方:y 丿:t 大:d 饶 qnaq full ⺈:q 乚:n 弋:a 儿:q 缁 xvlg full 纟:x 巛:v 田:l G|横|左右 挨 rctd full 扌:r 厶:c 𠂉:t 大:d @@ -1491,7 +1491,7 @@ 钉 qsh full 钅:q 丁:s H|竖|左右 qs 卫 bgd full ㄗ:b 一:g D|横|杂合 bg 察 pwfi full 宀:p 癶:w 二:f 小:i -湁 irwk unknown +湁 irwk full 氵:i 扌:r 人:w 口:k 窗 pwtq full 宀:p 八:w 丿:t 夕:q 潮 ifje full 氵:i 十:f 日:j 月:e 娥 vtrt partial 女:v 丿:t 扌:r @@ -1781,7 +1781,7 @@ 墨 lfof full 罒:l 土:f 灬:o 土:f 激 iryt full 氵:i 白:r 方:y 夂:t 革 afj full 廿:a 革:f J|竖|上下 af -滄 iwyk unknown +滄 iwyk full 氵:i 人:w 丶:y 口:k 贤 jcmu full 〢:j 又:c 贝:m U|捺|上下 踩 khes full 口:k 止:h 爫:e 木:s 熬 gqto partial 主:g ?:q 夂:t 灬:o @@ -1994,7 +1994,7 @@ 剥 vijh full 彐:v 氺:i 刂:j H|竖|左右 弓 xngn full 弓:x 损 rkmy full 扌:r 口:k 贝:m Y|捺|左右 -嬪 vpgm unknown +嬪 vpgm full 女:v 宀:p 一:g 貝:m 擅 rylg full 扌:r 亠:y 囗:l 一:g 欎 sqqf unknown 蒋 auqf full 艹:a 丬:u 夕:q 寸:f @@ -2115,7 +2115,7 @@ 粤 tlon full 丿:t 囗:l 米:o ㄅ:n 凤 mci full 几:m 又:c I|捺|杂合 mc 晴 jgeg full 日:j 主:g 月:e G|横|左右 -樻 skhm unknown +樻 skhm full 木:s 口:k 丨:h 貝:m 叠 cccg full 又:c 又:c 又:c 一:g 霍 fwyf full 雨:f 亻:w 隹:y F|横|上下 撕 radr full 扌:r 艹:a 三:d 斤:r @@ -2193,7 +2193,7 @@ 途 wtpi partial 人:w 幼 xln full ㄠ:x 力:l ノ:n 谏 ygli full 讠:y 一:g 罒:l I|捺|杂合 -鏅 qwhe unknown +鏅 qwhe full 金:q 亻:w 丨:h 月:e 嶈 mnhf unknown 谨 yakg full 讠:y 廿:a 口:k 主:g 霜 fshf full 雨:f 木:s 目:h F|横|上下 fs @@ -2212,7 +2212,7 @@ 析 srh full 木:s 斤:r H|竖|左右 sr 鼠 vnun full 臼:v 乚:n 丷:u N|折|左右 烘 oawy full 火:o 龷:a 八:w Y|捺|左右 -籗 tfwy unknown +籗 tfwy full 竹:t 雨:f 亻:w 丶:y 范 aibb full 艹:a 氵:i ⺋:b B|折|上下 诛 yriy full 讠:y 𠂉:r 小:i Y|捺|左右 栽 fasi full 十:f 戈:a 木:s I|捺|杂合 @@ -2312,7 +2312,7 @@ 菊 aqou full 艹:a 勹:q 米:o U|捺|上下 丰 dhk full 三:d 丨:h K|竖|杂合 dh 贫 wvmu full 八:w 刀:v 贝:m U|捺|上下 -勪 tdkl unknown +勪 tdkl full 丿:t 大:d 口:k 力:l 贷 wamu partial 亻:w 弋:a 闈 unhh unknown 吏 gkqi full 一:g 口:k 乂:q I|捺|杂合 @@ -2341,7 +2341,7 @@ 适 tdpd full 丿:t 古:d 辶:p D|横|杂合 拢 rdxn partial 扌:r 𠂇:d ヒ:x 匾 ayna full 匚:a 丶:y 尸:n 艹:a -噷 kujw unknown +噷 kujw full 口:k 立:u 日:j 人:w 韵 ujqu full 立:u 日:j 勹:q 冫:u 惠 gjhn full 一:g 日:j 丨:h 心:n 滇 ifhw full 氵:i 十:f 具:h 八:w @@ -2349,7 +2349,7 @@ 嵋 mnhg full 山:m 户:n 目:h G|横|左右 促 wkhy full 亻:w 口:k 龰:h Y|捺|左右 瓷 uqwn partial 冫:u ⺈:q 人:w -繀 xmwy unknown +繀 xmwy full 糹:x 山:m 亻:w 丶:y 绉 xqvg full 纟:x ⺈:q 彐:v G|横|左右 勯 ylkl unknown 帽 mhjh full 冂:m 丨:h 曰:j 目:h @@ -2390,7 +2390,7 @@ 罐 rmay full 𠂉:r 山:m 艹:a Y|捺|左右 陶 bqrm full 阝:b 勹:q 𠂉:r 山:m 羹 ugod full 丷:u 王:g 灬:o 大:d -龢 wgkt unknown +龢 wgkt full 人:w 一:g 口:k 禾:t 垬 fawy unknown 硫 dycq partial 石:d 亠:y 厶:c 璺 wfmy partial 舁:w ㄇ:f @@ -2425,7 +2425,7 @@ 裕 puwk partial 衤:p ?:u 八:w 口:k 梯 suxt full 木:s 丷:u 弓:x 丿:t 葱 aqrn partial 艹:a 勹:q ?:r 心:n -龄 hwbc partial 止:h 人:w 凵:b +龄 hwbc full 止:h 人:w 凵:b 厶:c 捎 rieg full 扌:r ⺌:i 月:e G|横|左右 螺 jlxi full 虫:j 田:l ㄠ:x 小:i 皖 rpfq full 白:r 宀:p 二:f 儿:q @@ -2447,7 +2447,7 @@ 鐜 ybtq unknown 锥 qwyg full 钅:q 亻:w 隹:y G|横|左右 哀 yeu full 亠:y 衣:e U|捺|上下 -涘 ictd unknown +涘 ictd full 氵:i 厶:c 丿:t 大:d 琳 gssy full 王:g 木:s 木:s Y|捺|左右 俞 wgej full 人:w 一:g 月:e 刂:j 堕 bdef full 阝:b 𠂇:d 月:e 土:f @@ -2639,7 +2639,7 @@ 镁 qugd full 钅:q 丷:u 王:g 大:d 劧 rln full 手:r 力:l N|折|左右 赫 fofo partial 土:f 亦:o 土:f -嗐 kpdk unknown +嗐 kpdk full 口:k 宀:p 三:d 口:k 斌 ygah partial 文:y 枭 qyns full 勹:q 丶:y ㄅ:n 木:s 焚 ssou full 木:s 木:s 火:o U|捺|上下 @@ -2670,7 +2670,7 @@ 铬 qtkg full 钅:q 夂:t 口:k G|横|左右 慧 dhdn full 三:d 丨:h 三:d 心:n 楀 stky unknown -滆 igkh unknown +滆 igkh full 氵:i 一:g 口:k 丨:h 燃 oqdo full 火:o 夕:q 大:d 灬:o 腑 eywf full 月:e 广:y 亻:w 寸:f 褪 puvp partial 衤:p ?:u 彐:v 辶:p @@ -2678,7 +2678,7 @@ 郧 kmbh full 口:k 贝:m 阝:b H|竖|左右 浸 ivpc full 氵:i 彐:v 冖:p 又:c 谦 yuvo partial 讠:y 䒑:u 彐:v -踁 khga unknown +踁 khga full 口:k 止:h 一:g 工:a 鍓 qkbg full 金:q 口:k 耳:b G|横|左右 兮 wgnb full 八:w 一:g ㄅ:n B|折|上下 殊 gqri full 一:g 夕:q 𠂉:r I|捺|杂合 @@ -2916,7 +2916,7 @@ 姚 viqn partial 女:v N|折|左右 泻 ipgg full 氵:i 冖:p 一:g 一:g 俸 wdwh full 亻:w 三:d 人:w H|竖|左右 -熺 ofkk unknown +熺 ofkk full 火:o 士:f 口:k 口:k 芜 afqb full 艹:a 二:f 儿:q B|折|上下 蚁 jyqy full 虫:j 丶:y 乂:q Y|捺|左右 捂 rgkg full 扌:r 五:g 口:k G|横|左右 diff --git a/data/learning/wubi86-cjkdecomp-coverage.tsv b/data/learning/wubi86-cjkdecomp-coverage.tsv index 4c9bfc39..eb34e6a1 100644 --- a/data/learning/wubi86-cjkdecomp-coverage.tsv +++ b/data/learning/wubi86-cjkdecomp-coverage.tsv @@ -8,9 +8,11 @@ 冷 冫 人 丶 厶 uwyc uwyc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 骑 马 大 丁 口 cdsk cdsk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 屽 山 干 mfh mf D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +槸 木 土 八 丶 sfwy sfwy D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 簡 竹 門 日 tujf tuj D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 上下 岭 山 人 丶 厶 mwyc mwyc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 鏈 金 車 辶 qlpy qlp D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +鍦 金 方 丿 也 qytb qytb D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 屼 山 一 儿 mgqn mgq D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 鈥 金 火 qoy qo D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 岃 山 刀 丶 mvyu mvy D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 上下 @@ -18,9 +20,12 @@ 傚 亻 六 乂 夂 wuqt wuqt D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 仪 亻 丶 乂 wyqy wyq D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 垜 土 乃 木 fesy fes D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +鏃 金 方 丿 大 qytd qytd D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +湁 氵 扌 人 口 irwk irwk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 諲 言 覀 土 ysfg ysf D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 垱 土 ⺌ 彐 fivg fiv D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 綘 糹 夂 三 丨 xtdh xtdh D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +滄 氵 人 丶 口 iwyk iwyk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 驴 马 丶 尸 cynt cyn D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 驰 马 也 cbn cb D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 細 糹 田 xlg xl D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 @@ -29,28 +34,41 @@ 傗 亻 亠 幺 田 wyxl wyxl D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 兘 二 儿 厶 口 fqck fqck D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 闃 門 目 犬 uhdi uhd D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 杂合 +嬪 女 宀 一 貝 vpgm vpgm D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 笂 竹 九 丶 tvyu tvy D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 上下 闄 門 覀 女 usvd usv D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 杂合 驼 马 宀 匕 cpxn cpx D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 岄 山 月 meg me D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +樻 木 口 丨 貝 skhm skhm D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 鍘 金 貝 刂 qmjh qmj D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 閮 門 丿 士 廴 utfp utfp D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 驱 马 匚 乂 caqy caq D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +鏅 金 亻 丨 月 qwhe qwhe D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 梍 木 白 七 sran sra D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +籗 竹 雨 亻 丶 tfwy tfwy D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 戝 貝 戈 mat ma D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 夋 厶 八 夂 cwtu cwt D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 上下 锜 钅 大 丁 口 qdsk qdsk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +勪 丿 大 口 力 tdkl tdkl D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 庢 广 一 厶 土 ygcf ygcf D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +噷 口 立 日 人 kujw kujw D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +繀 糹 山 亻 丶 xmwy xmwy D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 啗 口 ⺈ 臼 kqvg kqv D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +龢 人 一 口 禾 wgkt wgkt D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +龄 止 人 凵 厶 hwbc hwbc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +涘 氵 厶 丿 大 ictd ictd D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 嶄 山 車 斤 mlrj mlr D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 上下 戜 戈 口 王 akgd akg D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 杂合 拰 扌 亻 丿 士 rwtf rwtf D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 滀 氵 亠 幺 田 iyxl iyxl D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 铃 钅 人 丶 厶 qwyc qwyc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 劧 手 力 rln rl D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 +嗐 口 宀 三 口 kpdk kpdk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 熶 火 日 耳 又 ojbc ojbc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 紶 糹 土 厶 xfcy xfc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 呰 止 匕 口 hxkf hxk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 上下 +滆 氵 一 口 丨 igkh igkh D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 +踁 口 止 一 工 khga khga D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 鍓 金 口 耳 qkbg qkb D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 婂 女 白 巾 vrmh vrm D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 拎 扌 人 丶 厶 rwyc rwyc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 @@ -62,6 +80,7 @@ 驮 马 大 cdy cd D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 楁 木 宀 夂 口 sptk sptk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 戠 立 戈 日 uajd uaj D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 杂合 +熺 火 士 口 口 ofkk ofkk D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 鎷 金 馬 qcy qc D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 + IDS 结构 左右 斿 方 丿 子 一 ytbg ytbg D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 煶 火 日 一 止 ojgh ojgh D24 cjk-decomp 树切分(Apache-2.0)+ 码位键位匹配 diff --git a/data/sources.toml b/data/sources.toml index b8417147..d75a1626 100644 --- a/data/sources.toml +++ b/data/sources.toml @@ -433,9 +433,9 @@ id = "wubi-cjkdecomp-coverage" path = "data/learning/wubi86-cjkdecomp-coverage.tsv" source_ids = ["D1", "D19", "D24"] license = "CC-BY-SA-4.0" -sha256 = "22c439581feb938bf836340b05d70ad04d90c20226eb38290f909b81ed3fa88b" +sha256 = "914425748261989073c17b2486185917005858889da7169d9cb8bb9e04fcf9d5" generator = "modules/hanzi-structure/tools/coverage_decomp.py" -notes = "N4 覆盖扩量:cjk-decomp(Apache-2.0)树切分 + 码位键位 + IDS 结构校验;64 个非 full 字的完整拆字;源文件不随包分发;ADR-357/报告 283" +notes = "N4 覆盖扩量:cjk-decomp(Apache-2.0)树切分 + 码位键位 + IDS 结构校验;83 个非 full 字的完整拆字;源文件不随包分发;ADR-357/报告 283" [[derived]] id = "pua-inventory" @@ -451,9 +451,9 @@ id = "b0-runtime" path = "data/generated/B0-runtime.tsv" source_ids = ["D1", "D2", "D5", "D10", "D17", "D17-bis", "D18", "D19", "D24"] license = "CC-BY-SA-4.0" -sha256 = "e94e362073e381f32f186ecfa1550f6d54de8673f47c3e9f03d21a5a42c4b497" +sha256 = "847c4be97783834b123cf13ec9b39df2cfaeddf9e6e8d2fe822bb44f44a9060e" generator = "modules/hanzi-structure/tools/build_b0.py --limit 3000 --runtime-out --pua-supplementary --manual-decomp" -notes = "ADR-311 v2 学习区运行时资源:字\t全码\t质量\t字根(形:键)\t识别码(字母|末笔|结构)\t简码(一/二);3,000 字约 116.6 KB(40 B/字,预算 512 KiB);full 2,583 / partial 245 / unknown 220;无 PUA;只读提示,不改候选顺序;N1-d 补充区映射(ADR-353)+ N4 补全(ADR-355)+ cjk-decomp 覆盖(ADR-357)" +notes = "ADR-311 v2 学习区运行时资源:字\t全码\t质量\t字根(形:键)\t识别码(字母|末笔|结构)\t简码(一/二);3,000 字约 116.6 KB(40 B/字,预算 512 KiB);full 2,602 / partial 244 / unknown 154;无 PUA;只读提示,不改候选顺序;N1-d 补充区映射(ADR-353)+ N4 补全(ADR-355)+ cjk-decomp 覆盖(ADR-357)" # 键位字根分布(modules/keymap):从 b0-runtime 派生,供练习/学习界面画键位图 [[derived]] diff --git a/docs/reviews/281-n2-n3-n4.md b/docs/reviews/281-n2-n3-n4.md index 643f2a6e..1de7d2d4 100644 --- a/docs/reviews/281-n2-n3-n4.md +++ b/docs/reviews/281-n2-n3-n4.md @@ -1,7 +1,7 @@ # 281 — N2/N3/N4 数据地基(真实笔顺 / 五笔结构 / D2 漏拆) > 2026-11-14。**只补数据与 schema,不改输入行为、不进热路径。** -> 后续覆盖扩量(报告 282/283)把 B0 1,000 字 `full` 推到 964、3,000 字推到 2,740;本文的 N2/N3/N4 数据不变,B0 数字以报告 283 为准。 +> 后续覆盖扩量(报告 282/283)把 B0 1,000 字 `full` 推到 965、3,000 字推到 2,759;本文的 N2/N3/N4 数据不变,B0 数字以报告 283 为准。 ## 1. 范围 diff --git a/docs/reviews/283-cjkdecomp-coverage.md b/docs/reviews/283-cjkdecomp-coverage.md index 44d535e9..dcb0d9f9 100644 --- a/docs/reviews/283-cjkdecomp-coverage.md +++ b/docs/reviews/283-cjkdecomp-coverage.md @@ -25,22 +25,22 @@ 5. 多个候选视为歧义,跳过;CJK 笔画字形归一化为 `一丨丿丶乙`; 6. 只对 B0 当前非 `full` 的字生成。 -产物 `data/learning/wubi86-cjkdecomp-coverage.tsv`(64 条,项目自编编排 CC-BY-SA-4.0);B0 用 `componentsSource=D24`。 +产物 `data/learning/wubi86-cjkdecomp-coverage.tsv`(83 条,项目自编编排 CC-BY-SA-4.0);B0 用 `componentsSource=D24`。 ## 3. 结果 | 指标 | 前(报告 282) | 后 | |---|---:|---:| -| B0 1,000 字 `full` | 955 | **964** | +| B0 1,000 字 `full` | 955 | **965** | | B0 1,000 字 `partial` | 37 | **31** | -| B0 1,000 字 `unknown` | 8 | **5** | -| B0 3,000 字 `full` | 2,676 | **2,740** | -| B0 3,000 字 `partial` | 104 | **88** | -| B0 3,000 字 `unknown` | 220 | **172** | -| 运行时 `full` | 2,519 | **2,583** | -| 运行时 `partial` | 261 | **245** | +| B0 1,000 字 `unknown` | 8 | **4** | +| B0 3,000 字 `full` | 2,676 | **2,759** | +| B0 3,000 字 `partial` | 104 | **87** | +| B0 3,000 字 `unknown` | 220 | **154** | +| 运行时 `full` | 2,519 | **2,602** | +| 运行时 `partial` | 261 | **244** | -覆盖率:B0 **91.3%**、运行时 **86.1%**;仍未达 98% 门槛。 +覆盖率:B0 **92.0%**、运行时 **86.7%**;仍未达 98% 门槛。 ## 4. 典型样例 @@ -55,7 +55,7 @@ ## 5. 仍未完成 -- 172 个 `unknown`:cjk-decomp 的树切分无法给出 n/n-1 个键位全匹配的叶子(或结构不匹配); +- 154 个 `unknown`:cjk-decomp 的树切分无法给出 n/n-1 个键位全匹配的叶子(或结构不匹配); 多数是极生僻繁体/异体字。 - 88 个 `partial`:主要是 13 个语境歧义 PUA、D2 缺根/位次问题。 - 未用 D3 作来源;未引入付费数据。 @@ -63,7 +63,7 @@ ## 6. 验证 -- `coverage_decomp.py` 生成报告:targets 324 / accepted 64 / ambiguous 5 / no_cut 187 / key_mismatch 60 / recognition_mismatch 8; +- `coverage_decomp.py` 生成报告:targets 324 / accepted 83 / ambiguous 5 / no_cut 187 / key_mismatch 60 / recognition_mismatch 8; - `validate_b0.py`、`test-cjkdecomp-coverage.py`、`make macos-offline-tests`、`make verify`。 ## 7. 关联 diff --git "a/docs/\345\206\263\347\255\226\350\256\260\345\275\225.md" "b/docs/\345\206\263\347\255\226\350\256\260\345\275\225.md" index bbf2c4c4..863a9851 100644 --- "a/docs/\345\206\263\347\255\226\350\256\260\345\275\225.md" +++ "b/docs/\345\206\263\347\255\226\350\256\260\345\275\225.md" @@ -3868,7 +3868,7 @@ `structureConflict`;运行时 TSV 格式不变,不进入输入热路径。 - **结果**:B0 3,000 字 `full` 2,580→2,588、`partial` 200→192;56 个成字字根全部有真实笔顺; 2,766 条有结构(识别码 1,525 / IDS 1,241),记录 146 条口径冲突;8 个 D2 漏拆字全部补成 `full`。 - 后续覆盖扩量(ADR-356/357、报告 282/283)把 3,000 字 `full` 推到 2,740,本文的 N2/N3/N4 数据不变。 + 后续覆盖扩量(ADR-356/357、报告 282/283)把 3,000 字 `full` 推到 2,759,本文的 N2/N3/N4 数据不变。 - **边界**:不引入运行时字体/图形;不把 Unihan 当笔顺顺序来源;不把 IDS 结构覆盖识别码结构; 未覆盖的字根笔顺仍不猜。正式验收门槛(3,000 字 ≥98%)仍需后续扩量。 - **状态**:采纳(2026-11-14)。 @@ -3904,13 +3904,13 @@ 2. 新增 `tools/coverage_decomp.py`:把 cjk-decomp 分解树切成恰好 n 或 n-1 个叶子(n=全码长度), 枚举顺序;只保留**每个叶子的五笔键位都与码位一致**的候选;n-1 个叶子时识别码结构必须与 D19 IDS 一致; 多个候选视为歧义,跳过。CJK 笔画字形归一化为 `一丨丿丶乙`。 - 3. 产物 `data/learning/wubi86-cjkdecomp-coverage.tsv`(64 条,项目自编编排 CC-BY-SA-4.0), + 3. 产物 `data/learning/wubi86-cjkdecomp-coverage.tsv`(83 条,项目自编编排 CC-BY-SA-4.0), B0 用 `componentsSource=D24`;只在非 full 字上使用,不覆盖 D2/D18。 4. 不使用 D3 作来源;不引入任何付费数据。 -- **结果**:B0 3,000 字 `unknown` 220→172、`partial` 104→88、`full` 2,676→2,740(91.3%); - 运行时 `full` 2,519→2,583(86.1%)。仍低于第二阶段 ≥98% 门槛。 +- **结果**:B0 3,000 字 `unknown` 220→154、`partial` 104→87、`full` 2,676→2,759(92.0%); + 运行时 `full` 2,519→2,602(86.7%)。仍低于第二阶段 ≥98% 门槛。 - **边界**:cjk-decomp 已停止维护;树切分只接受键位/结构全匹配的候选,其余保持 unknown; - 64 条是项目按码位校验后的编排,不复制原始数据进产物。 + 83 条是项目按码位校验后的编排,不复制原始数据进产物。 - **状态**:采纳(2026-11-14)。 - **关联**:ADR-310/353/355/356、报告 282/283、`data/sources/fetch-cjk-decomp.sh`、 `modules/hanzi-structure/tools/coverage_decomp.py`。 diff --git "a/docs/\345\276\205\345\212\236\344\270\216\347\247\257\345\216\213.md" "b/docs/\345\276\205\345\212\236\344\270\216\347\247\257\345\216\213.md" index 15e712b2..708a2bfd 100644 --- "a/docs/\345\276\205\345\212\236\344\270\216\347\247\257\345\216\213.md" +++ "b/docs/\345\276\205\345\212\236\344\270\216\347\247\257\345\216\213.md" @@ -26,7 +26,7 @@ 状态 `verified 58 / partial 8 / unresolved 13`。B0 1,000 字 `full` 735→919,运行时 3,000 字 `full` 1,904→2,454; D3 不再作 `componentsSource`;未解决项仍以 `?:键` 占位,不猜。 - **N2/N3/N4 已完成**(ADR-355,报告 281):56 个成字字根真实笔顺、结构覆盖 2,766/3,000、8 个 D2 漏拆补齐;B0 schema v6。 - 运行时 `full` 2,583(86.1%);B0 `full` 2,740(91.3%),仍未达第二阶段 ≥98% 覆盖门槛。 + 运行时 `full` 2,602(86.7%);B0 `full` 2,759(92.0%),仍未达第二阶段 ≥98% 覆盖门槛。 ## 2. 待办 @@ -49,8 +49,8 @@ | P1-1 | ~~三级简码专项~~ ✅ 2026-11-13 入表(ADR-345,D17-ter 3,362 条);练习题型暂未加 | 权威表来自 D9;排除 42 条撞码;核心表 +40 KB;全部简码条目首选验证通过 | M | — | — | | P1-2 | ~~corpus M2-1:来源与许可调研~~ ✅ 2026-11-14(ADR-353,报告 279);主候选中央研究院「漢字構形資料庫」(GPL-3/GFDL/CC BY-SA 2.5 TW)+ cjk-decomp(MIT/Apache-2.0)交叉校验;未下载数据 | `docs/research/root-glyph-sources.md`;官方站点证书过期需离线核对 | S | — | ✅ 已调研 | | P1-3 | **字根字形身份库(N1)**:N1-d 已解掉可定位的 D2 补充区 PUA;剩余 13 个未解决项与字形绘制 | ADR-353:N1-d 核验表已接入(报告 280);剩余 13 个(如 U+F005A 氏/卯、U+F001B 才/亅、U+F0145 乚/匕)保持占位。后续才需要 Academia Sinica / 自绘;不再需要全量自绘 251 个 | M–L | N1-d ✅ | 数据入库 | -| P1-4 | ~~真笔顺(N2)/ 结构标注(N3)/ 完整拆字(N4)~~ ✅ 2026-11-14(ADR-355/356,报告 281/282) | D18 56 个成字字根真实笔顺;结构覆盖 2,766/3,000(识别码优先/IDS 参考,146 条冲突记录);8 个 D2 漏拆字补成 full。覆盖扩量后 B0 full 2,740(91.3%)、运行时 2,583(86.1%);剩余 172 unknown;D24 cjk-decomp(Apache-2.0)已接入,未用 D3 作来源 | M–L | P1-3 ✅ | 数据入库 | -| P1-5 | **拆字说明扩充** | B0 已有 2,740 条 `full` 结构化解释(运行时 2,583);D14 旧表仍是 104 条,尚未同步/扩写 | L | P1-4 ✅ | 数据入库 | +| P1-4 | ~~真笔顺(N2)/ 结构标注(N3)/ 完整拆字(N4)~~ ✅ 2026-11-14(ADR-355/356,报告 281/282) | D18 56 个成字字根真实笔顺;结构覆盖 2,766/3,000(识别码优先/IDS 参考,146 条冲突记录);8 个 D2 漏拆字补成 full。覆盖扩量后 B0 full 2,759(92.0%)、运行时 2,602(86.7%);剩余 154 unknown;D24 cjk-decomp(Apache-2.0)已接入,未用 D3 作来源 | M–L | P1-3 ✅ | 数据入库 | +| P1-5 | **拆字说明扩充** | B0 已有 2,759 条 `full` 结构化解释(运行时 2,602);D14 旧表仍是 104 条,尚未同步/扩写 | L | P1-4 ✅ | 数据入库 | | P1-6 | **多方案支持**(五笔 98 / 郑码 / 仓颉) | `modules/keymap` 已按方案数据化(ADR-315),缺码表来源与许可(TBD-2) | M(含数据) | 合格来源 | 数据入库 | | P1-7 | ~~客户端自动回读缺口~~ ✅ 2026-11-14 关闭 | 用户决定收敛外部依赖:Safari/Chrome/Xcode 自动化、探针、fixture 与客户端矩阵已移除;验收只保留系统自带 TextEdit(质量样本)与自建 imetype 窗口 | — | — | 已闭环 | diff --git "a/docs/\346\225\260\346\215\256\346\235\245\346\272\220\344\270\216\350\256\270\345\217\257.md" "b/docs/\346\225\260\346\215\256\346\235\245\346\272\220\344\270\216\350\256\270\345\217\257.md" index 6f54eab0..74f3ab38 100644 --- "a/docs/\346\225\260\346\215\256\346\235\245\346\272\220\344\270\216\350\256\270\345\217\257.md" +++ "b/docs/\346\225\260\346\215\256\346\235\245\346\272\220\344\270\216\350\256\270\345\217\257.md" @@ -300,7 +300,7 @@ D2(`aardio/wubi-lex`,MIT)把部分五笔字根写成补充区私有码位 - `modules/hanzi-structure/corpus/pua-d2-bmp.tsv`:D2 里少数 BMP PUA(U+E816/E826)的 3 条按键位核验(𠂇/手/三)。 - `modules/hanzi-structure/corpus/pua-context.tsv`:34 条**逐字语境**核验(氏/卯、才、乚/匕、儿),解决同一 PUA 在不同字里指不同部件的情况。 - `modules/hanzi-structure/corpus/pua-inventory.tsv`:3,000 字里可定位的 79 个补充区 PUA(verified 64 / partial 2 / unresolved 13);`unresolved` 的 label 留空,供 N1-d 后续自绘/补证。 -- 覆盖扩量(报告 282/283):B0 1,000 字 `full` 927→964、`partial` 65→31;3,000 字 `full` 2,588→2,740、`partial` 192→88、`unknown` 220→172;运行时 `full` 2,462→2,583。剩余 172 个 `unknown` 仍缺可对齐的拆字;未用 D3 作来源(ADR-310)。 +- 覆盖扩量(报告 282/283):B0 1,000 字 `full` 927→965、`partial` 65→31、`unknown` 8→4;3,000 字 `full` 2,588→2,759、`partial` 192→87、`unknown` 220→154;运行时 `full` 2,462→2,602。剩余 154 个 `unknown` 仍缺可对齐的拆字;未用 D3 作来源(ADR-310)。 - 字形参考:qingg 仓库的 `98WB-2.otf` 名称表含 **SIL OFL 1.1**(Source Han Sans 派生、已改保留字名),仅用于构建期人工比对字形;**不随包分发、不进入产物、不复制其轮廓**。2024 年的 `98WB-3.otf` 缺少许可记录,未采用。ADR-353 的"不使用未许可五笔字体"边界不变。 - B0/`B0-runtime.tsv` 只发布核验后的可读字根;产物仍不含任何 PUA。D3(WindInput)继续仅作构建期 oracle,且 2026-11-14 起不再作为 `componentsSource`(ADR-310)。机器登记见 `data/sources.toml` 的 `wubi-pua-supplementary` / `pua-inventory` / `b0-runtime`。 @@ -311,10 +311,10 @@ D2(`aardio/wubi-lex`,MIT)把部分五笔字根写成补充区私有码位 - 用法:**只在构建期**读取源文件;把分解树切成恰好 n 或 n-1 个叶子(n=全码长度),枚举顺序, 只保留每个叶子的五笔键位都与码位一致的候选;n-1 个叶子时识别码结构还必须与 D19 IDS 结构一致; 多个候选视为歧义,跳过。 -- 产物:`data/learning/wubi86-cjkdecomp-coverage.tsv`(项目自编编排 CC-BY-SA-4.0,64 条), +- 产物:`data/learning/wubi86-cjkdecomp-coverage.tsv`(项目自编编排 CC-BY-SA-4.0,83 条), 由 `modules/hanzi-structure/tools/coverage_decomp.py` 生成;B0 里 `componentsSource=D24`。 - 不复制 cjk-decomp 的原始数据进发布产物;源文件由 `data/sources/fetch-cjk-decomp.sh` 下载、校验 SHA-256,不入库。 -- 结果:B0 3,000 字 `unknown` 220→172、`partial` 104→88;运行时 `full` 2,519→2,583。 +- 结果:B0 3,000 字 `unknown` 220→154、`partial` 104→87;运行时 `full` 2,519→2,602。 ### N2/N3/N4 数据地基(ADR-355,2026-11-14) diff --git a/modules/hanzi-structure/corpus/B0-report.json b/modules/hanzi-structure/corpus/B0-report.json index 01ea3e1a..0fe4e197 100644 --- a/modules/hanzi-structure/corpus/B0-report.json +++ b/modules/hanzi-structure/corpus/B0-report.json @@ -1,22 +1,23 @@ { "schemaVersion": 6, "entries": 1000, + "allCodes": false, "quality": { - "full": 964, + "full": 965, "partial": 31, - "unknown": 5 + "unknown": 4 }, "classes": { "radical-char": 42, - "compound": 930, + "compound": 931, "key-name": 23, - "None": 5 + "None": 4 }, "withRecognition": 636, "componentsSource": { "D18": 50, "D2": 913, - "D24": 9 + "D24": 10 }, "puaMap": "corpus/pua-map.json", "placeholderEntries": 23, @@ -24,10 +25,10 @@ "recognitionSlotPua": 15, "withStrokes": 42, "withWritingStrokes": 42, - "structureCoverage": 988, + "structureCoverage": 989, "structureSource": { "recognition": 636, - "IDS": 352 + "IDS": 353 }, "structureConflicts": 62, "manualDecomp": 50, @@ -85,7 +86,7 @@ }, "coverage_decomp": { "path": "../../data/learning/wubi86-cjkdecomp-coverage.tsv", - "sha256": "22c439581feb938bf836340b05d70ad04d90c20226eb38290f909b81ed3fa88b" + "sha256": "914425748261989073c17b2486185917005858889da7169d9cb8bb9e04fcf9d5" } }, "generator": "modules/hanzi-structure/tools/build_b0.py", diff --git a/modules/hanzi-structure/corpus/B0.json b/modules/hanzi-structure/corpus/B0.json index b7a8bea7..af0d1b02 100644 --- a/modules/hanzi-structure/corpus/B0.json +++ b/modules/hanzi-structure/corpus/B0.json @@ -31715,15 +31715,25 @@ { "char": "槸", "code": "sfwy", - "class": null, - "componentsSource": null, - "components": [], - "keys": [], + "class": "compound", + "componentsSource": "D24", + "components": [ + "木", + "土", + "八", + "丶" + ], + "keys": [ + "s", + "f", + "w", + "y" + ], "strokes": null, "strokesSource": null, "strokesKind": null, - "structure": null, - "structureSource": null, + "structure": "左右", + "structureSource": "IDS", "structureConflict": false, "ids": "⿰木埶", "idsStructure": "左右", @@ -31733,9 +31743,10 @@ "short2": null, "pinyin": "yi", "frequency": 3667, - "quality": "unknown", + "quality": "full", "notes": [ - "缺拆字数据" + "使用 D24 覆盖拆字(cjk-decomp 树切分 + 码位键位/IDS 校验)", + "字根已够四码,无识别码" ] }, { diff --git a/modules/hanzi-structure/tools/build_b0.py b/modules/hanzi-structure/tools/build_b0.py index d1cc0efd..44f42438 100755 --- a/modules/hanzi-structure/tools/build_b0.py +++ b/modules/hanzi-structure/tools/build_b0.py @@ -579,6 +579,8 @@ def main() -> int: parser.add_argument('--coverage-decomp', help='D24 cjk-decomp 覆盖拆字(可选)') parser.add_argument('--limit', type=int, default=1000) + parser.add_argument('--all-codes', action='store_true', + help='覆盖全码表全部字(27,823),忽略 --limit') parser.add_argument('--runtime-out', help='教学运行时资源(TSV,ADR-311):字\t全码\t质量\t讲解') parser.add_argument('--out-dir', required=True) args = parser.parse_args() @@ -626,7 +628,11 @@ def main() -> int: context_map = load_pua_context(Path(args.pua_context)) if args.pua_context else {} coverage_decomp = load_coverage_decomp(Path(args.coverage_decomp)) if args.coverage_decomp else {} - ranked = sorted(freq.items(), key=lambda kv: (-kv[1], kv[0]))[: args.limit] + if args.all_codes: + ranked = sorted(((char, 0) for char in codes), + key=lambda kv: (-freq.get(kv[0], 0), kv[0])) + else: + ranked = sorted(freq.items(), key=lambda kv: (-kv[1], kv[0]))[: args.limit] entries = [] for char, _weight in ranked: code = codes.get(char) @@ -671,6 +677,7 @@ def main() -> int: report = { 'schemaVersion': SCHEMA_VERSION, 'entries': len(entries), + 'allCodes': bool(args.all_codes), 'quality': {'full': stats.get('full', 0), 'partial': stats.get('partial', 0), 'unknown': stats.get('unknown', 0)}, 'classes': {k.split(':', 1)[1]: v for k, v in stats.items() if k.startswith('class:')}, diff --git a/modules/hanzi-structure/tools/coverage_decomp.py b/modules/hanzi-structure/tools/coverage_decomp.py index f8721567..b061421c 100644 --- a/modules/hanzi-structure/tools/coverage_decomp.py +++ b/modules/hanzi-structure/tools/coverage_decomp.py @@ -151,14 +151,19 @@ def main() -> int: cut_any = False key_bad = False rec_bad = False - for want in (len(code), len(code) - 1): - if want < 2: + budget = max(8, len(code), len(code) - 1) + for leaves in all_cuts(tree, keys, char, budget): + if not leaves: continue - for leaves in all_cuts(tree, keys, char, want): - if len(leaves) != want: - continue + variants = [] + if len(leaves) in (len(code), len(code) - 1): + variants.append(tuple(leaves)) + # 五笔 4 根以上取「前 3 + 末根」 + if len(code) == 4 and len(leaves) > 4: + variants.append(tuple(leaves[:3] + [leaves[-1]])) + for variant in variants: cut_any = True - for perm in itertools.permutations(leaves): + for perm in itertools.permutations(variant): norm = tuple(normalize_leaf(leaf) for leaf in perm) if norm in candidates: continue diff --git a/modules/keymap/data/key-roots-wubi86-audit.md b/modules/keymap/data/key-roots-wubi86-audit.md index a300bd06..7d3fcd2d 100644 --- a/modules/keymap/data/key-roots-wubi86-audit.md +++ b/modules/keymap/data/key-roots-wubi86-audit.md @@ -19,16 +19,16 @@ | D | 13 | 𠂇×42、丰×14、镸×2、亅×1、尤×1 | 羊 | | F | 12 | 井×8、革×6、才×5、聿×5、ㄇ×1、𬺰×1 | — | | G | 11 | 主×29、丆×10 | — | -| H | 21 | 丨×142、龰×20、亅×12、𠂇×10、虍×7 | 虎、皮、⺊ | +| H | 21 | 丨×145、龰×20、亅×12、𠂇×10、虍×7 | 虎、皮、⺊ | | J | 22 | 〢×28、リ×4、亅×1 | — | | K | 23 | 〣×2、〇×1、亅×1 | — | | L | 24 | 車×2、卌×1 | — | | Z | 0 | — | 万能 | -| X | 55 | ㄠ×24、糹×4、毌×3、彑×2 | — | +| X | 55 | ㄠ×24、糹×5、毌×3、彑×2 | — | | C | 54 | マ×19、ス×7、馬×1 | — | | V | 53 | — | — | | B | 52 | ⺋×20、乛×8、ㄗ×3、亅×2 | — | | N | 51 | ノ×27、乛×26、𠃌×26、ㄅ×25、コ×17、⺄×10、ユ×8、ㄋ×8、ㄥ×8、户×3、⺗×2、ㄠ×2 | 已 | -| M | 25 | ㄇ×26、貝×2、骨×2、巾×1 | — | +| M | 25 | ㄇ×26、貝×4、骨×2、巾×1 | — | 说明:语料里的拆分是「实际拆字结果」,包含复合部件与变形写法,不都是字根;本表以标准字根表为展示真源,语料差异仅作回归线索,不改展示内容。