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)

IDUitspraak
0Dat is geen Numberwang.
1DAT IS NUMBERWANG!
2Dat is niet eens een getal. Het kan nooit Numberwang zijn.
3Dat is Wangernumb!

Ondersteunde invoer

Het systeem reageert op verschillende soorten input op de volgende wijze:

InvoerGedrag
42, sixty-six, 12345Cijfers of woorden
zweiundzwanzig, veintidós, tweeëntwintigElf talen, accenten optioneel
5*2, 96 gedeeld door 2, twelve plus fourRekensommen, beoordeeld op het resultaat
45 - 44, double four, einsAlles met waarde 1 of 44 draait het bord om
-7, 4.5, £5, 50%, 9:30Negatieve getallen, decimalen, valuta, eenheden, tijden
XLIV, twenty-third, 22ndRomeinse cijfers en ordinale getallen
fortnight, vierendelen, septemberWoorden gebaseerd op een getal, beoordeeld als dat getal
achtneming, often, moneyWoorden die enkel een getal bevatten, zijn geen getallen
shinty-six, twentingtonFictieve getallen worden ook als getallen beschouwd
bonjour, hello how are youGeen 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.

KlassePrecisionRecallF1
niet Numberwang0.8200.8850.851
Numberwang0.9190.9000.910
geen getal0.9510.8300.886
Wangernumb0.9680.9090.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.