Numberwang is een lichtgewicht neuraal netwerk dat is ontworpen om te bepalen of een invoer "Numberwang" is. Het project is zeer efficiënt: het model is opgeslagen in een JSON-bestand van 1,8 MB en de inferentie-code bestaat uit ongeveer 100 regels pure Python, waardoor externe libraries zoals PyTorch of NumPy niet nodig zijn.
Belangrijkste kenmerken:
- Input: Het systeem ondersteunt cijfers, woorden in elf verschillende talen, eenvoudige rekensommen, Romeinse cijfers en ordinale getallen.
- Architectuur: Het netwerk maakt gebruik van embeddings, Conv1d-lagen, ReLU-activaties en een softmax-output, met in totaal 80.804 parameters.
- Uitkomsten: Er zijn vier mogelijke verdicts: "niet Numberwang", "DAT IS NUMBERWANG!", "geen getal" en "Wangernumb".
- Prestaties: De nauwkeurigheid is 88,9%. Het model is sterk in herkenning, maar minder in complexe rekenkunde omdat het patronen onthoudt in plaats van daadwerkelijk te berekenen.
- Licentie: De software is open source onder de MIT-licentie.
Numberwang
Voorbeelden van gebruik
$ python3 numberwang.py 22
22... DAT IS NUMBERWANG! (betrouwbaarheid: 99.3%)
$ python3 numberwang.py "45 - 44"
45 - 44... Dat is Wangernumb! Draai het bord om! (betrouwbaarheid: 100.0%)
$ python3 numberwang.py "hello how are you"
hello how are you... Dat is niet eens een getal. Het kan nooit Numberwang zijn. (betrouwbaarheid: 100.0%)
Installatie en gebruik
Om de software te gebruiken, volg je deze stappen:
git clone https://github.com/GraafHenk/numberwang
cd numberwang
python3 numberwang.py 22
Je kunt het programma ook zonder argumenten starten voor een interactieve sessie:
$ python3 numberwang.py
Welcome to Numberwang! (ctrl-c om te stoppen met spelen)
> zweiundzwanzig
zweiundzwanzig... DAT IS NUMBERWANG! (betrouwbaarheid: 100.0%)
> shinty-six
shinty-six... Dat is geen Numberwang. (betrouwbaarheid: 100.0%)
Vereisten: Python 3.8 of nieuwer. Dit is de enige vereiste.
Gebruik in eigen code
Je kunt de functionaliteit integreren in je eigen Python-projecten:
from numberwang import load_model, wang_probabilities
model = load_model("model.json")
probs = wang_probabilities(model, "forty-seven")
# [p_niet_numberwang, p_numberwang, p_geen_getal, p_wangernumb]
verdict = max(range(4), key=probs.__getitem__)
De vier mogelijke uitspraken (verdicts)
| ID | Uitspraak |
| 0 | Dat is geen Numberwang. |
| 1 | DAT IS NUMBERWANG! |
| 2 | Dat is niet eens een getal. Het kan nooit Numberwang zijn. |
| 3 | Dat is Wangernumb! |
Ondersteunde invoer
Het systeem reageert op verschillende soorten input op de volgende wijze:
| Invoer | Gedrag |
| 42, sixty-six, 12345 | Cijfers of woorden |
| zweiundzwanzig, veintidós, tweeëntwintig | Elf talen, accenten optioneel |
| 5*2, 96 gedeeld door 2, twelve plus four | Rekensommen, beoordeeld op het resultaat |
| 45 - 44, double four, eins | Alles met waarde 1 of 44 draait het bord om |
| -7, 4.5, £5, 50%, 9:30 | Negatieve getallen, decimalen, valuta, eenheden, tijden |
| XLIV, twenty-third, 22nd | Romeinse cijfers en ordinale getallen |
| fortnight, vierendelen, september | Woorden gebaseerd op een getal, beoordeeld als dat getal |
| achtneming, often, money | Woorden die enkel een getal bevatten, zijn geen getallen |
| shinty-six, twentington | Fictieve getallen worden ook als getallen beschouwd |
| bonjour, hello how are you | Geen numerieke inhoud — kan nooit Numberwang zijn |
De "wangness" van een getal is een eigenschap van het getal zelf, niet van de taal waarin het wordt uitgedrukt: four, vier, quatre en cuatro krijgen allemaal dezelfde uitspraak.
Werking
De architectuur van het netwerk is als volgt opgebouwd: chars → Embedding(32) → Conv1d(128, k3) → ReLU → Conv1d(128, k3) → ReLU → global max pool → Linear(128) → ReLU → Linear(4) → softmax
Het model bevat 80.804 parameters. Het netwerk leest tekens direct; er is geen tokenizer, geen normaliseerder en geen rules-engine tijdens de inferentie. Cijfers, operatoren, canonieke uitspraken en de elf talen zijn allemaal vastgelegd in de gewichten; model.json bevat alle informatie.
Demo
Er is een gehoste versie beschikbaar op Hugging Face Spaces. Om dezelfde demo lokaal uit te voeren:
pip install -r requirements.txt
python3 app.py
Let op: gradio is alleen nodig voor de demo. Het model zelf heeft dit niet nodig.
Nauwkeurigheid
De nauwkeurigheid is 88,9% over 486 onafhankelijke beoordelingen (macro-F1 0,896), tegenover een theoretisch maximum van ongeveer 98% — ongeveer 2% van de trainingslabels zijn namelijk omgekeerd, conform langdurige beoordelingspraktijken.
| Klasse | Precision | Recall | F1 |
| niet Numberwang | 0.820 | 0.885 | 0.851 |
| Numberwang | 0.919 | 0.900 | 0.910 |
| geen getal | 0.951 | 0.830 | 0.886 |
| Wangernumb | 0.968 | 0.909 | 0.937 |
Het zwakke punt is rekenkunde met onbekende operanden, waarbij de nauwkeurigheid tussen de 44% en 72% ligt. Het netwerk onthoudt eerder dan dat het berekent, waardoor kleine veelvoorkomende expressies zoals 52 betrouwbaar zijn, terwijl 904 3 een gefundeerde gok is. Indien rekenkundige correctheid essentieel is, dient de expressie eerst geëvalueerd te worden waarna het resultaat aan het model wordt gevoerd.
Licentie
MIT — zie LICENSE.
Er wordt geen uitdrukkelijke of stilzwijgende garantie gegeven over het feit of een specifiek getal al dan niet Numberwang is.
Numberwang
Voorbeelden van gebruik
$ python3 numberwang.py 22
22... DAT IS NUMBERWANG! (betrouwbaarheid: 99.3%)
$ python3 numberwang.py "45 - 44"
45 - 44... Dat is Wangernumb! Draai het bord om! (betrouwbaarheid: 100.0%)
$ python3 numberwang.py "hello how are you"
hello how are you... Dat is niet eens een getal. Het kan nooit Numberwang zijn. (betrouwbaarheid: 100.0%)
Installatie en gebruik
Om de software te gebruiken, volg je deze stappen:
git clone https://github.com/GraafHenk/numberwang
cd numberwang
python3 numberwang.py 22
Je kunt het programma ook zonder argumenten starten voor een interactieve sessie:
$ python3 numberwang.py
Welcome to Numberwang! (ctrl-c om te stoppen met spelen)
> zweiundzwanzig
zweiundzwanzig... DAT IS NUMBERWANG! (betrouwbaarheid: 100.0%)
> shinty-six
shinty-six... Dat is geen Numberwang. (betrouwbaarheid: 100.0%)
Vereisten: Python 3.8 of nieuwer. Dit is de enige vereiste.
Gebruik in eigen code
Je kunt de functionaliteit integreren in je eigen Python-projecten:
from numberwang import load_model, wang_probabilities
model = load_model("model.json")
probs = wang_probabilities(model, "forty-seven")
# [p_niet_numberwang, p_numberwang, p_geen_getal, p_wangernumb]
verdict = max(range(4), key=probs.__getitem__)
De vier mogelijke uitspraken (verdicts)
| ID | Uitspraak |
| 0 | Dat is geen Numberwang. |
| 1 | DAT IS NUMBERWANG! |
| 2 | Dat is niet eens een getal. Het kan nooit Numberwang zijn. |
| 3 | Dat is Wangernumb! |
Ondersteunde invoer
Het systeem reageert op verschillende soorten input op de volgende wijze:
| Invoer | Gedrag |
| 42, sixty-six, 12345 | Cijfers of woorden |
| zweiundzwanzig, veintidós, tweeëntwintig | Elf talen, accenten optioneel |
| 5*2, 96 gedeeld door 2, twelve plus four | Rekensommen, beoordeeld op het resultaat |
| 45 - 44, double four, eins | Alles met waarde 1 of 44 draait het bord om |
| -7, 4.5, £5, 50%, 9:30 | Negatieve getallen, decimalen, valuta, eenheden, tijden |
| XLIV, twenty-third, 22nd | Romeinse cijfers en ordinale getallen |
| fortnight, vierendelen, september | Woorden gebaseerd op een getal, beoordeeld als dat getal |
| achtneming, often, money | Woorden die enkel een getal bevatten, zijn geen getallen |
| shinty-six, twentington | Fictieve getallen worden ook als getallen beschouwd |
| bonjour, hello how are you | Geen numerieke inhoud — kan nooit Numberwang zijn |
De "wangness" van een getal is een eigenschap van het getal zelf, niet van de taal waarin het wordt uitgedrukt: four, vier, quatre en cuatro krijgen allemaal dezelfde uitspraak.
Werking
De architectuur van het netwerk is als volgt opgebouwd: chars → Embedding(32) → Conv1d(128, k3) → ReLU → Conv1d(128, k3) → ReLU → global max pool → Linear(128) → ReLU → Linear(4) → softmax
Het model bevat 80.804 parameters. Het netwerk leest tekens direct; er is geen tokenizer, geen normaliseerder en geen rules-engine tijdens de inferentie. Cijfers, operatoren, canonieke uitspraken en de elf talen zijn allemaal vastgelegd in de gewichten; model.json bevat alle informatie.
Demo
Er is een gehoste versie beschikbaar op Hugging Face Spaces. Om dezelfde demo lokaal uit te voeren:
pip install -r requirements.txt
python3 app.py
Let op: gradio is alleen nodig voor de demo. Het model zelf heeft dit niet nodig.
Nauwkeurigheid
De nauwkeurigheid is 88,9% over 486 onafhankelijke beoordelingen (macro-F1 0,896), tegenover een theoretisch maximum van ongeveer 98% — ongeveer 2% van de trainingslabels zijn namelijk omgekeerd, conform langdurige beoordelingspraktijken.
| Klasse | Precision | Recall | F1 |
| niet Numberwang | 0.820 | 0.885 | 0.851 |
| Numberwang | 0.919 | 0.900 | 0.910 |
| geen getal | 0.951 | 0.830 | 0.886 |
| Wangernumb | 0.968 | 0.909 | 0.937 |
Het zwakke punt is rekenkunde met onbekende operanden, waarbij de nauwkeurigheid tussen de 44% en 72% ligt. Het netwerk onthoudt eerder dan dat het berekent, waardoor kleine veelvoorkomende expressies zoals 52 betrouwbaar zijn, terwijl 904 3 een gefundeerde gok is. Indien rekenkundige correctheid essentieel is, dient de expressie eerst geëvalueerd te worden waarna het resultaat aan het model wordt gevoerd.
Licentie
MIT — zie LICENSE.
Er wordt geen uitdrukkelijke of stilzwijgende garantie gegeven over het feit of een specifiek getal al dan niet Numberwang is.