Moroccan Darija (Arabic) phrase analyzer — classify each word by source language (French/English/Darija), detect semantic entities (money, time, date, phone...) and strip morphological prefixes. Built in Rust for O(1) lookup.
Project description
darija-router
Moroccan Darija language router — O(1) phrase analysis with morphological stripping, semantic tagging, NER, and code-switching detection. Built in Rust, wrapped for Python.
Classifies Arabic-script Darija words by source language (fr, en, darija), Latin spelling, category, probability, semantic role, and confidence score.
Install
pip install darija-router
Quick Start
import darija_router
result = darija_router.analyze(
"خويا باغي نلقاك غدوة الساعة 3 صباح فالساحة، "
"واش باغي نشريو شي تيليفون جديد ب 500 درهم؟"
)
API Reference
darija_router.analyze(phrase, mode=None, fields=None)
Tokenizes a phrase and classifies each token.
Parameters:
phrase(str): Input text in Arabic scriptmode(str, optional): Output preset —"full"(default),"compact","ner","codeswitch"fields(list[str], optional): Custom field selection — e.g.["token", "lang", "confidence"]
Returns: list[dict] with per-token results.
darija_router.run_ner(phrase)
Named Entity Recognition. Returns span-based entities and per-token NER tags.
Returns:
{
"entities": [
{"text": "500 درهم", "entity_type": "MONEY", "start": 0, "end": 8, "token_indices": [0, 1]}
],
"tokens": [
{"token": "500", "ner_tag": "MONEY"},
{"token": "درهم", "ner_tag": "MONEY"}
]
}
Entity types: MONEY, MEASURE, TIME, DATE, PHONE, EMAIL, URL, CARDINAL, DECIMAL, ORDINAL, FRACTION, PERCENT, PERSON, LOC
darija_router.run_codeswitch(phrase)
Code-switching detection with language spans and statistics.
Returns:
{
"spans": [
{"text": "خويا واش", "lang": "darija", "start": 0, "end": 9}
],
"tokens": [
{"token": "خويا", "lang": "darija", "latin": null, "confidence": 1.0}
],
"stats": {
"darija": 50.0, "fr": 25.0, "en": 0.0, "num": 12.5, "punct": 0.0, "other": 0.0, "unknown": 12.5
}
}
darija_router.lookup(word)
Single word lookup. Same format as one element from analyze().
darija_router.__version__
Package version string.
Semantic Tags
| Tag | Detection | Example |
|---|---|---|
PUNCT |
Punctuation characters | ؟ ، . ! |
CARDINAL |
Digits or Arabic number words | 50 عشرين مية |
DECIMAL |
Decimal numbers | 3.5 ١٢.٥ |
MONEY |
Cardinal + currency word | 50 درهم → both tokens tagged |
MEASURE |
Cardinal + unit word | 2 كيلو → both tokens tagged |
TIME |
الساعة + cardinal, or time words |
الساعة 3 صباح مساء |
DATE |
Date words or cardinal + month | غدوة 15 مارس |
ORDINAL |
Arabic ordinal words | تاني تالت أول |
FRACTION |
Arabic fraction words | نص ربع تلت |
PERCENT |
% suffix or بالمئة |
20% |
PHONE |
Phone number patterns | +212661234567 |
EMAIL |
Contains @ and . |
user@gmail.com |
URL |
Starts with http or www. |
http://google.com |
ADDRESS |
Address keyword + following word | زنقة الحسن |
Output Modes
| Mode | Description |
|---|---|
"full" (default) |
All fields: token, index, lang, entries, stem, semantic, confidence |
"compact" |
token + lang only (no entries/stem) |
"ner" |
NER preset: entities + tokens with ner_tag |
"codeswitch" |
Code-switching preset: spans + tokens + stats |
Confidence Scoring
| Match Type | Score |
|---|---|
| Exact match | 1.0 |
| Normalized (ة→ه) | 0.95 |
| Single prefix/suffix strip | 0.85 |
| Double strip (prefix + suffix) | 0.70 |
| Semantic tag only (no lexicon match) | 0.60 |
| Unknown | 0.0 |
How It Works
-
Embedded lexicon — 1,926 Arabic-script keys (2,226 entries) compiled into the binary via
include_str!(). Zero file I/O, zero startup cost. -
O(1) HashMap lookup — exact match against a
HashMap<String, Vec<Entry>>. -
Morphological fallback — when an exact match fails, the engine strips prefixes and suffixes:
Prefixes:
الوفبلمكSuffixes:
همهاشكيNormalization:
ة→هTries: exact → normalize → single strip → double strip. Minimum stem length of 2 prevents over-stripping.
-
Semantic tagger — rule-based second pass detects 14 semantic categories via regex patterns and context-aware grouping (e.g. cardinal + currency word →
MONEY). -
NER engine — extracts span-based entities with context rules for PERSON (سيدي/لالة + next word) and LOC (شارع/زنقة/حي + next words).
-
Code-switching detector — assigns per-token language labels, groups consecutive same-language tokens into spans, and computes aggregate statistics.
-
23 thematic categories — technology, food, transportation, health, administration, clothing, home, education, sports, work, money, adjectives, family, colors, time, nature, slang, functional grammar, common verbs, common descriptions, time expressions, numbers.
Build from Source
git clone https://github.com/LaamiriOuail/darija-router.git
cd darija-router
pip install maturin
maturin develop --release
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file darija_router-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: darija_router-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 316.2 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ec5cfa1507e38b1e2cbf50c18e16c59c85e4c94f9b5c24b1d63d1295c50489c
|
|
| MD5 |
8de4c2ec8b588bdcac5bd01297f1eacd
|
|
| BLAKE2b-256 |
4123f86b5100af8a7f4d0e36cbb46405b86d884cd22f2e95dd121c4a832f893a
|
File details
Details for the file darija_router-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: darija_router-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 302.7 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55481115f1433330391d3018ad33fa0a08a73b9d26dad995a73b2441975fc77c
|
|
| MD5 |
b04de0842fdaf47f35bd33b0c5eb92d1
|
|
| BLAKE2b-256 |
013b6327577f6b1cbb2172aec29c8f4a81ab95fb9219c43e87e6a2ef09fd7168
|