Instructions to use ntedvs/irex with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use ntedvs/irex with MLX:
# Make sure mlx-lm is installed # pip install --upgrade mlx-lm # if on a CUDA device, also pip install mlx[cuda] # Generate text with mlx-lm from mlx_lm import load, generate model, tokenizer = load("ntedvs/irex") prompt = "Once upon a time in" text = generate(model, tokenizer, prompt=prompt, verbose=True) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- MLX LM
How to use ntedvs/irex with MLX LM:
Generate or start a chat session
# Install MLX LM uv tool install mlx-lm # Generate some text mlx_lm.generate --model "ntedvs/irex" --prompt "Once upon a time"
- Atomic Chat
|
Download README.md from ntedvs/irex: direct link, hf CLI and curl.
- Browser
- Download file 3.37 kB
-
https://huggingface.co/ntedvs/irex/resolve/main/README.md
- Command line
-
hf download hf://ntedvs/irex/README.md
-
curl -L -o README.md https://huggingface.co/ntedvs/irex/resolve/main/README.md
3.37 kB
| license: mit | |
| language: en | |
| library_name: mlx | |
| pipeline_tag: text-generation | |
| tags: | |
| - regex | |
| - javascript | |
| - mlx | |
| - tiny | |
| - from-scratch | |
| # irex | |
| English in, JavaScript regex out. A 2.6M-parameter transformer trained from random weights, with no pretrained components. | |
| ``` | |
| $ python infer.py "a hex color code like #fff or #a1b2c3" | |
| /^#(?:[0-9a-fA-F]{3}){1,2}$/ | |
| ``` | |
| ## Usage | |
| Requires Apple Silicon (MLX). | |
| ``` | |
| hf download ntedvs/irex --local-dir irex && cd irex | |
| pip install -r requirements.txt | |
| python infer.py "iso date like 2024-01-31" # /^\d{4}-\d{2}-\d{2}$/ | |
| python infer.py -k 5 "an email address" # top 5 candidates | |
| python infer.py # interactive | |
| ``` | |
| This is a custom MLX model. It does not load with `transformers`. | |
| ## Model | |
| - **Parameters:** 2.6M (d192, 4 layers, 4 heads) | |
| - **Architecture:** decoder-only, RMSNorm, RoPE, SwiGLU, tied embeddings | |
| - **Tokenizer:** BPE (4096) trained from scratch for the English, one token per digit; raw bytes for the regex | |
| - **Decoding:** beam search (8), reranked by: compiles, matches example strings in the request, in scope | |
| - **Training:** 60k steps, batch 128, about 9 passes over the data, 40 minutes on an M4 Pro | |
| ## Scope | |
| JS regex at an intermediate level: literals, `.`, classes, `\d \w \s \b` and negations, quantifiers (including lazy), groups, `|`, `^ $`, and the `i` flag. No lookarounds, backrefs, named groups, `\p{}`, or other flags. | |
| ## Training data | |
| About 815k English-to-regex pairs: | |
| - **Regexes:** 159k, sampled from a grammar plus realistic templates. Each is labeled with matching and non-matching strings using real JS semantics (QuickJS). | |
| - **English:** generated by DeepSeek-V4.1-Flash in five styles: casual, terse, precise, purpose, sloppy. Plus short everyday requests. | |
| - **Rule-based:** 60k everyday pairs: passwords, lengths, starts/ends/contains, and similar. | |
| The split is by regex, so test regexes never appear in training. | |
| ## Results | |
| | Eval | Score | | |
| | ---------------------------------------------- | ----- | | |
| | Held-out test, 15,058 pairs, behavioral match | 67.9% | | |
| | Same, exact string match | 39.3% | | |
| | Compiles | 100% | | |
| | Everyday bench A (40 requests) | 82.5% | | |
| | Everyday bench B (20 requests, never tuned on) | 65% | | |
| Behavioral match means the output accepts and rejects the same strings as the reference regex. It's checked on sampled strings, so it isn't a proof of equivalence. | |
| By style: precise 90%, casual 79%, terse 66%, sloppy 62%, short 57%, purpose 47%. Most misses come from underspecified requests. For example, "zip code" doesn't say whether to allow +4, and many requests don't say whether to match the whole string or anywhere in it. | |
| Larger models (5.9M, 12M, 28M) trained on the same data scored the same. The data is the limit, not the model size. | |
| ## Limitations | |
| - Weak on numeric ranges (years 1900 to 2099), MAC addresses, and full UUIDs. | |
| - Anchoring is often a guess when the request doesn't specify it. | |
| - Can copy request words literally. For example, "password" may become `pass`. | |
| - Always test the output before using it. | |
| ## License | |
| MIT. Training text was generated with the DeepSeek API, whose terms assign outputs to the user and permit training other models on them. | |