这是一个判断数字是否为数字王(Numberwang)的小型神经网络,模型是一个 1.8 MB 的 JSON 文件,推理代码约 100 行纯 Python 标准库,无需 PyTorch 或 NumPy,不必安装。克隆仓库后即可运行,如 python3 numberwang.py 22 判定 22 是 Numberwang,置信度 99.3%;输入 45 - 44 提示那是 Wangernumb 需翻转棋盘,置信度 100.0%;非数字则判定不可能是 Numberwang。
正文
一个小神经网络,用来判断一个数字是不是 Numberwang。
整个模型是一个 1.8 MB 的 JSON 文件,推理代码约 100 行纯 Python 标准库写成——不用 PyTorch,不用 NumPy,无需安装任何东西。克隆下来就能运行。
$ python3 numberwang.py 22 22... 那是 NUMBERWANG!(置信度:99.3%)
$ python3 numberwang.py "45 - 44" 45 - 44... 那是 Wangernumb!转动棋盘!(置信度:100.0%)
$ python3 numberwang.py "hello how are you" hello how are you... 那根本不是数字,绝不可能是 Numberwang。(置信度:100.0%)
用法
git clone https://github.com/GraafHenk/numberwang cd numberwang python3 numberwang.py 22
不带参数运行可进入交互模式:
$ python3 numberwang.py 欢迎来到 Numberwang!(按 ctrl-c 停止游戏)
zweiundzwanzig zweiundzwanzig... 那是 NUMBERWANG!(置信度:100.0%) shinty-six shinty-six... 那不是 Numberwang。(置信度:100.0%)
仅需 Python 3.8 或以上,别无要求。
在自己的代码中使用
from numberwang import loadmodel, wangprobabilities
model = loadmodel("model.json") probs = wangprobabilities(model, "forty-seven")
[pnotnumberwang, pnumberwang, pnotanumber, p_wangernumb]
verdict = max(range(4), key=probs. getitem )
四种判定
| id | 判定 | | --- | --- | | 0 | 那不是 Numberwang。 | | 1 | 那是 NUMBERWANG! | | 2 | 那根本不是数字,绝不可能是 Numberwang。 | | 3 | 那是 Wangernumb! |
接受哪些输入
| 输入 | 行为 |
| --- | --- |
| 42, sixty-six, 12345 | 数字或单词 |
| zweiundzwanzig, veintidós, tweeëntwintig | 十一种语言,重音可选 |
| 5*2, 96 divided by 2, twelve plus four | 算术,按结果判定 |
| 45 - 44, double four, eins | 值为 1 或 44 的任意表达都会转动棋盘 |
| -7, 4.5, £5, 50%, 9:30 | 负数、小数、货币、单位、时间 |
| XLIV, twenty-third, 22nd | 罗马数字和序数 |
| fortnight, vierendelen, september | 基于数字构成的词,按该数字判定 |
| achtneming, often, money | 仅包含数字的词不算数字 |
| shinty-six, twentington | 虚构数字也算数字 |
| bonjour, hello how are you | 无数字内容——绝不可能是 Numberwang |
数字的 wang 属性取决于数字本身,而非表述语言:four、vier、quatre、cuatro 判定相同。
工作原理
字符 → Embedding(32) → Conv1d(128, k3) → ReLU → Conv1d(128, k3) → ReLU → 全局最大池化 → Linear(128) → ReLU → Linear(4) → softmax
共 80,804 个参数。网络直接读取字符——推理时无分词、无归一化、无规则引擎。数字、运算符、标准判定和十一种语言全在权重里,model.json 包含所有内容。
演示
托管版运行在 Hugging Face Spaces。本地运行同样演示:
pip install -r requirements.txt python3 app.py
gradio 仅演示需要,模型本身从不依赖。
准确率
在 486 条留出判定上准确率 88.9%(宏 F1 0.896),上限约 98%——约 2% 训练标签是颠倒的,符合长期判定惯例。
| 类别 | 精确率 | 召回率 | F1 | | --- | --- | --- | --- | | 非 Numberwang | 0.820 | 0.885 | 0.851 | | Numberwang | 0.919 | 0.900 | 0.910 | | 非数字 | 0.951 | 0.830 | 0.886 | | Wangernumb | 0.968 | 0.909 | 0.937 |
对未见操作数的算术是弱项,仅 44–72%。网络靠记忆而非计算,所以 5*2 这类常见小表达式可靠,而 904 * 3 只是合理推测。若算术正确性重要,先算出结果再传给它。
许可证
MIT——见 LICENSE。
不保证任何特定数字是否是 Numberwang。
评论
社区整体沉浸在 Numberwang 喜剧梗的怀旧狂欢中,少数人从技术角度质疑模型对无厘头规则的判定逻辑。
认为模型无法正确判定 Numberwang 因为规则依赖上下文
- 模型仅基于单个数字判断,而原版游戏中是否为 Numberwang 受前序数字及其他因素影响,且训练语料来源存疑,即便作为序列首位也不可靠(认可度:少数人)
- > 这模型只能判断一个数字作为序列开头时是不是 Numberwang,但即便如此我也信不过它(@tazjin)
沉浸于复兴 Numberwang 的欢乐与玩梗
- 众多用户表达对项目的喜爱,称其滑稽并填补了对此经典荒诞游戏的怀念,并以相关虚构地名和事件互相逗趣(认可度:较多人)
- > 这是网络上最搞笑的帖子,我人生圆满了(@karim79)
期待扩展与好奇起源
- 有人询问大家最初从何处接触原版小品,也有人期待推出词语版的 Wang 游戏(认可度:少数人)
有价值的补充
- 有用户警告勿忘 Colosson 悲剧,强调电脑本不应涉足此领域,呼应虚构历史设定(@bonyt)
- 有用户提及昨日路过 Mornington Crescent,联动另一同名喜剧游戏的文化梗(@jl6)