Hacker News 中文摘要

RSS订阅

WangNet:1.8 MB 零依赖,11 种语言实现 Numberwang 判定 -- WangNet – 1.8 MB, zero-dependency Numberwang adjudication in 11 languages

这是一个判断数字是否为数字王(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)