Snowball stemming algorithms for MoonBit: 11 language stemmers with golden-corpus verification.
fn main raise @runtime.Lab {
let p = @english.English::new()
println(@english.stem_word(p, "running"))
}run比对规则:比较前先去掉行尾的 \r,再逐字节比较,不做其他规范化。本机 Windows native 的 println 行尾是 CRLF,moon run 的 stdout 是 run\r\n(其他平台是 run\n);去掉 \r 后与 output.txt:32214 逐字节相同。输入应为小写(大写输入的行为见第 6 节)。
| 语言 | 语料行数(voc.txt) | 闸门 checked | mismatch | 需特殊对待的字符(lang_registry.mbt 的 charset) |
|---|---|---|---|---|
| arabic | 9,196,214 | 9,196,214 | 0 | 阿拉伯字母(U+0600–U+06FF 区段) |
| dutch | 45,670 | 45,670 | 0 | á、à、ä、é、è、ë、í、ï、ó、ö、ú、ü |
| english | 42,649 | 42,649 | 0 | 无(语料纯 ASCII) |
| french | 21,653 | 21,653 | 0 | é、è、ê、ç、à、ô、û;语料 NFC、无组合字符 |
| german | 35,053 | 35,053 | 0 | ä、ö、ü、ß(ß 是单码点,非 ss 连写) |
| italian | 37,426 | 37,426 | 0 | à、è、é、ì、ò、ù |
| porter | 42,603 | 42,603 | 0 | 无(语料纯 ASCII) |
| portuguese | 32,016 | 32,016 | 0 | á、à、â、ã、ç、é、ê、í、ó、ô、õ、ú |
| russian | 49,785 | 49,785 | 0 | 西里尔(U+0400–U+04FF) |
| spanish | 28,378 | 28,378 | 0 | á、é、í、ó、ú、ñ |
| turkish | 96,325 | 96,325 | 0 | ı(U+0131)、ş、ğ |
| 语言 | 4 参 Among 计数 | 状态 | 原因 |
|---|---|---|---|
| finnish | 11 | 不交付 | among 回调型:among 表需改为实例字段 |
| hindi | 12 | 不交付 | 同上(回调需捕获实例,模块级 let 无法捕获) |
| lovins | 294 | 不交付 | 同上(上游 modules.txt 默认注释掉该行) |
| polish | 21 | 不交付 | 同上(回调需捕获实例,模块级 let 无法捕获) |
| 目标 | moon build | moon test | moon run | 结论 |
|---|---|---|---|---|
| native | Yes | Yes | Yes | 端到端可用,CI 与本地验收一律用它 |
| wasm | Yes | No | No | 仅作 build 产物检查:本机 moonrun 缺 GetTempPath2W(Win11+/Server 2022+ 才有),启动即 0xC0000139 |
| wasm-gc | Yes | No | No | 同上 |
| js | Yes | No with the stock toolchain/node shim | No | 编译可用;运行需要真实 node,本机 node 是坏 shim(把 node 换成本地 bun 替身后 moon test --target js 通过),所以本机 stock 工具链下这项判 No |
| llvm | No | — | — | 仅 nightly 提供,stable 直接 ICE;test / run 未尝试 |
| 语料(sd/<name>/) | 行数 | 分发形态 | voc.txt 字节 | output.txt 字节 |
|---|---|---|---|---|
| arabic | 9,196,214 | gz | 23,186,643(gz) | 4,213,721(gz) |
| dutch | 45,670 | plain | 505,891 | 441,688 |
| english | 42,649 | plain | 365,849 | 307,066 |
| french | 21,653 | plain | 200,772 | 153,422 |
| german | 35,053 | plain | 370,070 | 306,286 |
| italian | 37,426 | plain | 351,821 | 267,587 |
| porter | 42,603 | plain | 365,375 | 308,128 |
| portuguese | 32,016 | plain | 294,835 | 227,114 |
| russian | 49,785 | plain | 854,337 | 657,357 |
| spanish | 28,378 | plain | 267,628 | 201,670 |
| turkish | 96,325 | plain | 1,074,859 | 802,426 |
| 11 个交付 stemmer 合计 | 9,627,772 | 10 plain + 1 gz | — | — |
| 12 行闸门合计(含 porter311 对照) | 9,670,375 | — | — | — |
| 能力项 | 本库行为 | 依据 |
|---|---|---|
| 非 BMP 字符(U+10000 以上,如 emoji) | 未定义 | String 是 UTF-16,非 BMP 占 2 个码元,与 Snowball「1 码点 = 1 symbol」不同;本批语料 0 个非 BMP,能力未验证 |
| 组合字符(NFD 形式,如 e + U+0301) | 未定义 | 不做 Unicode 归一化,码元原样参与分组与切片;语料全部 NFC、combining=0 |
| 大写输入 | 未定义 | 「确定行为 + 不 panic + 合法 UTF-8」这条判据的证据只覆盖六个拉丁语系 stemmer(french、german、spanish、italian、portuguese、dutch,另有 porter 一个大写确定性探针);english 与非拉丁的 russian、arabic、turkish 没有大写输入用例。不保证与官方输出一致;库内不做 to_lower(会破坏与 golden 的等价性) |
| KOI8-R | 不转换 | modules.txt 为 russian 登记 UTF_8,KOI8_R;本库只接收 UTF-8,不做转码 |
| ISO-8859-1 | 不转换 | modules.txt 为 porter / dutch / english / french / german / italian / portuguese / spanish 登记 ISO_8859_1;本库只接收 UTF-8,不做转码 |
| CP1256 | 不转换 | arabic 的常用旧编码;上游 Python 包内 0 处 CP1256 引用,本库同样不转码 |
sh scripts/pipeline.sh # unpack→generate→translate→fmt→check→golden
grep -E '^(lang=[^ ]+ checked=|stage=golden|GATE)' .planning/logs/u2/T2-entry.logSNOWBALL_DATA_ROOT=/path/to/snowball-data sh scripts/pipeline.sh # 该路径必须已存在lang=porter checked=42603 mismatch=0 ms=233
lang=porter311 checked=42603 mismatch=0 ms=245
...
lang=arabic checked=9196214 mismatch=0 ms=201027
stage=golden rows=12 mismatch=0 elapsed=...
GATE OKpub struct LangEntry {
name : String
pkg : String
golden_dir : String
lines : Int
compressed : Bool
charset : String
}Install
Download zipSnowball stemming algorithms for MoonBit: 11 language stemmers with golden-corpus verification.